github.com/k0marov/go-socnet@v0.0.0-20220715154813-90d07867c782/features/posts/delivery/http/handlers/handlers.go (about)

     1  package handlers
     2  
     3  import (
     4  	"github.com/k0marov/go-socnet/core/general/client_errors"
     5  	helpers "github.com/k0marov/go-socnet/core/helpers/http_helpers"
     6  	"net/http"
     7  	"strconv"
     8  
     9  	"github.com/k0marov/go-socnet/features/posts/delivery/http/responses"
    10  	"github.com/k0marov/go-socnet/features/posts/domain/service"
    11  	"github.com/k0marov/go-socnet/features/posts/domain/values"
    12  
    13  	"github.com/go-chi/chi/v5"
    14  )
    15  
    16  func NewDeleteHandler(deletePost service.PostDeleter) http.HandlerFunc {
    17  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    18  		user, ok := helpers.GetUserOrAddUnauthorized(w, r)
    19  		if !ok {
    20  			return
    21  		}
    22  		postId := chi.URLParam(r, "id")
    23  		if postId == "" {
    24  			helpers.ThrowClientError(w, client_errors.IdNotProvided)
    25  			return
    26  		}
    27  		err := deletePost(postId, user.Id)
    28  		if err != nil {
    29  			helpers.HandleServiceError(w, err)
    30  			return
    31  		}
    32  	})
    33  }
    34  
    35  func NewGetListByIdHandler(getPosts service.PostsGetter) http.HandlerFunc {
    36  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    37  		user, ok := helpers.GetUserOrAddUnauthorized(w, r)
    38  		if !ok {
    39  			return
    40  		}
    41  		profileId := r.URL.Query().Get("profile_id")
    42  		if profileId == "" {
    43  			helpers.ThrowClientError(w, client_errors.IdNotProvided)
    44  			return
    45  		}
    46  		posts, err := getPosts(profileId, user.Id)
    47  		if err != nil {
    48  			helpers.HandleServiceError(w, err)
    49  			return
    50  		}
    51  		helpers.WriteJson(w, responses.NewPostListResponse(posts))
    52  	})
    53  }
    54  
    55  func NewToggleLikeHandler(toggleLike service.PostLikeToggler) http.HandlerFunc {
    56  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    57  		user, ok := helpers.GetUserOrAddUnauthorized(w, r)
    58  		if !ok {
    59  			return
    60  		}
    61  		postId := chi.URLParam(r, "id")
    62  		if postId == "" {
    63  			helpers.ThrowClientError(w, client_errors.IdNotProvided)
    64  			return
    65  		}
    66  		err := toggleLike(postId, user.Id)
    67  		if err != nil {
    68  			helpers.HandleServiceError(w, err)
    69  		}
    70  	})
    71  }
    72  
    73  func NewCreateHandler(createPost service.PostCreator) http.HandlerFunc {
    74  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    75  		user, ok := helpers.GetUserOrAddUnauthorized(w, r)
    76  		if !ok {
    77  			return
    78  		}
    79  		newPost := values.NewPostData{
    80  			Author: user.Id,
    81  			Text:   r.FormValue("text"),
    82  			Images: parseImages(r),
    83  		}
    84  		err := createPost(newPost)
    85  		if err != nil {
    86  			helpers.HandleServiceError(w, err)
    87  			return
    88  		}
    89  	})
    90  }
    91  
    92  func parseImages(r *http.Request) []values.PostImageFile {
    93  	images := []values.PostImageFile{}
    94  	for i := 1; ; i++ {
    95  		file, ok := helpers.ParseFile(r, "image_"+strconv.Itoa(i))
    96  		if !ok {
    97  			return images
    98  		}
    99  		image := values.PostImageFile{File: file, Index: i}
   100  		images = append(images, image)
   101  	}
   102  }