modified: serv_nginx/api_bb/go.mod
modified: serv_nginx/api_bb/go.sum modified: serv_nginx/api_bb/internal/handlers/review_handler.go modified: serv_nginx/api_bb/pkg/middleware/auth.go fix bag with not authrizen requwest from back change key String UserIDKey to middleware.UserIDKey
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"api_bb/internal/models"
|
||||
"api_bb/internal/service"
|
||||
"api_bb/pkg/logger"
|
||||
"api_bb/pkg/middleware"
|
||||
"api_bb/pkg/utils"
|
||||
"net/http"
|
||||
"strconv"
|
||||
@@ -13,11 +14,13 @@ import (
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// ReviewHandler обрабатывает HTTP-запросы, связанные с отзывами
|
||||
type ReviewHandler struct {
|
||||
reviewService service.ReviewService
|
||||
logger logger.LoggerInterface
|
||||
reviewService service.ReviewService // Сервис для работы с отзывами
|
||||
logger logger.LoggerInterface // Логгер для записи событий
|
||||
}
|
||||
|
||||
// NewReviewHandler создает новый экземпляр ReviewHandler
|
||||
func NewReviewHandler(reviewService service.ReviewService, logger logger.LoggerInterface) *ReviewHandler {
|
||||
return &ReviewHandler{
|
||||
reviewService: reviewService,
|
||||
@@ -25,23 +28,6 @@ func NewReviewHandler(reviewService service.ReviewService, logger logger.LoggerI
|
||||
}
|
||||
}
|
||||
|
||||
func (h *ReviewHandler) Routes() chi.Router {
|
||||
r := chi.NewRouter()
|
||||
|
||||
r.Get("/", h.GetReviews)
|
||||
r.Get("/stats", h.GetReviewsStats)
|
||||
r.Get("/my", h.GetMyReviews)
|
||||
r.Post("/", h.CreateReview)
|
||||
|
||||
r.Route("/{id}", func(r chi.Router) {
|
||||
r.Get("/", h.GetReviewByID)
|
||||
r.Put("/", h.UpdateReview)
|
||||
r.Delete("/", h.DeleteReview)
|
||||
})
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
// GetReviews возвращает список отзывов с пагинацией и фильтрацией
|
||||
func (h *ReviewHandler) GetReviews(w http.ResponseWriter, r *http.Request) {
|
||||
page, _ := strconv.Atoi(r.URL.Query().Get("page"))
|
||||
@@ -85,14 +71,21 @@ func (h *ReviewHandler) GetReviewsStats(w http.ResponseWriter, r *http.Request)
|
||||
utils.RespondWithJSON(w, http.StatusOK, stats)
|
||||
}
|
||||
|
||||
// GetMyReviews возвращает отзывы текущего пользователя
|
||||
// GetMyReviews возвращает отзывы текущего аутентифицированного пользователя
|
||||
func (h *ReviewHandler) GetMyReviews(w http.ResponseWriter, r *http.Request) {
|
||||
userID, ok := r.Context().Value("userID").(uint)
|
||||
// Получаем ID пользователя из контекста (добавляется middleware аутентификации)
|
||||
userID, ok := r.Context().Value("middleware.UserIDKey").(uint)
|
||||
if !ok {
|
||||
h.logger.Warn("Failed to get userID from context in GetMyReviews",
|
||||
zap.String("path", r.URL.Path),
|
||||
zap.String("method", r.Method),
|
||||
zap.String("remote_addr", r.RemoteAddr),
|
||||
)
|
||||
utils.RespondWithError(w, http.StatusUnauthorized, "User not authenticated")
|
||||
return
|
||||
}
|
||||
|
||||
// Получаем отзывы пользователя из сервиса
|
||||
reviews, err := h.reviewService.GetUserReviews(userID)
|
||||
if err != nil {
|
||||
h.logger.With(zap.Int("userID", int(userID))).Error("Failed to get user reviews", zap.Error(err))
|
||||
@@ -103,21 +96,39 @@ func (h *ReviewHandler) GetMyReviews(w http.ResponseWriter, r *http.Request) {
|
||||
utils.RespondWithJSON(w, http.StatusOK, reviews)
|
||||
}
|
||||
|
||||
// CreateReview создает новый отзыв
|
||||
// CreateReview создает новый отзыв от имени текущего пользователя
|
||||
func (h *ReviewHandler) CreateReview(w http.ResponseWriter, r *http.Request) {
|
||||
userID, ok := r.Context().Value("userID").(uint)
|
||||
// Получаем ID пользователя из контекста
|
||||
userID, ok := r.Context().Value(middleware.UserIDKey).(uint)
|
||||
if !ok {
|
||||
h.logger.Warn("Failed to get userID from context in CreateReview",
|
||||
zap.String("path", r.URL.Path),
|
||||
zap.String("method", r.Method),
|
||||
zap.String("remote_addr", r.RemoteAddr),
|
||||
zap.Uint("userID", userID),
|
||||
)
|
||||
utils.RespondWithError(w, http.StatusUnauthorized, "User not authenticated")
|
||||
return
|
||||
}
|
||||
|
||||
h.logger.Debug("Successfully extracted userID from context",
|
||||
zap.Uint("userID", userID),
|
||||
zap.String("path", r.URL.Path),
|
||||
zap.String("method", r.Method),
|
||||
)
|
||||
|
||||
// Декодируем тело запроса
|
||||
var req models.CreateReviewRequest
|
||||
if err := utils.DecodeJSONBody(w, r, &req); err != nil {
|
||||
h.logger.Error("Failed to decode review request", zap.Error(err))
|
||||
h.logger.Error("Failed to decode review request",
|
||||
zap.Error(err),
|
||||
zap.Uint("userID", userID),
|
||||
)
|
||||
utils.RespondWithError(w, http.StatusBadRequest, "Invalid request body")
|
||||
return
|
||||
}
|
||||
|
||||
// Создаем отзыв через сервис
|
||||
review, err := h.reviewService.CreateReview(&req, userID)
|
||||
if err != nil {
|
||||
h.logger.With(zap.Int("userID", int(userID))).Error("Failed to create review", zap.Error(err))
|
||||
@@ -125,11 +136,17 @@ func (h *ReviewHandler) CreateReview(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
h.logger.Info("Review created successfully",
|
||||
zap.Uint("userID", userID),
|
||||
zap.Any("review_id", review.ID),
|
||||
)
|
||||
|
||||
utils.RespondWithJSON(w, http.StatusCreated, review)
|
||||
}
|
||||
|
||||
// GetReviewByID возвращает отзыв по ID
|
||||
// GetReviewByID возвращает отзыв по его идентификатору
|
||||
func (h *ReviewHandler) GetReviewByID(w http.ResponseWriter, r *http.Request) {
|
||||
// Получаем ID отзыва из параметров URL
|
||||
idStr := chi.URLParam(r, "id")
|
||||
id, err := strconv.ParseUint(idStr, 10, 32)
|
||||
if err != nil {
|
||||
@@ -137,6 +154,7 @@ func (h *ReviewHandler) GetReviewByID(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
// Получаем отзыв из сервиса
|
||||
review, err := h.reviewService.GetReviewByID(uint(id))
|
||||
if err != nil {
|
||||
h.logger.With(zap.Int("id", int(id))).Error("Failed to get review", zap.Error(err))
|
||||
@@ -147,16 +165,25 @@ func (h *ReviewHandler) GetReviewByID(w http.ResponseWriter, r *http.Request) {
|
||||
utils.RespondWithJSON(w, http.StatusOK, review)
|
||||
}
|
||||
|
||||
// UpdateReview обновляет отзыв
|
||||
// UpdateReview обновляет существующий отзыв
|
||||
func (h *ReviewHandler) UpdateReview(w http.ResponseWriter, r *http.Request) {
|
||||
userID, ok := r.Context().Value("userID").(uint)
|
||||
// Получаем ID пользователя из контекста
|
||||
userID, ok := r.Context().Value(middleware.UserIDKey).(uint)
|
||||
if !ok {
|
||||
h.logger.Warn("Failed to get userID from context in UpdateReview",
|
||||
zap.String("path", r.URL.Path),
|
||||
zap.String("method", r.Method),
|
||||
zap.String("remote_addr", r.RemoteAddr),
|
||||
zap.Uint("userID", userID),
|
||||
)
|
||||
utils.RespondWithError(w, http.StatusUnauthorized, "User not authenticated")
|
||||
return
|
||||
}
|
||||
|
||||
isAdmin, _ := r.Context().Value("isAdmin").(bool)
|
||||
// Получаем флаг администратора из контекста
|
||||
isAdmin, _ := r.Context().Value("IsAdmin").(bool)
|
||||
|
||||
// Получаем ID отзыва из параметров URL
|
||||
idStr := chi.URLParam(r, "id")
|
||||
id, err := strconv.ParseUint(idStr, 10, 32)
|
||||
if err != nil {
|
||||
@@ -164,13 +191,19 @@ func (h *ReviewHandler) UpdateReview(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
// Декодируем тело запроса
|
||||
var req models.UpdateReviewRequest
|
||||
if err := utils.DecodeJSONBody(w, r, &req); err != nil {
|
||||
h.logger.Error("Failed to decode update review request", zap.Error(err))
|
||||
h.logger.Error("Failed to decode update review request",
|
||||
zap.Error(err),
|
||||
zap.Uint("userID", userID),
|
||||
zap.Uint("review_id", uint(id)),
|
||||
)
|
||||
utils.RespondWithError(w, http.StatusBadRequest, "Invalid request body")
|
||||
return
|
||||
}
|
||||
|
||||
// Обновляем отзыв через сервис
|
||||
review, err := h.reviewService.UpdateReview(uint(id), &req, userID, isAdmin)
|
||||
if err != nil {
|
||||
h.logger.With(zap.Int("id", int(id))).With(zap.Int("userID", int(userID))).Error("Failed to update review", zap.Error(err))
|
||||
@@ -182,19 +215,32 @@ func (h *ReviewHandler) UpdateReview(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
h.logger.Info("Review updated successfully",
|
||||
zap.Uint("userID", userID),
|
||||
zap.Uint("review_id", uint(id)),
|
||||
)
|
||||
|
||||
utils.RespondWithJSON(w, http.StatusOK, review)
|
||||
}
|
||||
|
||||
// DeleteReview удаляет отзыв
|
||||
func (h *ReviewHandler) DeleteReview(w http.ResponseWriter, r *http.Request) {
|
||||
userID, ok := r.Context().Value("userID").(uint)
|
||||
// Получаем ID пользователя из контекста
|
||||
userID, ok := r.Context().Value(middleware.UserIDKey).(uint)
|
||||
if !ok {
|
||||
h.logger.Warn("Failed to get userID from context in DeleteReview",
|
||||
zap.String("path", r.URL.Path),
|
||||
zap.String("method", r.Method),
|
||||
zap.String("remote_addr", r.RemoteAddr),
|
||||
)
|
||||
utils.RespondWithError(w, http.StatusUnauthorized, "User not authenticated")
|
||||
return
|
||||
}
|
||||
|
||||
isAdmin, _ := r.Context().Value("isAdmin").(bool)
|
||||
// Получаем флаг администратора из контекста
|
||||
isAdmin, _ := r.Context().Value("IsAdmin").(bool)
|
||||
|
||||
// Получаем ID отзыва из параметров URL
|
||||
idStr := chi.URLParam(r, "id")
|
||||
id, err := strconv.ParseUint(idStr, 10, 32)
|
||||
if err != nil {
|
||||
@@ -202,6 +248,7 @@ func (h *ReviewHandler) DeleteReview(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
// Удаляем отзыв через сервис
|
||||
err = h.reviewService.DeleteReview(uint(id), userID, isAdmin)
|
||||
if err != nil {
|
||||
h.logger.With(zap.Int("id", int(id))).With(zap.Int("userID", int(userID))).Error("Failed to delete review", zap.Error(err))
|
||||
@@ -213,5 +260,10 @@ func (h *ReviewHandler) DeleteReview(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
h.logger.Info("Review deleted successfully",
|
||||
zap.Uint("userID", userID),
|
||||
zap.Uint("review_id", uint(id)),
|
||||
)
|
||||
|
||||
utils.RespondWithJSON(w, http.StatusOK, map[string]string{"message": "Review deleted successfully"})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user