| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // 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)
- }
|