github.com/k0marov/go-socnet@v0.0.0-20220715154813-90d07867c782/features/comments/delivery/http/handlers/handlers.go (about) 1 package handlers 2 3 import ( 4 "encoding/json" 5 "github.com/k0marov/go-socnet/core/general/client_errors" 6 "github.com/k0marov/go-socnet/core/helpers/http_helpers" 7 "net/http" 8 9 "github.com/go-chi/chi/v5" 10 "github.com/k0marov/go-socnet/features/comments/delivery/http/responses" 11 "github.com/k0marov/go-socnet/features/comments/domain/service" 12 "github.com/k0marov/go-socnet/features/comments/domain/values" 13 ) 14 15 type NewCommentRequest struct { 16 Text string `json:"text"` 17 } 18 19 func NewGetCommentsHandler(getComments service.PostCommentsGetter) http.HandlerFunc { 20 return func(w http.ResponseWriter, r *http.Request) { 21 caller, ok := http_helpers.GetUserOrAddUnauthorized(w, r) 22 if !ok { 23 return 24 } 25 postId := r.URL.Query().Get("post_id") 26 if postId == "" { 27 http_helpers.ThrowClientError(w, client_errors.IdNotProvided) 28 return 29 } 30 comments, err := getComments(postId, caller.Id) 31 if err != nil { 32 http_helpers.HandleServiceError(w, err) 33 return 34 } 35 http_helpers.WriteJson(w, responses.NewCommentListResponse(comments)) 36 } 37 } 38 39 func NewCreateCommentHandler(createComment service.CommentCreator) http.HandlerFunc { 40 return func(w http.ResponseWriter, r *http.Request) { 41 caller, ok := http_helpers.GetUserOrAddUnauthorized(w, r) 42 if !ok { 43 return 44 } 45 postId := r.URL.Query().Get("post_id") 46 if postId == "" { 47 http_helpers.ThrowClientError(w, client_errors.IdNotProvided) 48 return 49 } 50 var commentData NewCommentRequest 51 json.NewDecoder(r.Body).Decode(&commentData) 52 newComment := values.NewCommentValue{ 53 Text: commentData.Text, 54 Author: caller.Id, 55 Post: postId, 56 } 57 createdComment, err := createComment(newComment) 58 if err != nil { 59 http_helpers.HandleServiceError(w, err) 60 return 61 } 62 http_helpers.WriteJson(w, responses.NewCommentResponse(createdComment)) 63 } 64 } 65 66 func NewToggleLikeCommentHandler(toggleLike service.CommentLikeToggler) http.HandlerFunc { 67 return func(w http.ResponseWriter, r *http.Request) { 68 caller, ok := http_helpers.GetUserOrAddUnauthorized(w, r) 69 if !ok { 70 return 71 } 72 commentId := chi.URLParam(r, "id") 73 if commentId == "" { 74 http_helpers.ThrowClientError(w, client_errors.IdNotProvided) 75 return 76 } 77 err := toggleLike(commentId, caller.Id) 78 if err != nil { 79 http_helpers.HandleServiceError(w, err) 80 return 81 } 82 } 83 } 84 85 func NewDeleteCommentHandler(delete service.CommentDeleter) http.HandlerFunc { 86 return func(w http.ResponseWriter, r *http.Request) { 87 caller, ok := http_helpers.GetUserOrAddUnauthorized(w, r) 88 if !ok { 89 return 90 } 91 commentId := chi.URLParam(r, "id") 92 if commentId == "" { 93 http_helpers.ThrowClientError(w, client_errors.IdNotProvided) 94 return 95 } 96 err := delete(commentId, caller.Id) 97 if err != nil { 98 http_helpers.HandleServiceError(w, err) 99 return 100 } 101 } 102 }