| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- // Package handlers
- package handlers
- import (
- "encoding/json"
- "net/http"
- "github.com/photoplaces/backend/internal/middleware"
- "github.com/photoplaces/backend/internal/models"
- "github.com/photoplaces/backend/internal/repository"
- "github.com/photoplaces/backend/internal/validator"
- )
- type ReviewHandler struct {
- reviewRepo *repository.ReviewRepo
- }
- func NewReviewHandler(reviewRepo *repository.ReviewRepo) *ReviewHandler {
- return &ReviewHandler{reviewRepo: reviewRepo}
- }
- func (h *ReviewHandler) List(w http.ResponseWriter, r *http.Request) {
- targetType := r.URL.Query().Get("target_type")
- targetID := r.URL.Query().Get("target_id")
- if targetType == "" || targetID == "" {
- writeError(w, http.StatusBadRequest, "target_type and target_id are required")
- return
- }
- reviews, err := h.reviewRepo.List(r.Context(), targetType, targetID)
- if err != nil {
- writeError(w, http.StatusInternalServerError, err.Error())
- return
- }
- if reviews == nil {
- reviews = []*models.Review{}
- }
- writeJSON(w, http.StatusOK, map[string]interface{}{"data": reviews})
- }
- type createReviewRequest struct {
- TargetType string `json:"target_type" validate:"required,oneof=place service"`
- TargetID string `json:"target_id" validate:"required,uuid"`
- Rating int `json:"rating" validate:"required,min=1,max=5"`
- Text *string `json:"text" validate:"omitempty,max=5000"`
- }
- func (h *ReviewHandler) Create(w http.ResponseWriter, r *http.Request) {
- userID := middleware.GetUserID(r.Context())
- var req createReviewRequest
- if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
- writeError(w, http.StatusBadRequest, "invalid request body")
- return
- }
- if err := validator.Validate(req); err != nil {
- writeValidationError(w, err)
- return
- }
- review := &models.Review{
- UserID: userID,
- TargetType: req.TargetType,
- TargetID: req.TargetID,
- Rating: req.Rating,
- Text: req.Text,
- }
- if err := h.reviewRepo.Create(r.Context(), review); err != nil {
- writeError(w, http.StatusInternalServerError, err.Error())
- return
- }
- writeJSON(w, http.StatusCreated, review)
- }
|