reviews.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. )
  9. type ReviewHandler struct {
  10. reviewRepo *repository.ReviewRepo
  11. }
  12. func NewReviewHandler(reviewRepo *repository.ReviewRepo) *ReviewHandler {
  13. return &ReviewHandler{reviewRepo: reviewRepo}
  14. }
  15. func (h *ReviewHandler) List(w http.ResponseWriter, r *http.Request) {
  16. targetType := r.URL.Query().Get("target_type")
  17. targetID := r.URL.Query().Get("target_id")
  18. if targetType == "" || targetID == "" {
  19. writeError(w, http.StatusBadRequest, "target_type and target_id are required")
  20. return
  21. }
  22. reviews, err := h.reviewRepo.List(r.Context(), targetType, targetID)
  23. if err != nil {
  24. writeError(w, http.StatusInternalServerError, err.Error())
  25. return
  26. }
  27. if reviews == nil {
  28. reviews = []*models.Review{}
  29. }
  30. writeJSON(w, http.StatusOK, map[string]interface{}{"data": reviews})
  31. }
  32. type createReviewRequest struct {
  33. TargetType string `json:"target_type"`
  34. TargetID string `json:"target_id"`
  35. Rating int `json:"rating"`
  36. Text string `json:"text"`
  37. }
  38. func (h *ReviewHandler) Create(w http.ResponseWriter, r *http.Request) {
  39. userID := middleware.GetUserID(r.Context())
  40. var req createReviewRequest
  41. if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
  42. writeError(w, http.StatusBadRequest, "invalid request body")
  43. return
  44. }
  45. if req.TargetType == "" || req.TargetID == "" || req.Rating < 1 || req.Rating > 5 {
  46. writeError(w, http.StatusBadRequest, "target_type, target_id and rating (1-5) are required")
  47. return
  48. }
  49. review := &models.Review{
  50. UserID: userID,
  51. TargetType: req.TargetType,
  52. TargetID: req.TargetID,
  53. Rating: req.Rating,
  54. Text: strPtr(req.Text),
  55. }
  56. if err := h.reviewRepo.Create(r.Context(), review); err != nil {
  57. writeError(w, http.StatusInternalServerError, err.Error())
  58. return
  59. }
  60. writeJSON(w, http.StatusCreated, review)
  61. }