package handlers import ( "net/http" "github.com/gin-gonic/gin" "github.com/google/uuid" "go.uber.org/zap" "rmser/internal/domain/account" "rmser/internal/services/recommend" "rmser/pkg/logger" ) type RecommendationsHandler struct { service *recommend.Service accountRepo account.Repository } func NewRecommendationsHandler(service *recommend.Service, accountRepo account.Repository) *RecommendationsHandler { return &RecommendationsHandler{ service: service, accountRepo: accountRepo, } } // GetRecommendations godoc // @Summary Получить список рекомендаций // @Description Возвращает сгенерированные рекомендации (проблемные зоны учета) для активного сервера // @Tags recommendations // @Produce json // @Success 200 {array} recommendations.Recommendation // @Failure 500 {object} map[string]string func (h *RecommendationsHandler) GetRecommendations(c *gin.Context) { userID := c.MustGet("userID").(uuid.UUID) // Получаем активный сервер пользователя server, err := h.accountRepo.GetActiveServer(userID) if err != nil { logger.Log.Error("Ошибка получения активного сервера", zap.Error(err)) c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to get active server"}) return } if server == nil { c.JSON(http.StatusNotFound, gin.H{"error": "no active server"}) return } // Сначала обновляем рекомендации if err := h.service.RefreshRecommendations(server.ID); err != nil { logger.Log.Error("Ошибка обновления рекомендаций", zap.Error(err)) // Не прерываем выполнение, продолжаем с текущими данными } // Затем получаем рекомендации recs, err := h.service.GetRecommendations(server.ID) if err != nil { logger.Log.Error("Ошибка получения рекомендаций", zap.Error(err)) c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, recs) }