Enhance roster management by implementing cross-role player swapping and updating player movement logic. Introduce rating checks for player roles during roster operations and ensure proper handling of captain assignments. Update frontend components to reflect changes in player movement capabilities.
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:44:30 +03:00
parent f468f9df82
commit 23ba04beef
4 changed files with 107 additions and 12 deletions

View File

@@ -147,7 +147,24 @@ func (s *Service) SwapRoster(ctx context.Context, actor domain.Account, eventID,
if roster.Version != expectedVersion {
return roster, fmt.Errorf("%w: stale roster version", domain.ErrConflict)
}
if err = roster.Swap(teamA, playerA, teamB, playerB); err != nil {
roleA, roleB := rosterPlayerRole(roster, teamA, playerA), rosterPlayerRole(roster, teamB, playerB)
players, err := s.Store.ListPlayers(ctx)
if err != nil {
return roster, err
}
ratingAForB, ratingBForA := 0, 0
for _, player := range players {
if player.ID == playerA {
ratingAForB = ratingForRole(player, roleB)
}
if player.ID == playerB {
ratingBForA = ratingForRole(player, roleA)
}
}
if ratingAForB == 0 || ratingBForA == 0 {
return roster, domain.ErrNotFound
}
if err = roster.SwapAcrossRoles(teamA, playerA, teamB, playerB, ratingBForA, ratingAForB); err != nil {
return roster, err
}
roster, err = s.Store.SaveRoster(ctx, roster, expectedVersion)
@@ -170,7 +187,21 @@ func (s *Service) MoveRosterPlayer(ctx context.Context, actor domain.Account, ev
if roster.Version != expectedVersion {
return roster, fmt.Errorf("%w: stale roster version", domain.ErrConflict)
}
if err = roster.MoveToEmpty(fromTeamID, playerID, toTeamID, role); err != nil {
players, err := s.Store.ListPlayers(ctx)
if err != nil {
return roster, err
}
targetRating := 0
for _, player := range players {
if player.ID == playerID {
targetRating = ratingForRole(player, role)
break
}
}
if targetRating == 0 {
return roster, domain.ErrNotFound
}
if err = roster.MoveToEmpty(fromTeamID, playerID, toTeamID, role, targetRating); err != nil {
return roster, err
}
return s.saveRosterChange(ctx, actor, roster, expectedVersion, "roster.player_moved")
@@ -621,3 +652,17 @@ func ratingForRole(player domain.Player, role domain.Role) int {
return 0
}
}
func rosterPlayerRole(roster domain.RosterDraft, teamID, playerID string) domain.Role {
for _, team := range roster.Teams {
if team.ID != teamID {
continue
}
for _, slot := range team.Slots {
if slot.PlayerID == playerID {
return slot.Role
}
}
}
return ""
}