github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/web/comment/comment.go (about)

     1  package webcomment
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  
     7  	"github.com/ngocphuongnb/tetua/app/entities"
     8  	"github.com/ngocphuongnb/tetua/app/repositories"
     9  	"github.com/ngocphuongnb/tetua/app/server"
    10  	"github.com/ngocphuongnb/tetua/app/utils"
    11  	"github.com/ngocphuongnb/tetua/views"
    12  )
    13  
    14  func List(c server.Context) error {
    15  	paginate, err := repositories.Comment.PaginateWithPost(c.Context(), &entities.CommentFilter{
    16  		Filter: &entities.Filter{
    17  			BaseUrl:         utils.Url("/comments"),
    18  			Page:            c.QueryInt("page"),
    19  			IgnoreUrlParams: []string{"user"},
    20  		},
    21  		UserIDs: []int{c.User().ID},
    22  	})
    23  
    24  	if err != nil {
    25  		c.WithError("Something went wrong", err)
    26  	}
    27  
    28  	return c.Render(views.CommentList(paginate))
    29  }
    30  
    31  func Save(c server.Context) (err error) {
    32  	data := getCommentSaveData(c)
    33  	postID := data.PostID
    34  
    35  	if c.Messages().HasError() {
    36  		return c.Status(http.StatusBadRequest).Json(c.Messages())
    37  	}
    38  
    39  	if data.ID == 0 {
    40  		data.UserID = c.User().ID
    41  		data, err = repositories.Comment.Create(c.Context(), data)
    42  	} else {
    43  		data, err = repositories.Comment.Update(c.Context(), data)
    44  	}
    45  
    46  	if err != nil {
    47  		c.WithError("Error saving comment", err)
    48  		return c.Status(http.StatusInternalServerError).SendString("Error saving comment")
    49  	}
    50  
    51  	return c.Redirect(fmt.Sprintf("/post-%d.html#comment-%d", postID, data.ID))
    52  }
    53  
    54  func Delete(c server.Context) error {
    55  	if err := repositories.Comment.DeleteByID(c.Context(), c.ParamInt("id")); err != nil {
    56  		c.Logger().Error("Error deleting comment", err)
    57  		return c.Status(http.StatusBadRequest).Json(&entities.Message{
    58  			Type:    "error",
    59  			Message: "Error deleting comment",
    60  		})
    61  	}
    62  
    63  	return c.Status(http.StatusOK).Json(&entities.Message{
    64  		Type:    "success",
    65  		Message: "Post deleted",
    66  	})
    67  }
    68  
    69  func getCommentSaveData(c server.Context) *entities.Comment {
    70  	var err error
    71  	data := &entities.CommentMutation{}
    72  	if err = c.BodyParser(data); err != nil {
    73  		c.WithError("Error parsing body", err)
    74  
    75  		return &entities.Comment{}
    76  	}
    77  
    78  	post, err := repositories.Post.ByID(c.Context(), data.PostID)
    79  
    80  	if post == nil || err != nil {
    81  		c.WithError("Invalid post ID", err)
    82  	}
    83  
    84  	if data.ParentID > 0 {
    85  		parent, err := repositories.Comment.ByID(c.Context(), data.ParentID)
    86  
    87  		if parent == nil || err != nil {
    88  			c.WithError("Invalid parent ID", err)
    89  		}
    90  	}
    91  
    92  	if data.Content == "" {
    93  		c.Messages().AppendError("Content is required")
    94  	}
    95  
    96  	comment := &entities.Comment{
    97  		ID:       c.ParamInt("id"),
    98  		Content:  utils.SanitizeMarkdown(data.Content),
    99  		PostID:   data.PostID,
   100  		ParentID: data.ParentID,
   101  	}
   102  
   103  	if comment.ContentHTML, err = utils.MarkdownToHtml(data.Content); err != nil {
   104  		c.WithError("Error convert markdown to html", err)
   105  	}
   106  
   107  	return comment
   108  }