2025-02-12 21:26:04 +08:00
|
|
|
package services
|
|
|
|
|
|
|
|
import (
|
2025-02-14 22:37:28 +08:00
|
|
|
"errors"
|
2025-02-12 21:26:04 +08:00
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"git.solsynth.dev/hypernet/interactive/pkg/internal/database"
|
|
|
|
"git.solsynth.dev/hypernet/interactive/pkg/internal/models"
|
2025-02-14 22:37:28 +08:00
|
|
|
"gorm.io/gorm"
|
2025-02-12 21:26:04 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
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
|
|
|
|
|
2025-02-14 22:37:28 +08:00
|
|
|
var currentAnswer models.PollAnswer
|
2025-02-13 22:19:37 +08:00
|
|
|
if err := database.C.Model(&models.PollAnswer{}).
|
|
|
|
Where("poll_id = ? AND account_id = ?", poll.ID, answer.AccountID).
|
2025-02-14 22:37:28 +08:00
|
|
|
First(¤tAnswer).Error; err == nil {
|
|
|
|
if err := database.C.Model(¤tAnswer).
|
|
|
|
Where("id = ?", currentAnswer.ID).
|
|
|
|
Updates(&models.PollAnswer{Answer: answer.Answer}).Error; err != nil {
|
2025-02-13 22:19:37 +08:00
|
|
|
return answer, fmt.Errorf("failed to update your answer")
|
|
|
|
}
|
|
|
|
|
|
|
|
return answer, nil
|
2025-02-14 22:37:28 +08:00
|
|
|
} else if !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
|
return answer, err
|
2025-02-12 21:26:04 +08:00
|
|
|
}
|
2025-02-14 22:37:28 +08:00
|
|
|
|
2025-02-12 21:26:04 +08:00
|
|
|
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
|
2025-02-13 21:30:14 +08:00
|
|
|
if err := database.C.Where("poll_id = ?", poll.ID).Find(&answers).Error; err != nil {
|
2025-02-12 21:26:04 +08:00
|
|
|
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]++
|
|
|
|
}
|
|
|
|
|
2025-02-13 21:56:54 +08:00
|
|
|
byOptionsPercentage := make(map[string]float64)
|
|
|
|
for _, option := range poll.Options {
|
2025-02-14 23:05:19 +08:00
|
|
|
if val, ok := byOptions[option.ID]; ok {
|
|
|
|
byOptionsPercentage[option.ID] = float64(val) / float64(len(answers))
|
|
|
|
}
|
2025-02-13 21:56:54 +08:00
|
|
|
}
|
|
|
|
|
2025-02-12 21:26:04 +08:00
|
|
|
return models.PollMetric{
|
2025-02-13 21:56:54 +08:00
|
|
|
TotalAnswer: int64(len(answers)),
|
|
|
|
ByOptions: byOptions,
|
|
|
|
ByOptionsPercentage: byOptionsPercentage,
|
2025-02-12 21:26:04 +08:00
|
|
|
}
|
|
|
|
}
|