// Package handlers package handlers import ( "encoding/json" "net/http" "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/middleware" "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/models" "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/repository" "gogs.fxtmmsk.ru/foxtime/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", nil) return } reviews, err := h.reviewRepo.List(r.Context(), targetType, targetID) if err != nil { writeError(w, http.StatusInternalServerError, "failed to list reviews", err) 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()) r.Body = http.MaxBytesReader(w, r.Body, maxRequestBodySize) var req createReviewRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeError(w, http.StatusBadRequest, "invalid request body", err) 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, "failed to create review", err) return } writeJSON(w, http.StatusCreated, review) }