reviews.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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")
  22. return
  23. }
  24. reviews, err := h.reviewRepo.List(r.Context(), targetType, targetID)
  25. if err != nil {
  26. writeError(w, http.StatusInternalServerError, err.Error())
  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. var req createReviewRequest
  43. if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
  44. writeError(w, http.StatusBadRequest, "invalid request body")
  45. return
  46. }
  47. if err := validator.Validate(req); err != nil {
  48. writeValidationError(w, err)
  49. return
  50. }
  51. review := &models.Review{
  52. UserID: userID,
  53. TargetType: req.TargetType,
  54. TargetID: req.TargetID,
  55. Rating: req.Rating,
  56. Text: req.Text,
  57. }
  58. if err := h.reviewRepo.Create(r.Context(), review); err != nil {
  59. writeError(w, http.StatusInternalServerError, err.Error())
  60. return
  61. }
  62. writeJSON(w, http.StatusCreated, review)
  63. }