package handlers import ( "gerald/internal/interfaces/rest/models" "gerald/internal/interfaces/rest/restapi/operations/feedback" dmodels "gerald/internal/models" "gerald/internal/services" "github.com/go-openapi/runtime/middleware" "github.com/go-openapi/strfmt" "github.com/rs/zerolog" ) type FeedbackHandler struct { feedback *services.FeedbackService logger zerolog.Logger } func NewFeedbackHandler( feedback *services.FeedbackService, logger zerolog.Logger, ) *FeedbackHandler { return &FeedbackHandler{ feedback: feedback, logger: logger, } } func (h *FeedbackHandler) CreateFeedback(params feedback.CreateFeedbackParams) middleware.Responder { err := h.feedback.Create(params.SessionUUID, params.Body) if err != nil { h.logger.Error().Err(err).Msg("Cannot create feedback") return feedback.NewCreateFeedbackForbidden() } return feedback.NewCreateFeedbackOK() } func (h *FeedbackHandler) GetFeedbacks(params feedback.GetFeedbacksParams) middleware.Responder { feedbacks, err := h.feedback.GetBySessionID(params.SessionUUID) if err != nil { h.logger.Error().Err(err).Msg("Cannot get feedbacks") return feedback.NewGetFeedbacksForbidden() } return feedback.NewGetFeedbacksOK().WithPayload(feedbacksToAPI(feedbacks)) } func (h *FeedbackHandler) GetFeedback(params feedback.GetFeedbacksForProjectParams) middleware.Responder { feedbacks, err := h.feedback.GetByProjectID(params.ProjectID) if err != nil { h.logger.Error().Err(err).Msg("Cannot get feedbacks") return feedback.NewGetFeedbacksForProjectForbidden() } return feedback.NewGetFeedbacksForProjectOK().WithPayload(feedbacksToAPI(feedbacks)) } func (h *FeedbackHandler) VoteFeedback(params feedback.UpvoteFeedbackParams) middleware.Responder { err := h.feedback.Vote(params.SessionUUID, params.FeedbackUUID, params.Action) if err != nil { h.logger.Error().Err(err).Msg("Cannot vote feedback") return feedback.NewUpvoteFeedbackForbidden() } return feedback.NewUpvoteFeedbackOK() } func (h *FeedbackHandler) GetFeedbacksForProject(params feedback.GetFeedbacksForProjectParams) middleware.Responder { feedbacks, err := h.feedback.GetByProjectID(params.ProjectID) if err != nil { h.logger.Error().Err(err).Msg("Cannot get feedbacks") return feedback.NewGetFeedbacksForProjectForbidden() } return feedback.NewGetFeedbacksForProjectOK().WithPayload(feedbacksToAPI(feedbacks)) } func feedbacksToAPI(feedbacks []*dmodels.Feedback) []*models.Feedback { apiFeedbacks := make([]*models.Feedback, 0, len(feedbacks)) for _, f := range feedbacks { apiFeedbacks = append(apiFeedbacks, feedbackToAPI(f)) } return apiFeedbacks } func feedbackToAPI(feedback *dmodels.Feedback) *models.Feedback { var upvoted bool for _, upvote := range feedback.Upvote { if upvote.SessionUUID == feedback.SessionUUID { upvoted = true break } } return &models.Feedback{ FeedbackUUID: feedback.UUID, SessionUUID: feedback.SessionUUID, ProjectID: feedback.ProjectID, Text: feedback.Text, Type: string(feedback.Type), UserID: feedback.UserID, Upvotes: int64(len(feedback.Upvote)), Upvoted: upvoted, CreatedAt: strfmt.DateTime(feedback.CreatedAt), } }