152 lines
4.4 KiB
Go
152 lines
4.4 KiB
Go
package state
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
RoleParticipant = "participant"
|
|
RoleViewer = "viewer"
|
|
|
|
RevealModeManual = "manual"
|
|
RevealModeAutoAll = "all_voted"
|
|
)
|
|
|
|
var (
|
|
ErrRoomNotFound = errors.New("room not found")
|
|
ErrParticipantNotFound = errors.New("participant not found")
|
|
ErrUnauthorized = errors.New("unauthorized")
|
|
ErrRoomFull = errors.New("room is full")
|
|
ErrInvalidRole = errors.New("invalid role")
|
|
ErrSpectatorsBlocked = errors.New("spectators are not allowed")
|
|
ErrPasswordRequired = errors.New("password required or invalid")
|
|
ErrInvalidCard = errors.New("invalid card")
|
|
)
|
|
|
|
type RoomSettings struct {
|
|
RoomName string `json:"roomName"`
|
|
MaxPeople int `json:"maxPeople"`
|
|
Cards []string `json:"cards"`
|
|
AllowSpectators bool `json:"allowSpectators"`
|
|
AnonymousVoting bool `json:"anonymousVoting"`
|
|
AutoReset bool `json:"autoReset"`
|
|
RevealMode string `json:"revealMode"`
|
|
VotingTimeoutSec int `json:"votingTimeoutSec"`
|
|
PasswordSalt string `json:"passwordSalt,omitempty"`
|
|
PasswordHash string `json:"passwordHash,omitempty"`
|
|
}
|
|
|
|
type Participant struct {
|
|
ID string `json:"id"`
|
|
Username string `json:"username"`
|
|
Role string `json:"role"`
|
|
IsAdmin bool `json:"isAdmin"`
|
|
Connected bool `json:"connected"`
|
|
HasVoted bool `json:"hasVoted"`
|
|
VoteValue string `json:"voteValue,omitempty"`
|
|
JoinedAt time.Time `json:"joinedAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type RoundState struct {
|
|
Revealed bool `json:"revealed"`
|
|
}
|
|
|
|
type persistedRoom struct {
|
|
ID string `json:"id"`
|
|
AdminToken string `json:"adminToken"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
Settings RoomSettings `json:"settings"`
|
|
Round RoundState `json:"round"`
|
|
Participants []*Participant `json:"participants"`
|
|
}
|
|
|
|
type subscriber struct {
|
|
participantID string
|
|
ch chan []byte
|
|
}
|
|
|
|
type Room struct {
|
|
ID string
|
|
AdminToken string
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
Settings RoomSettings
|
|
Round RoundState
|
|
Participants map[string]*Participant
|
|
|
|
mu sync.RWMutex
|
|
subscribers map[string]*subscriber
|
|
}
|
|
|
|
type CreateRoomInput struct {
|
|
RoomName string
|
|
CreatorUsername string
|
|
MaxPeople int
|
|
Cards []string
|
|
AllowSpectators bool
|
|
AnonymousVoting bool
|
|
AutoReset bool
|
|
RevealMode string
|
|
VotingTimeoutSec int
|
|
Password string
|
|
}
|
|
|
|
type JoinRoomInput struct {
|
|
ParticipantID string
|
|
Username string
|
|
Role string
|
|
Password string
|
|
AdminToken string
|
|
}
|
|
|
|
type CreateRoomResult struct {
|
|
RoomID string `json:"roomId"`
|
|
CreatorParticipantID string `json:"creatorParticipantId"`
|
|
AdminToken string `json:"adminToken"`
|
|
ParticipantLink string `json:"participantLink"`
|
|
AdminLink string `json:"adminLink"`
|
|
}
|
|
|
|
type JoinRoomResult struct {
|
|
ParticipantID string `json:"participantId"`
|
|
IsAdmin bool `json:"isAdmin"`
|
|
Role string `json:"role"`
|
|
Username string `json:"username"`
|
|
}
|
|
|
|
type PublicParticipant struct {
|
|
ID string `json:"id"`
|
|
Username string `json:"username"`
|
|
Role string `json:"role"`
|
|
IsAdmin bool `json:"isAdmin"`
|
|
Connected bool `json:"connected"`
|
|
HasVoted bool `json:"hasVoted"`
|
|
VoteValue string `json:"voteValue,omitempty"`
|
|
}
|
|
|
|
type RoomLinks struct {
|
|
ParticipantLink string `json:"participantLink"`
|
|
AdminLink string `json:"adminLink,omitempty"`
|
|
}
|
|
|
|
type PublicRoomState struct {
|
|
RoomID string `json:"roomId"`
|
|
RoomName string `json:"roomName"`
|
|
Cards []string `json:"cards"`
|
|
Revealed bool `json:"revealed"`
|
|
RevealMode string `json:"revealMode"`
|
|
MaxPeople int `json:"maxPeople"`
|
|
AllowSpectators bool `json:"allowSpectators"`
|
|
AnonymousVoting bool `json:"anonymousVoting"`
|
|
AutoReset bool `json:"autoReset"`
|
|
VotingTimeoutSec int `json:"votingTimeoutSec"`
|
|
Participants []PublicParticipant `json:"participants"`
|
|
SelfParticipantID string `json:"selfParticipantId"`
|
|
ViewerIsAdmin bool `json:"viewerIsAdmin"`
|
|
Links RoomLinks `json:"links"`
|
|
}
|