[Feature]: Spieler Listen Endpunkt #6
No reviewers
Labels
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: TowerDefence/Server#6
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "TD-34-spieler-listen-endpunkt"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ticket
TD-34
Beschreibung
Ich habe den endpunkt implementiert, um alle players zu getten. Und ich habe die Tests implementiert, um diesen Endpunkt auf seine funktionalitäten auf ihre korrektheit zu überprüfen.
Weitere Infos
No response
[Feature]: Spieler Listen Endpunktto WIP: [Feature]: Spieler Listen EndpunktWIP: [Feature]: Spieler Listen Endpunktto [Feature]: Spieler Listen EndpunktDie Commit Historie ist nicht Sauber
@ -39,0 +60,4 @@
Pageable pageable = PageRequest.of(page, pageSize, Sort.by(direction, sortBy));
Page<Player> playerPage = (username != null && !username.trim().isEmpty())
? playerRepository.findByUsernameContainingIgnoreCase(username, pageable)
Bitte keine Tenaries nutzen, die machen Code unleserlicher, indem sie Logik hinter magic verstecken
@ -38,1 +53,4 @@
}
@Override
public ResponseEntity<List<PlayerApiModel>> getAllPlayers(Integer page, Integer pageSize, String sortBy,
Bitte einmal Formatieren
@ -149,0 +193,4 @@
schema:
type: string
enum: [asc, desc]
default: "asc"
Enums in OAS sollten kein defautl haben
@ -149,0 +192,4 @@
required: false
schema:
type: string
enum: [asc, desc]
Bitte keine abkürzungen.
@ -149,0 +166,4 @@
description: "Returns a paginated list of players, optionally filtered by username."
parameters:
- name: page
in: query
bitte nutze einen request Body und nicht query parameter dafür
@ -149,0 +172,4 @@
schema:
type: integer
default: 0
- name: pageSize
bitte nutze einen request Body und nicht query parameter dafür
@ -149,0 +179,4 @@
schema:
type: integer
default: 10
- name: sortBy
bitte nutze einen request Body und nicht query parameter dafür
@ -149,0 +186,4 @@
schema:
type: string
default: "username"
- name: order
bitte nutze einen request Body und nicht query parameter dafür
e04371373a
to35b8c33582
@ -59,2 +59,4 @@
required:
- username
#############################################
# PlayerApiModel #
Bitte nenne es
AdministratablePlayer
API und Model haben nichts in den Namen der Daten zu tuhen, außer wir senden eine API in der API
@ -39,0 +60,4 @@
Pageable pageable = PageRequest.of(page, pageSize, Sort.by(direction, sortBy));
Page<Player> playerPage = (username != null && !username.trim().isEmpty())
? playerRepository.findByUsernameContainingIgnoreCase(username, pageable)
Keine Tenaries nutzen, sind zu viel Magic und machen Code unleserlich
@ -39,0 +65,4 @@
List<PlayerApiModel> playersMapped = playerMapperService.mapPlayerToApiPlayers(playerPage.getContent());
return playersMapped.isEmpty() ? ResponseEntity.noContent().build() : ResponseEntity.ok(playersMapped);
Keine Tenaries nutzen, sind zu viel Magic und machen Code unleserlich
@ -0,0 +10,4 @@
@Component
public class PlayerMapperService {
public List<PlayerApiModel> mapPlayerToApiPlayers(List<Player> players) {
Bitte in 2 Funktionen splitten
mapPlayerToAdministratablePlayer
<-- Für einen SpielerFür mehrere Spieler ->
mapPlayersToAdministratablePlayers
, welche die erste benutzt und den for loop hat@ -29,2 +34,4 @@
void setUp() {
playerRepository.deleteAll();
Player player1 = new Player();
Bitte einen Map und einen Loop nutzen für das Anlegen.
Dies würde den code lesbarer machen
@ -31,0 +50,4 @@
this.playerRepository.save(player2);
System.out.println("LISTE: " + playerRepository.findAll());
Log entfernen, hat hier nix zu suchen.
e388bb0020
to58c2037443
58c2037443
to440160980d
440160980d
to2740cc53be
@ -61,0 +72,4 @@
#############################################
# GetAllPlayersConfigurationData #
#############################################
GetAllPlayersConfigurationData:
Bitte nenne es
PlayerFilter
@ -61,0 +78,4 @@
properties:
page:
type: integer
default: 0
Keine Default Wertte
@ -61,0 +82,4 @@
description: "Page number (zero-based index)."
pageSize:
type: integer
default: 10
Keine Default Werte
@ -61,0 +86,4 @@
description: "Number of players per page."
sortBy:
type: string
default: "username"
Keine Default Wete
@ -61,0 +94,4 @@
description: "Sorting order (asc or desc)."
username:
type: string
description: "Filter players by username (case-insensitive, partial match)."
page, pagesize, order sollten pflicht felder sein.
@ -149,0 +195,4 @@
application/json:
schema:
$ref: "#/components/schemas/GetAllPlayersConfigurationData"
tags:
Bitte direkt nach der operationID schreiben, für einheitlichkeit
@ -39,0 +56,4 @@
@Override
public ResponseEntity<List<AdministratablePlayer>> getAllPlayers(GetAllPlayersConfigurationData body) {
var order = body.getOrder();
Wir nutzen das
var
Keyword nicht, weil es seine Unsicherheiten hat@ -39,0 +62,4 @@
var sortBy = body.getSortBy();
var username = body.getUsername();
if (order == null) {
Keine Default Werte für die Order.
Sollte required sein in der API.
Das Frontend wird ja auch einen Default anzeigen und somit setzten.
Es ist also aufgabe des Frontends dieses Festzulegen und nicht des Servers
@ -39,0 +67,4 @@
}
Sort.Direction direction;
if (order == GetAllPlayersConfigurationData.OrderEnum.ASCENDING) {
Für dieses mapping, bitte einen Mapper anlegen
@ -39,0 +77,4 @@
Page<Player> playerPage;
if (username != null && !username.trim().isEmpty()) {
Dieser Endpunkt ist immer Paged, deswegen wird dieses If nicht benötigt und die API Spec sollte es auch wieder spiegeln. (Siehe andere Nachricht)
@ -39,0 +87,4 @@
playerMapperService.mapPlayersToAdministratablePlayers(playerPage.getContent());
if (playersMapped.isEmpty()) {
return ResponseEntity.noContent().build();
No Content ist ein 204 der für Post und Put Requests genutzt wird und nicht für Get Requests.
Außerdem sollte einfach eine leere Page returned werden, wenn es keine Spieler gibt (Ein Leerer Array ist immer noch ein Valider JSON Array)
@ -0,0 +11,4 @@
public class PlayerMapperService {
public List<AdministratablePlayer> mapPlayersToAdministratablePlayers(List<Player> players) {
List<AdministratablePlayer> apiPlayers = new ArrayList<>();
Variable name ist noch falsch
@ -0,0 +13,4 @@
public List<AdministratablePlayer> mapPlayersToAdministratablePlayers(List<Player> players) {
List<AdministratablePlayer> apiPlayers = new ArrayList<>();
for (Player player : players) {
AdministratablePlayer apiPlayer = new AdministratablePlayer();
Variable name ist noch falsch
@ -31,0 +49,4 @@
} catch (NoSuchAlgorithmException e) {
System.err.println("Error setting password for player: " + username);
}
});
Statt dem Save oben, hier direkt nach dem loop einmal ein Save und Flush ausführen:
@ -0,0 +19,4 @@
@Test
void playersExist() throws Exception {
String requestBody = "{" +
Nope, wir schreiben kein Raw JSON.
https://git.euph.dev/SZUT/ProjectManagmentTool/src/branch/trunk/src/test/java/de/hmmh/pmt/project/CreateTest.java#L102
Mithilfe eines Object Mappers kannst du die passenden Objekte direkt in JSON umwandeln, ohne dabei das Problem zu haben, dass du potenziell invalides JSON schreibst.
Außerdem erhöht es die lesbarkeit des Codes
35b538c7ef
to1e8c15d52f
Perfekt, hat mir richtig gut gefallen, musste aber selber lesen. 1/5 Sternen
1e8c15d52f
to68ac0e6e5d
New commits pushed, approval review dismissed automatically according to repository settings
68ac0e6e5d
tof6ac586f28
f6ac586f28
to417739e6b0
veraltet