Files
gerald/internal/services/feedback.go
aspasskiy a5466f6bff
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
get features
2024-04-22 21:44:22 +03:00

59 lines
1.4 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.Type,
feedback.Text,
models.FeedbackType(feedback.ProjectID)),
)
}
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))
}