Display results

This commit is contained in:
Vojtěch Káně
2021-04-01 16:36:38 +02:00
parent de28e7ab8c
commit 688f87922d
6 changed files with 142 additions and 6 deletions

View File

@@ -7,6 +7,7 @@ import (
"database/sql"
"errors"
"github.com/google/uuid"
"sort"
"time"
"vkane.cz/tinyquiz/pkg/codeGenerator"
"vkane.cz/tinyquiz/pkg/model/ent"
@@ -305,6 +306,75 @@ func (m *Model) SaveAnswer(playerId uuid.UUID, choiceId uuid.UUID, now time.Time
}
}
type PlayerResult struct {
Player *ent.Player
place uint64
correct int64
}
func (r PlayerResult) Points() int64 {
return r.correct
}
func (r PlayerResult) Place() uint64 {
return r.place
}
func (m *Model) GetResults(playerId uuid.UUID, c context.Context) ([]PlayerResult, *ent.Session, *ent.Player, error) {
tx, err := m.c.BeginTx(c, &sql.TxOptions{
Isolation: sql.LevelRepeatableRead,
ReadOnly: true,
})
if err != nil {
return nil, nil, nil, err
}
defer tx.Commit()
s, err := tx.Session.Query().WithGame().Where(session.HasPlayersWith(player.ID(playerId))).Only(c)
if ent.IsNotFound(err) {
return nil, nil, nil, NoSuchEntity
} else if err != nil {
return nil, nil, nil, err
}
p, err := tx.Player.Query().Where(player.ID(playerId)).Only(c)
if ent.IsNotFound(err) {
return nil, nil, nil, NoSuchEntity
} else if err != nil {
return nil, nil, nil, err
}
if players, err := tx.Player.Query().Where(player.HasSessionWith(session.ID(s.ID))).Where(player.Organiser(false)).Order(ent.Asc(player.FieldName)).WithAnswers(func(q *ent.AnswerQuery) { q.WithChoice() }).All(c); err == nil {
var results = make([]PlayerResult, 0, len(players))
for _, p := range players {
var res PlayerResult
res.Player = p
for _, a := range p.Edges.Answers {
if a.Edges.Choice.Correct {
res.correct++
}
}
results = append(results, res)
}
sort.SliceStable(results, func(i, j int) bool { return results[i].correct > results[j].correct }) // sort in reverse
if len(results) > 0 {
results[0].place = 1
}
var place uint64 = 2
for i := 1; i < len(results); i++ {
if results[i].Points() == results[i-1].Points() {
results[i].place = results[i-1].place
} else {
results[i].place = place
}
place++
}
return results, s, p, nil
} else {
return nil, nil, nil, err
}
}
const codeRandomPartLength uint8 = 3
func (m *Model) getCodeIncremental(c context.Context) (uint64, error) {

View File

@@ -1,21 +1,22 @@
package rtcomm
type StateUpdate struct {
Players []Player `json:"players"`
Players []Player `json:"players,omitempty"`
Question *QuestionUpdate `json:"question,omitempty"`
Results bool `json:"results,omitempty"`
}
type Player struct {
Organiser bool `json:"organiser"`
Name string `json:"name"`
Organiser bool `json:"organiser"`
Name string `json:"name"`
}
type QuestionUpdate struct {
Title string `json:"title"`
Title string `json:"title"`
Answers []Answer `json:"answers"`
}
type Answer struct{
ID string `json:"id"`
type Answer struct {
ID string `json:"id"`
Title string `json:"title"`
}