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  }