Add team renaming functionality to API and frontend. Implement backend logic for renaming teams, including validation and synchronization with event rosters. Update frontend components to allow team name editing and ensure proper state management. Enhance translations and styles for new features.
Some checks failed
CI / backend (push) Has been cancelled
CI / frontend (push) Has been cancelled
CI / compose (push) Has been cancelled

This commit is contained in:
2026-07-19 02:36:40 +03:00
parent 1a5a39baf0
commit f468f9df82
10 changed files with 153 additions and 3 deletions

View File

@@ -96,6 +96,7 @@ func New(service *application.Service, store application.Store, hub *realtime.Hu
api.Post("/api/events/{eventID}/workflow/back", s.revertWorkflowStage)
api.Post("/api/events/{eventID}/start", s.startScrim)
api.Put("/api/teams/{teamID}/captain", s.assignCaptain)
api.Put("/api/teams/{teamID}/name", s.renameTeam)
api.Post("/api/rulesets", s.saveRuleset)
api.Get("/api/rulesets", s.listRulesets)
api.Get("/api/rulesets/{id}", s.getRuleset)
@@ -379,6 +380,18 @@ func (s *Server) assignCaptain(w http.ResponseWriter, r *http.Request) {
respond(w, out, err, 200)
}
func (s *Server) renameTeam(w http.ResponseWriter, r *http.Request) {
var in struct {
Name string `json:"name"`
}
if !decode(w, r, &in) {
return
}
id := who(r)
out, err := s.service.RenameTeam(r.Context(), id.account, id.player, chi.URLParam(r, "teamID"), in.Name)
respond(w, out, err, http.StatusOK)
}
func (s *Server) saveRuleset(w http.ResponseWriter, r *http.Request) {
if err := requireStaff(r); err != nil {
writeError(w, err)

View File

@@ -476,6 +476,52 @@ func (s *Store) ListTeams(ctx context.Context, eventID string) ([]domain.Team, e
return out, rows.Err()
}
func (s *Store) GetTeam(ctx context.Context, teamID string) (domain.Team, error) {
var team domain.Team
var body []byte
err := s.pool.QueryRow(ctx, `SELECT id,event_id,name,COALESCE(captain_player_id,''),slots FROM teams WHERE id=$1`, teamID).
Scan(&team.ID, &team.EventID, &team.Name, &team.CaptainPlayerID, &body)
if err == nil {
err = json.Unmarshal(body, &team.Slots)
}
return team, mapError(err)
}
func (s *Store) RenameTeam(ctx context.Context, teamID, name string) (domain.Team, error) {
tx, err := s.pool.Begin(ctx)
if err != nil {
return domain.Team{}, err
}
defer tx.Rollback(ctx)
var eventID string
if err = tx.QueryRow(ctx, `UPDATE teams SET name=$2 WHERE id=$1 RETURNING event_id`, teamID, name).Scan(&eventID); err != nil {
return domain.Team{}, mapError(err)
}
var rosterBody []byte
err = tx.QueryRow(ctx, `SELECT body FROM event_rosters WHERE event_id=$1`, eventID).Scan(&rosterBody)
if err == nil {
var roster domain.RosterDraft
if err = json.Unmarshal(rosterBody, &roster); err != nil {
return domain.Team{}, err
}
for index := range roster.Teams {
if roster.Teams[index].ID == teamID {
roster.Teams[index].Name = name
}
}
rosterBody, _ = json.Marshal(roster)
if _, err = tx.Exec(ctx, `UPDATE event_rosters SET body=$2,updated_at=now() WHERE event_id=$1`, eventID, rosterBody); err != nil {
return domain.Team{}, err
}
} else if !errors.Is(err, pgx.ErrNoRows) {
return domain.Team{}, err
}
if err = tx.Commit(ctx); err != nil {
return domain.Team{}, err
}
return s.GetTeam(ctx, teamID)
}
func (s *Store) AssignCaptain(ctx context.Context, teamID, playerID string) (domain.Team, error) {
var eventID string
if err := s.pool.QueryRow(ctx, `SELECT event_id FROM teams WHERE id=$1 AND slots @> $2::jsonb`, teamID, fmt.Sprintf(`[{"playerId":%q}]`, playerID)).Scan(&eventID); err != nil {