Skip to content
answer.go 1.25 KiB
Newer Older
Lo^2's avatar
Lo^2 committed
package model

import (
	"code.electrolab.fr/it/vote.electrolab.fr/service/db"
	"context"
	"fmt"
	"math/rand"
	"time"
)

type Answer struct {
	QuestionName string
	Name         string
	Position     int
	Checked      bool
	Sentence     string
	VoteCount    int
}

func FetchAnswers(ctx context.Context, db db.Service, questionName string) ([]*Answer, error) {
	var result []*Answer
	q := `
		SELECT
			question_name,
			name,
			position,
			checked,
			sentence,
			vote_count
		FROM answers
		WHERE question_name = $1
	`
	rows, err := db.QueryContext(ctx, q, questionName)
	if err != nil {
		return nil, fmt.Errorf("Error fetching answers: %w", err)
	}
	defer rows.Close()

	for rows.Next() {
		answer := new(Answer)
		err = rows.Scan(
			&answer.QuestionName,
			&answer.Name,
			&answer.Position,
			&answer.Checked,
			&answer.Sentence,
			&answer.VoteCount,
		)
		if err != nil {
			return nil, fmt.Errorf("Error fetching answers: %w", err)
		}
		result = append(result, answer)
	}
	return result, nil
}

// Pseudorandom shuffle to prevent order bias in answers
func ShuffleAnswers(answers []*Answer) {
	rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
	for i := len(answers) - 1; i > 0; i-- {
		j := rnd.Intn(i + 1)
		answers[i], answers[j] = answers[j], answers[i]
	}
}