109 lines
2.2 KiB
Go
109 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// A Choice is a ranking of a game in a vote
|
|
type GameChoice struct {
|
|
Team string // UUID of team
|
|
Rank int
|
|
}
|
|
|
|
// A Vote is a collection of game rankings
|
|
type Vote struct {
|
|
Timestamp time.Time
|
|
ClientId string // UUID of client
|
|
Choices []GameChoice
|
|
}
|
|
|
|
func dbGetAllVotes() []Vote {
|
|
var ret []Vote
|
|
var err error
|
|
if err = db.OpenDB(); err != nil {
|
|
return ret
|
|
}
|
|
defer db.CloseDB()
|
|
|
|
votesBkt := []string{"votes"}
|
|
var clients []string
|
|
if clients, err = db.GetBucketList(votesBkt); err != nil {
|
|
// Couldn't get the list of clients
|
|
return ret
|
|
}
|
|
for _, clid := range clients {
|
|
ret = append(ret, dbGetClientVotes(clid)...)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func dbGetClientVotes(clientId string) []Vote {
|
|
var ret []Vote
|
|
var err error
|
|
if err = db.OpenDB(); err != nil {
|
|
return ret
|
|
}
|
|
defer db.CloseDB()
|
|
|
|
var times []string
|
|
votesBkt := []string{"votes", clientId}
|
|
if times, err = db.GetBucketList(votesBkt); err != nil {
|
|
return ret
|
|
}
|
|
for _, t := range times {
|
|
var tm time.Time
|
|
if tm, err = time.Parse(time.RFC3339, t); err == nil {
|
|
var vt *Vote
|
|
if vt, err = dbGetVote(clientId, tm); err == nil {
|
|
ret = append(ret, *vt)
|
|
}
|
|
}
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func dbGetVote(clientId string, timestamp time.Time) (*Vote, error) {
|
|
var err error
|
|
if err = db.OpenDB(); err != nil {
|
|
return nil, err
|
|
}
|
|
defer db.CloseDB()
|
|
|
|
vt := new(Vote)
|
|
vt.Timestamp = timestamp
|
|
vt.ClientId = clientId
|
|
votesBkt := []string{"votes", clientId, timestamp.Format(time.RFC3339)}
|
|
var choices []string
|
|
if choices, err = db.GetBucketList(votesBkt); err != nil {
|
|
// Couldn't find the vote...
|
|
return nil, err
|
|
}
|
|
for _, v := range choices {
|
|
ch := new(GameChoice)
|
|
var rank int
|
|
if rank, err = strconv.Atoi(v); err == nil {
|
|
ch.Rank = rank
|
|
ch.Team, err = db.GetValue(votesBkt, v)
|
|
}
|
|
if err == nil {
|
|
vt.Choices = append(vt.Choices, *ch)
|
|
}
|
|
}
|
|
return vt, nil
|
|
}
|
|
|
|
func dbSaveVote(clientId string, timestamp time.Time, votes []string) error {
|
|
var err error
|
|
if err = db.OpenDB(); err != nil {
|
|
return nil
|
|
}
|
|
defer db.CloseDB()
|
|
// Make sure we don't clobber a duplicate vote
|
|
votesBkt := []string{"votes", clientId, timestamp.Format(time.RFC3339)}
|
|
for i := range votes {
|
|
db.SetValue(votesBkt, strconv.Itoa(i), votes[i])
|
|
}
|
|
return err
|
|
}
|