57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package services
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.solsynth.dev/hypernet/interactive/pkg/internal/database"
|
|
"git.solsynth.dev/hypernet/interactive/pkg/internal/models"
|
|
)
|
|
|
|
func NewPoll(poll models.Poll) (models.Poll, error) {
|
|
if err := database.C.Create(&poll).Error; err != nil {
|
|
return poll, err
|
|
}
|
|
return poll, nil
|
|
}
|
|
|
|
func UpdatePoll(poll models.Poll) (models.Poll, error) {
|
|
if err := database.C.Save(&poll).Error; err != nil {
|
|
return poll, err
|
|
}
|
|
return poll, nil
|
|
}
|
|
|
|
func AddPollAnswer(poll models.Poll, answer models.PollAnswer) (models.PollAnswer, error) {
|
|
answer.PollID = poll.ID
|
|
|
|
var count int64
|
|
if err := database.C.Model(&models.PollAnswer{}).Where("poll_id = ? AND account_id = ?", poll.ID, answer.AccountID).Count(&count).Error; err != nil {
|
|
return answer, fmt.Errorf("you already answered the poll")
|
|
}
|
|
if err := database.C.Create(&answer).Error; err != nil {
|
|
return answer, err
|
|
}
|
|
|
|
return answer, nil
|
|
}
|
|
|
|
func GetPollMetric(poll models.Poll) models.PollMetric {
|
|
var answers []models.PollAnswer
|
|
if err := database.C.Where("poll_id = ?", poll.ID).Find(&answers); err != nil {
|
|
return models.PollMetric{}
|
|
}
|
|
|
|
byOptions := make(map[string]int64)
|
|
for _, answer := range answers {
|
|
if _, ok := byOptions[answer.Answer]; !ok {
|
|
byOptions[answer.Answer] = 0
|
|
}
|
|
byOptions[answer.Answer]++
|
|
}
|
|
|
|
return models.PollMetric{
|
|
TotalAnswer: int64(len(answers)),
|
|
ByOptions: byOptions,
|
|
}
|
|
}
|