package services import ( "errors" apiModels "gerald/internal/interfaces/rest/models" "gerald/internal/models" "gerald/repo/pg" ) type FeedbackService struct { db *pg.DB } func NewFeedbackService(db *pg.DB) *FeedbackService { return &FeedbackService{ db: db, } } func (f *FeedbackService) Create(sessionID string, feedback *apiModels.Feedback) error { return f.db.Feedback.Create( models.NewFeedback( feedback.UserID, sessionID, feedback.Text, feedback.ProjectID, models.FeedbackType(feedback.Type), )) } func (f *FeedbackService) GetBySessionID(sessionID string) ([]*models.Feedback, error) { return f.db.Feedback.GetBySessionID(sessionID) } func (f *FeedbackService) GetByProjectID(projectID string) ([]*models.Feedback, error) { return f.db.Feedback.GetByProjectID(projectID) } func (f *FeedbackService) Upvote(sessionID, feedbackUUID string) error { feedback, err := f.db.Feedback.GetByUUID(feedbackUUID) if err != nil { return err } // check if project type is feature if feedback.Type != models.FeedbackTypeFeature { return errors.New("only feature tickets can be upvoted") } // check if user has already upvoted for _, upvote := range feedback.Upvote { if upvote.SessionUUID == sessionID { return errors.New("user has already upvoted") } } return f.db.Feedback.CreateUpvote(models.NewUpvote(sessionID, feedbackUUID)) }