reviews.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Package handlers
  2. package handlers
  3. import (
  4. "encoding/json"
  5. "net/http"
  6. "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/middleware"
  7. "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/models"
  8. "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/repository"
  9. "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/validator"
  10. )
  11. type ReviewHandler struct {
  12. reviewRepo *repository.ReviewRepo
  13. }
  14. func NewReviewHandler(reviewRepo *repository.ReviewRepo) *ReviewHandler {
  15. return &ReviewHandler{reviewRepo: reviewRepo}
  16. }
  17. func (h *ReviewHandler) List(w http.ResponseWriter, r *http.Request) {
  18. targetType := r.URL.Query().Get("target_type")
  19. targetID := r.URL.Query().Get("target_id")
  20. if targetType == "" || targetID == "" {
  21. writeError(w, http.StatusBadRequest, "target_type and target_id are required", nil)
  22. return
  23. }
  24. reviews, err := h.reviewRepo.List(r.Context(), targetType, targetID)
  25. if err != nil {
  26. writeError(w, http.StatusInternalServerError, "failed to list reviews", err)
  27. return
  28. }
  29. if reviews == nil {
  30. reviews = []*models.Review{}
  31. }
  32. writeJSON(w, http.StatusOK, map[string]interface{}{"data": reviews})
  33. }
  34. type createReviewRequest struct {
  35. TargetType string `json:"target_type" validate:"required,oneof=place service"`
  36. TargetID string `json:"target_id" validate:"required,uuid"`
  37. Rating int `json:"rating" validate:"required,min=1,max=5"`
  38. Text *string `json:"text" validate:"omitempty,max=5000"`
  39. }
  40. func (h *ReviewHandler) Create(w http.ResponseWriter, r *http.Request) {
  41. userID := middleware.GetUserID(r.Context())
  42. r.Body = http.MaxBytesReader(w, r.Body, maxRequestBodySize)
  43. var req createReviewRequest
  44. if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
  45. writeError(w, http.StatusBadRequest, "invalid request body", err)
  46. return
  47. }
  48. if err := validator.Validate(req); err != nil {
  49. writeValidationError(w, err)
  50. return
  51. }
  52. review := &models.Review{
  53. UserID: userID,
  54. TargetType: req.TargetType,
  55. TargetID: req.TargetID,
  56. Rating: req.Rating,
  57. Text: req.Text,
  58. }
  59. if err := h.reviewRepo.Create(r.Context(), review); err != nil {
  60. writeError(w, http.StatusInternalServerError, "failed to create review", err)
  61. return
  62. }
  63. writeJSON(w, http.StatusCreated, review)
  64. }