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 }