Files
gerald/internal/services/feedback.go
aspasskiy ed403c2c72
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
upvotes
2024-04-23 19:13:48 +03:00

71 lines
1.6 KiB
Go

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) Vote(sessionID, feedbackUUID, action 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 voted")
}
switch action {
case "upvote":
// 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))
case "downvote":
// check if user has already upvoted
for _, upvote := range feedback.Upvote {
if upvote.SessionUUID == sessionID {
return f.db.Feedback.DeleteUpvoteBySessionIDAndFeedbackUUID(sessionID, feedbackUUID)
}
}
}
return nil
}