Skip to content
This repository was archived by the owner on Dec 27, 2024. It is now read-only.

Commit e125655

Browse files
dev/codeforces/ Добавил логику для Players
1 parent 1ab0f1a commit e125655

File tree

7 files changed

+153
-21
lines changed

7 files changed

+153
-21
lines changed

src/main/java/com/cf/cfteam/controllers/codeforces/PlayerController.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import com.cf.cfteam.models.entities.codeforces.Player;
44
import com.cf.cfteam.services.codeforces.PlayerService;
55
import com.cf.cfteam.transfer.payloads.codeforces.GroupPayload;
6+
import com.cf.cfteam.transfer.payloads.codeforces.PlayerPayload;
67
import com.cf.cfteam.transfer.payloads.codeforces.TeamPayload;
8+
import com.cf.cfteam.transfer.responses.codeforces.PlayerResponse;
79
import lombok.RequiredArgsConstructor;
810
import org.springframework.http.ResponseEntity;
911
import org.springframework.security.core.Authentication;
@@ -19,30 +21,32 @@ public class PlayerController {
1921
private final PlayerService playerService;
2022

2123
@GetMapping("/team/{teamId}")
22-
public ResponseEntity<List<Player>> getAllPlayersByTeam(@PathVariable Long teamId, Authentication authentication) {
23-
List<Player> players = playerService.getAllPlayersByTeam(teamId);
24+
public ResponseEntity<List<PlayerResponse>> getAllPlayersByTeam(@PathVariable Long teamId,
25+
Authentication authentication) {
26+
List<PlayerResponse> players = playerService.getAllPlayersByTeam(teamId);
2427
return ResponseEntity.ok(players);
2528
}
2629

2730
@GetMapping("/{playerId}")
28-
public ResponseEntity<Player> getPlayerById(@PathVariable Long playerId, Authentication authentication) {
29-
Player player = playerService.getPlayerById(playerId);
31+
public ResponseEntity<PlayerResponse> getPlayerById(@PathVariable Long playerId, Authentication authentication) {
32+
PlayerResponse player = playerService.getPlayerById(playerId);
3033
return ResponseEntity.ok(player);
3134
}
3235

3336
@PostMapping("/team/{teamId}")
34-
public ResponseEntity<Player> addPlayerToTeam(@PathVariable Long teamId, @RequestBody TeamPayload teamPayload,
35-
Authentication authentication) {
36-
Player player = playerService.addPlayerToTeam(teamId, teamPayload);
37+
public ResponseEntity<PlayerResponse> addPlayerToTeam(@PathVariable Long teamId,
38+
@RequestBody PlayerPayload playerPayload,
39+
Authentication authentication) {
40+
PlayerResponse player = playerService.addPlayerToTeam(teamId, playerPayload);
3741
return ResponseEntity.ok(player);
3842
}
3943

4044
@PutMapping("/players/{playerId}/teams/{teamId}")
41-
public ResponseEntity<Player> updatePlayerInTeam(@PathVariable Long playerId,
45+
public ResponseEntity<PlayerResponse> updatePlayerInTeam(@PathVariable Long playerId,
4246
@PathVariable Long teamId,
43-
@RequestBody GroupPayload groupPayload,
47+
@RequestBody PlayerPayload playerPayload,
4448
Authentication authentication) {
45-
Player player = playerService.updatePlayer(playerId, teamId, groupPayload);
49+
PlayerResponse player = playerService.updatePlayerInTeam(playerId, teamId, playerPayload);
4650
return ResponseEntity.ok(player);
4751
}
4852

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.cf.cfteam.exceptions.codeforces;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public class PlayerNotFoundException extends RuntimeException {
7+
8+
private final Long id;
9+
10+
public PlayerNotFoundException(Long id) {
11+
super("id.not_found");
12+
this.id = id;
13+
}
14+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.cf.cfteam.exceptions.codeforces;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public class PlayerNotFromTeamException extends RuntimeException {
7+
8+
private final Long teamId, playerId;
9+
10+
public PlayerNotFromTeamException(Long teamId, Long playerId) {
11+
super("player.not_from_team");
12+
this.playerId = playerId;
13+
this.teamId = teamId;
14+
}
15+
}

src/main/java/com/cf/cfteam/repositories/jpa/codeforces/PlayerRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@
33
import com.cf.cfteam.models.entities.codeforces.Player;
44
import org.springframework.data.jpa.repository.JpaRepository;
55

6+
import java.util.Optional;
7+
68
public interface PlayerRepository extends JpaRepository<Player, Long> {
9+
Optional<Player> findByLogin(String login);
710
}
Lines changed: 89 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package com.cf.cfteam.services.codeforces;
22

3+
import com.cf.cfteam.exceptions.codeforces.PlayerNotFoundException;
4+
import com.cf.cfteam.exceptions.codeforces.PlayerNotFromTeamException;
5+
import com.cf.cfteam.exceptions.codeforces.TeamNotFoundException;
36
import com.cf.cfteam.models.entities.codeforces.Player;
7+
import com.cf.cfteam.models.entities.codeforces.Team;
48
import com.cf.cfteam.repositories.jpa.codeforces.PlayerRepository;
5-
import com.cf.cfteam.transfer.payloads.codeforces.GroupPayload;
6-
import com.cf.cfteam.transfer.payloads.codeforces.TeamPayload;
9+
import com.cf.cfteam.repositories.jpa.codeforces.TeamRepository;
10+
import com.cf.cfteam.transfer.payloads.codeforces.PlayerPayload;
11+
import com.cf.cfteam.transfer.responses.codeforces.PlayerResponse;
12+
import com.cf.cfteam.utils.codeforces.mappers.PlayerMapper;
713
import lombok.RequiredArgsConstructor;
814
import org.springframework.stereotype.Service;
915

@@ -14,29 +20,102 @@
1420
public class PlayerService {
1521

1622
private final PlayerRepository playerRepository;
23+
private final TeamRepository teamRepository;
24+
private final PlayerMapper playerMapper;
1725

18-
public List<Player> getAllPlayersByTeam(Long teamId) {
19-
return null;
26+
public List<PlayerResponse> getAllPlayersByTeam(Long teamId) {
27+
var team = teamRepository.findById(teamId)
28+
.orElseThrow(() -> new TeamNotFoundException(teamId));
29+
30+
return team.getPlayers().stream()
31+
.map(playerMapper::fromEntityToResponse)
32+
.toList();
33+
}
34+
35+
public PlayerResponse getPlayerById(Long playerId) {
36+
var player = playerRepository.findById(playerId)
37+
.orElseThrow(() -> new PlayerNotFoundException(playerId));
38+
39+
return playerMapper.fromEntityToResponse(player);
2040
}
2141

22-
public Player getPlayerById(Long playerId) {
23-
return null;
42+
public PlayerResponse addPlayerToTeam(Long teamId, PlayerPayload payload) {
43+
var team = teamRepository.findById(teamId)
44+
.orElseThrow(() -> new TeamNotFoundException(teamId));
45+
46+
var player = createPlayer(payload);
47+
48+
linkTeamAndPlayer(team, player);
49+
50+
return playerMapper.fromEntityToResponse(player);
2451
}
2552

26-
public Player addPlayerToTeam(Long teamId, TeamPayload teamPayload) {
27-
return null;
53+
54+
public PlayerResponse updatePlayerInTeam(Long playerId, Long teamId, PlayerPayload payload) {
55+
var player = playerRepository.findById(playerId)
56+
.orElseThrow(() -> new PlayerNotFoundException(playerId));
57+
58+
var team = teamRepository.findById(teamId)
59+
.orElseThrow(() -> new TeamNotFoundException(teamId));
60+
61+
if (!team.getPlayers().contains(player)) {
62+
throw new PlayerNotFromTeamException(teamId, playerId);
63+
}
64+
65+
unlinkTeamAndPlayer(team, player);;
66+
player = createPlayer(payload);
67+
linkTeamAndPlayer(team, player);
68+
69+
return playerMapper.fromEntityToResponse(player);
2870
}
2971

72+
private Player createPlayer(PlayerPayload payload) {
73+
var exist = playerRepository.findByLogin(payload.login());
74+
if (exist.isPresent()) return exist.get();
3075

31-
public Player updatePlayer(Long playerId, Long teamId, GroupPayload groupPayload) {
32-
return null;
76+
Player player = playerMapper.fromPayloadToEntity(payload);
77+
return playerRepository.save(player);
3378
}
3479

3580

3681
public void deletePlayerFromTeam(Long playerId, Long teamId) {
82+
var player = playerRepository.findById(playerId)
83+
.orElseThrow(() -> new PlayerNotFoundException(playerId));
84+
85+
var team = teamRepository.findById(teamId)
86+
.orElseThrow(() -> new TeamNotFoundException(teamId));
87+
88+
unlinkTeamAndPlayer(team, player);
3789
}
3890

3991

4092
public void deleteAllPlayersFromTeam(Long teamId) {
93+
var team = teamRepository.findById(teamId)
94+
.orElseThrow(() -> new TeamNotFoundException(teamId));
95+
96+
var players = team.getPlayers();
97+
98+
players.forEach(player -> player.getTeams().remove(team));
99+
team.getPlayers().clear();
100+
101+
teamRepository.save(team);
102+
players.forEach(playerRepository::save);
103+
}
104+
105+
private void unlinkTeamAndPlayer(Team team, Player player) {
106+
team.getPlayers().remove(player);
107+
player.getTeams().remove(team);
108+
saveTeamAndPlayer(team, player);
109+
}
110+
111+
private void linkTeamAndPlayer(Team team, Player player) {
112+
team.getPlayers().add(player);
113+
player.getTeams().add(team);
114+
saveTeamAndPlayer(team, player);
115+
}
116+
117+
private void saveTeamAndPlayer(Team team, Player player) {
118+
teamRepository.save(team);
119+
playerRepository.save(player);
41120
}
42121
}

src/main/java/com/cf/cfteam/transfer/payloads/codeforces/PlayerPayload.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
import lombok.Builder;
44

55
@Builder
6-
public record PlayerPayload() {
6+
public record PlayerPayload(
7+
String login
8+
) {
79
}

src/main/java/com/cf/cfteam/utils/codeforces/mappers/PlayerMapper.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
package com.cf.cfteam.utils.codeforces.mappers;
22

3+
import com.cf.cfteam.models.entities.codeforces.Group;
34
import com.cf.cfteam.models.entities.codeforces.Player;
5+
import com.cf.cfteam.models.entities.codeforces.Team;
6+
import com.cf.cfteam.transfer.payloads.codeforces.PlayerPayload;
7+
import com.cf.cfteam.transfer.payloads.codeforces.TeamPayload;
48
import com.cf.cfteam.transfer.responses.codeforces.PlayerResponse;
9+
import com.cf.cfteam.transfer.responses.codeforces.TeamResponse;
10+
import com.cf.cfteam.utils.codeforces.RatingCalculator;
511
import com.github.benmanes.caffeine.cache.LoadingCache;
612
import lombok.RequiredArgsConstructor;
713
import org.springframework.stereotype.Component;
814

15+
import java.util.ArrayList;
16+
import java.util.List;
17+
918
@Component
1019
@RequiredArgsConstructor
1120
public class PlayerMapper {
@@ -19,4 +28,10 @@ public PlayerResponse fromEntityToResponse(Player player) {
1928
.rating(ratingCache.get(player.getLogin()))
2029
.build();
2130
}
31+
32+
public Player fromPayloadToEntity(PlayerPayload payload) {
33+
return Player.builder()
34+
.login(payload.login())
35+
.build();
36+
}
2237
}

0 commit comments

Comments
 (0)