reviews.go 2.0 KB

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