59 lines
1.4 KiB
Go
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(models.FeedbackType(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))
|
|
}
|