2025-02-12 21:26:04 +08:00

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,
}
}