Files
scrum-solitare/src/state/types.go
2026-03-05 22:08:23 +02:00

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"`
}