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.
This commit is contained in:
@@ -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 ""
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user