From 46f2cf2d55f530d544624ce22f6b29fee14999e9 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 11 Dec 2025 19:07:30 +0100 Subject: [PATCH] Added basic CRUD operations --- api/compose-dev.yaml | 60 +++++++++++++++ api/compose.yaml | 6 +- api/mongo-init/mongo-init.js | 11 +++ api/populate.json | 73 +++++++++++++++++++ .../common/exceptions/RepoException.java | 11 +++ .../{ => common}/models/Coordinate.java | 2 +- .../boardmateapi/common/models/Game.java | 72 ++++++++++++++++++ .../boardmateapi/common/models/Move.java | 46 ++++++++++++ .../common/models/MoveAttribute.java | 11 +++ .../boardmateapi/common/models/Piece.java | 17 +++++ .../configurations/AppConfigurations.java | 6 ++ .../configurations/MongoConfig.java | 23 ++++++ .../boardmateapi/configurations/Startup.java | 23 ++++++ .../controllers/PartyController.java | 39 ++++++---- .../be/naaturel/boardmateapi/models/Move.java | 13 ---- .../naaturel/boardmateapi/models/Party.java | 22 ------ .../naaturel/boardmateapi/models/Piece.java | 11 --- .../repository/CustomPartyRepo.java | 9 --- .../repository/CustomPartyRepoImpl.java | 23 ------ .../boardmateapi/repository/GameRepo.java | 9 +++ .../boardmateapi/repository/PartyDto.java | 11 --- .../boardmateapi/repository/dtos/GameDto.java | 60 +++++++++++++++ .../repository/dtos/PlayerDto.java | 17 +++++ .../repository/dtos/TimeControlDto.java | 26 +++++++ .../repository/mappings/GameMapper.java | 45 ++++++++++++ .../repository/mappings/PlayerMapper.java | 11 +++ .../mappings/TimeControlMapper.java | 14 ++++ .../boardmateapi/services/GameService.java | 47 ++++++++++++ .../boardmateapi/services/PartyService.java | 30 -------- api/src/main/resources/application.properties | 6 +- 30 files changed, 615 insertions(+), 139 deletions(-) create mode 100644 api/compose-dev.yaml create mode 100644 api/mongo-init/mongo-init.js create mode 100644 api/populate.json create mode 100644 api/src/main/java/be/naaturel/boardmateapi/common/exceptions/RepoException.java rename api/src/main/java/be/naaturel/boardmateapi/{ => common}/models/Coordinate.java (85%) create mode 100644 api/src/main/java/be/naaturel/boardmateapi/common/models/Game.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/common/models/Move.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/common/models/MoveAttribute.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/common/models/Piece.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/configurations/MongoConfig.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/configurations/Startup.java delete mode 100644 api/src/main/java/be/naaturel/boardmateapi/models/Move.java delete mode 100644 api/src/main/java/be/naaturel/boardmateapi/models/Party.java delete mode 100644 api/src/main/java/be/naaturel/boardmateapi/models/Piece.java delete mode 100644 api/src/main/java/be/naaturel/boardmateapi/repository/CustomPartyRepo.java delete mode 100644 api/src/main/java/be/naaturel/boardmateapi/repository/CustomPartyRepoImpl.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/repository/GameRepo.java delete mode 100644 api/src/main/java/be/naaturel/boardmateapi/repository/PartyDto.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/repository/dtos/GameDto.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/repository/dtos/PlayerDto.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/repository/dtos/TimeControlDto.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/repository/mappings/GameMapper.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/repository/mappings/PlayerMapper.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/repository/mappings/TimeControlMapper.java create mode 100644 api/src/main/java/be/naaturel/boardmateapi/services/GameService.java delete mode 100644 api/src/main/java/be/naaturel/boardmateapi/services/PartyService.java diff --git a/api/compose-dev.yaml b/api/compose-dev.yaml new file mode 100644 index 00000000..5f661afc --- /dev/null +++ b/api/compose-dev.yaml @@ -0,0 +1,60 @@ +services: + boardmate-api: + build: . + container_name: boardmate-api + ports: + - "8000:8080" + - "5005:5005" + environment: + SPRING_DATA_MONGODB_URI: "mongodb://board-mate-user:apx820kcng@mongodb:27017/board-mate-db" + JAVA_TOOL_OPTIONS: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" + depends_on: + - mongodb + - elasticsearch + + elasticsearch: + image: 'docker.elastic.co/elasticsearch/elasticsearch:7.17.10' + environment: + - 'ELASTIC_PASSWORD=secret' + - 'discovery.type=single-node' + - 'xpack.security.enabled=false' + ports: + - '8100:9200' + - '8101:9300' + grafana-lgtm: + image: 'grafana/otel-lgtm:latest' + ports: + - '8200:3000' + - '8201:4317' + - '8202:4318' + prometheus: + image: 'prom/prometheus:latest' + container_name: prometheus + ports: + - "8300:9090" + volumes: + - ./prometheus.yaml:/etc/prometheus/prometheus.yml + + mongodb: + image: mongo:latest + environment: + - MONGO_INITDB_DATABASE=board-mate-db + - MONGO_INITDB_ROOT_PASSWORD=secret + - MONGO_INITDB_ROOT_USERNAME=root + ports: + - "8400:27017" + volumes: + - ./mongo-data:/data/db + - ./mongo-init:/docker-entrypoint-initdb.d + #mongo-express: + # image: mongo-express:latest + # depends_on: + # - mongodb + # ports: + # - "8401:8081" + # environment: + # - ME_CONFIG_MONGODB_SERVER=mongodb + # - ME_CONFIG_MONGODB_PORT=27017 + # - ME_CONFIG_MONGODB_ADMINUSERNAME=root + # - ME_CONFIG_MONGODB_ADMINPASSWORD=secret + # - ME_CONFIG_MONGODB_AUTH_DATABASE=admin \ No newline at end of file diff --git a/api/compose.yaml b/api/compose.yaml index 17a770f2..e7c6119c 100644 --- a/api/compose.yaml +++ b/api/compose.yaml @@ -4,8 +4,6 @@ services: container_name: boardmate-api ports: - "8000:8080" - environment: - - SPRING_BOOT_DOCKER_COMPOSE_TCP_CONNECT_PORT=8080 depends_on: - mongodb - elasticsearch @@ -36,14 +34,14 @@ services: mongodb: image: mongo:latest environment: - - MONGO_INITDB_DATABASE=my-database + - MONGO_INITDB_DATABASE=board-mate-db - MONGO_INITDB_ROOT_PASSWORD=secret - MONGO_INITDB_ROOT_USERNAME=root ports: - "8400:27017" volumes: - ./mongo-data:/data/db - + - ./mongo-init:/docker-entrypoint-initdb.d #mongo-express: # image: mongo-express:latest # depends_on: diff --git a/api/mongo-init/mongo-init.js b/api/mongo-init/mongo-init.js new file mode 100644 index 00000000..0d45ce49 --- /dev/null +++ b/api/mongo-init/mongo-init.js @@ -0,0 +1,11 @@ +db = db.getSiblingDB("board-mate-db"); + +db.createCollection("games"); + +db.createUser({ + user: "board-mate-user", + pwd: "apx820kcng", + roles: [ + { role: "readWrite", db: "board-mate-db" } + ] +}); \ No newline at end of file diff --git a/api/populate.json b/api/populate.json new file mode 100644 index 00000000..f460d022 --- /dev/null +++ b/api/populate.json @@ -0,0 +1,73 @@ +[{ + "_id": { + "$oid": "6939d212ad0a2074aeab3a51" + }, + "time": { + "increment": 0, + "value": 10 + }, + "players": { + "white": { + "name": "Aude Vaiselle" + }, + "black": { + "name": "Nat Action" + } + }, + "moves": [ + "e4", + "c6", + "d4", + "d5" + ] +}, + + { + "_id": { + "$oid": "6939d09fad0a2074aeab3a4f" + }, + "time": { + "increment": 0, + "value": 10 + }, + "players": { + "white": { + "name": "Aude Vaiselle" + }, + "black": { + "name": "Nat Action" + } + }, + "moves": [ + "d4", + "d5", + "c4", + "c6" + ] + }, + + { + "_id": { + "$oid": "6939ce8cad0a2074aeab3a4e" + }, + "time": { + "increment": 0, + "value": 10 + }, + "players": { + "white": { + "name": "Aude Vaiselle" + }, + "black": { + "name": "Nat Action" + } + }, + "moves": [ + "e4", + "e5", + "kf3", + "kc6", + "d4" + ] + } +] \ No newline at end of file diff --git a/api/src/main/java/be/naaturel/boardmateapi/common/exceptions/RepoException.java b/api/src/main/java/be/naaturel/boardmateapi/common/exceptions/RepoException.java new file mode 100644 index 00000000..8f8a9872 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/common/exceptions/RepoException.java @@ -0,0 +1,11 @@ +package be.naaturel.boardmateapi.common.exceptions; + +public class RepoException extends Exception{ + public RepoException(String message, Exception innerException){ + super(message, innerException); + } + + public RepoException(String message){ + super(message); + } +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/models/Coordinate.java b/api/src/main/java/be/naaturel/boardmateapi/common/models/Coordinate.java similarity index 85% rename from api/src/main/java/be/naaturel/boardmateapi/models/Coordinate.java rename to api/src/main/java/be/naaturel/boardmateapi/common/models/Coordinate.java index fee79f38..77448c14 100644 --- a/api/src/main/java/be/naaturel/boardmateapi/models/Coordinate.java +++ b/api/src/main/java/be/naaturel/boardmateapi/common/models/Coordinate.java @@ -1,4 +1,4 @@ -package be.naaturel.boardmateapi.models; +package be.naaturel.boardmateapi.common.models; public class Coordinate { diff --git a/api/src/main/java/be/naaturel/boardmateapi/common/models/Game.java b/api/src/main/java/be/naaturel/boardmateapi/common/models/Game.java new file mode 100644 index 00000000..6264f1bb --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/common/models/Game.java @@ -0,0 +1,72 @@ +package be.naaturel.boardmateapi.common.models; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class Game { + + private final String whiteName; + private final String blackName; + private final int timeValue; + private final int increment; + private final List moves; + + public Game(String whiteName, String blackName, int timeValue, int increment) { + this(whiteName, blackName, timeValue, increment, new ArrayList<>()); + } + + public Game(String whiteName, String blackName, int timeValue, int increment, Collection moves){ + this.whiteName = whiteName; + this.blackName = blackName; + this.timeValue = timeValue; + this.increment = increment; + this.moves = new ArrayList<>(moves); + } + + public String getBlackName() { + return blackName; + } + + public String getWhiteName() { + return whiteName; + } + + public int getTimeValue(){ + return this.timeValue; + } + + public int getIncrement(){ + return this.increment; + } + + public List getMoves() { + return new ArrayList<>(moves); + } + + public void addMove(Move m) { + this.moves.add(m); + } + + public String getPGN() { + StringBuilder builder = new StringBuilder(); + int moveNumber = 1; + int movesInTurn = 1; + for(Move m : moves){ + + if(movesInTurn == 1) { + builder.append(String.format("%d.", moveNumber)); + } + builder.append(String.format(" %s", m)); + + if(movesInTurn == 2){ + moveNumber++; + movesInTurn = 1; + } else { + movesInTurn++; + } + } + return builder.toString(); + } + +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/common/models/Move.java b/api/src/main/java/be/naaturel/boardmateapi/common/models/Move.java new file mode 100644 index 00000000..cefd9d49 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/common/models/Move.java @@ -0,0 +1,46 @@ +package be.naaturel.boardmateapi.common.models; + +import java.util.Collection; +import java.util.EnumSet; +import java.util.Set; + +public class Move { + + private final Piece piece; + private final Coordinate coordinate; + private final Set attributes; + private final Piece promotionPiece; + + public Move(Piece piece, Coordinate coordinate, Collection attributes){ + this(piece, null, coordinate, attributes); + } + + public Move(Piece piece, Piece promotionPiece, Coordinate coordinate, Collection attributes){ + this.piece = piece; + this.coordinate = coordinate; + this.attributes = EnumSet.copyOf(attributes); + this.promotionPiece = promotionPiece; + } + + private boolean hasAttribute(MoveAttribute attribute){ + return attributes.contains(attribute); + } + + @Override + public String toString(){ + + if(hasAttribute(MoveAttribute.CASTLE_KINGSIDE)) return "O-O"; + if(hasAttribute(MoveAttribute.CASTLE_QUEENSIDE)) return "O-O-O"; + + StringBuilder bob = new StringBuilder(); + bob.append(piece); + if(hasAttribute(MoveAttribute.CAPTURE)) bob.append("x"); + bob.append(coordinate); + if(hasAttribute(MoveAttribute.PROMOTION) && promotionPiece != null) bob.append("=").append(promotionPiece); + if(hasAttribute(MoveAttribute.CHECKMATE)) bob.append("#"); + else if(hasAttribute(MoveAttribute.CHECK)) bob.append("+"); + + return bob.toString(); + } + +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/common/models/MoveAttribute.java b/api/src/main/java/be/naaturel/boardmateapi/common/models/MoveAttribute.java new file mode 100644 index 00000000..5d53dbd5 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/common/models/MoveAttribute.java @@ -0,0 +1,11 @@ +package be.naaturel.boardmateapi.common.models; + +public enum MoveAttribute { + NORMAL, + CAPTURE, + CHECK, + CHECKMATE, + CASTLE_KINGSIDE, + CASTLE_QUEENSIDE, + PROMOTION +} \ No newline at end of file diff --git a/api/src/main/java/be/naaturel/boardmateapi/common/models/Piece.java b/api/src/main/java/be/naaturel/boardmateapi/common/models/Piece.java new file mode 100644 index 00000000..f0133eb7 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/common/models/Piece.java @@ -0,0 +1,17 @@ +package be.naaturel.boardmateapi.common.models; + +public class Piece { + + private String notation; + private String name; + + public Piece(){ + + } + + @Override + public String toString(){ + return this.notation; + } + +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/configurations/AppConfigurations.java b/api/src/main/java/be/naaturel/boardmateapi/configurations/AppConfigurations.java index e1d0c205..a74fb049 100644 --- a/api/src/main/java/be/naaturel/boardmateapi/configurations/AppConfigurations.java +++ b/api/src/main/java/be/naaturel/boardmateapi/configurations/AppConfigurations.java @@ -15,4 +15,10 @@ public class AppConfigurations { @Value("${sec.cors.authorizedHeader}") public String[] authorizedHeaders; + @Value("${spring.data.mongodb.uri}") + public String connectionString; + + @Value("${spring.data.mongodb.database}") + public String database; + } diff --git a/api/src/main/java/be/naaturel/boardmateapi/configurations/MongoConfig.java b/api/src/main/java/be/naaturel/boardmateapi/configurations/MongoConfig.java new file mode 100644 index 00000000..3b75d257 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/configurations/MongoConfig.java @@ -0,0 +1,23 @@ +package be.naaturel.boardmateapi.configurations; + +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MongoConfig { + + private final AppConfigurations conf; + + @Autowired + public MongoConfig(AppConfigurations appConf) { + this.conf = appConf; + } + + @Bean + public MongoClient mongoClient() { + return MongoClients.create(this.conf.connectionString); + } +} \ No newline at end of file diff --git a/api/src/main/java/be/naaturel/boardmateapi/configurations/Startup.java b/api/src/main/java/be/naaturel/boardmateapi/configurations/Startup.java new file mode 100644 index 00000000..44b82a3d --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/configurations/Startup.java @@ -0,0 +1,23 @@ +package be.naaturel.boardmateapi.configurations; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class Startup { + + AppConfigurations conf; + + @Autowired + public Startup(AppConfigurations appConf) { + this.conf = appConf; + } + + @Bean + public String log(){ + System.out.println(">>> Connection string : " + conf.connectionString); + System.out.println(">>> Database : " + conf.database); + return "logged"; + } +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/controllers/PartyController.java b/api/src/main/java/be/naaturel/boardmateapi/controllers/PartyController.java index 09903f16..9ba60140 100644 --- a/api/src/main/java/be/naaturel/boardmateapi/controllers/PartyController.java +++ b/api/src/main/java/be/naaturel/boardmateapi/controllers/PartyController.java @@ -1,8 +1,8 @@ package be.naaturel.boardmateapi.controllers; -import be.naaturel.boardmateapi.models.Move; -import be.naaturel.boardmateapi.models.Party; -import be.naaturel.boardmateapi.services.PartyService; +import be.naaturel.boardmateapi.common.models.Move; +import be.naaturel.boardmateapi.common.models.Game; +import be.naaturel.boardmateapi.services.GameService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -11,18 +11,16 @@ import org.springframework.web.bind.annotation.*; @RestController public class PartyController { - private final PartyService service; + private final GameService service; @Autowired - public PartyController(PartyService service){ + public PartyController(GameService service){ this.service = service; } - @GetMapping("/party/{id}") - public ResponseEntity RetrieveParty(@PathVariable String id){ + @GetMapping("/games/") + public ResponseEntity retrieveAllGames(){ try{ - service.retrieveParty(id); - return ResponseEntity .status(HttpStatus.INTERNAL_SERVER_ERROR) .build(); @@ -31,10 +29,23 @@ public class PartyController { } } - @PostMapping("/create") - public ResponseEntity CreateParty(@RequestBody Party party){ + @GetMapping("/games/{id}") + public ResponseEntity retrieveGames(@PathVariable String id){ try{ - service.create(); + Game g = service.retrieveGame(id); + + return ResponseEntity + .status(HttpStatus.OK) + .body(g); + } catch (Exception e){ + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + @PostMapping("/create") + public ResponseEntity CreateParty(@RequestBody Game game){ + try{ + service.create(game); return ResponseEntity. status(HttpStatus.INTERNAL_SERVER_ERROR) @@ -45,9 +56,9 @@ public class PartyController { } @PostMapping("/moves/add") - public ResponseEntity AddMove(@RequestBody Move move){ + public ResponseEntity AddMove(@RequestBody String gameId, @RequestBody Move move){ try{ - service.addMove(); + service.addMove(gameId, move); return ResponseEntity .status(HttpStatus.OK) diff --git a/api/src/main/java/be/naaturel/boardmateapi/models/Move.java b/api/src/main/java/be/naaturel/boardmateapi/models/Move.java deleted file mode 100644 index c37249cc..00000000 --- a/api/src/main/java/be/naaturel/boardmateapi/models/Move.java +++ /dev/null @@ -1,13 +0,0 @@ -package be.naaturel.boardmateapi.models; - -public class Move { - - private Piece piece; - private Coordinate coordinate; - - public Move(Piece piece, Coordinate coordinate){ - this.piece = piece; - this.coordinate = coordinate; - } - -} diff --git a/api/src/main/java/be/naaturel/boardmateapi/models/Party.java b/api/src/main/java/be/naaturel/boardmateapi/models/Party.java deleted file mode 100644 index ed820f73..00000000 --- a/api/src/main/java/be/naaturel/boardmateapi/models/Party.java +++ /dev/null @@ -1,22 +0,0 @@ -package be.naaturel.boardmateapi.models; - -import java.util.ArrayList; -import java.util.List; - -public class Party { - - private final String whiteName; - private final String blackName; - private final int timeControl; - private final int increment; - private final List moves; - - public Party(String whiteName, String blackName, int timeControl, int increment){ - this.whiteName = whiteName; - this.blackName = blackName; - this.timeControl = timeControl; - this.increment = increment; - this.moves = new ArrayList<>(); - } - -} diff --git a/api/src/main/java/be/naaturel/boardmateapi/models/Piece.java b/api/src/main/java/be/naaturel/boardmateapi/models/Piece.java deleted file mode 100644 index cd34ad1b..00000000 --- a/api/src/main/java/be/naaturel/boardmateapi/models/Piece.java +++ /dev/null @@ -1,11 +0,0 @@ -package be.naaturel.boardmateapi.models; - -public class Piece { - - - - public Piece(){ - - } - -} diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/CustomPartyRepo.java b/api/src/main/java/be/naaturel/boardmateapi/repository/CustomPartyRepo.java deleted file mode 100644 index fded8ad6..00000000 --- a/api/src/main/java/be/naaturel/boardmateapi/repository/CustomPartyRepo.java +++ /dev/null @@ -1,9 +0,0 @@ -package be.naaturel.boardmateapi.repository; - -import be.naaturel.boardmateapi.models.Party; - -public interface CustomPartyRepo { - public Party find(String id); - public String create(); - public String registerMove(); -} diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/CustomPartyRepoImpl.java b/api/src/main/java/be/naaturel/boardmateapi/repository/CustomPartyRepoImpl.java deleted file mode 100644 index 32de281f..00000000 --- a/api/src/main/java/be/naaturel/boardmateapi/repository/CustomPartyRepoImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package be.naaturel.boardmateapi.repository; - -import be.naaturel.boardmateapi.models.Party; -import org.springframework.stereotype.Repository; - -@Repository -public class CustomPartyRepoImpl implements CustomPartyRepo{ - - @Override - public Party find(String id) { - return null; - } - - @Override - public String create() { - return ""; - } - - @Override - public String registerMove() { - return ""; - } -} diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/GameRepo.java b/api/src/main/java/be/naaturel/boardmateapi/repository/GameRepo.java new file mode 100644 index 00000000..1c193358 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/repository/GameRepo.java @@ -0,0 +1,9 @@ +package be.naaturel.boardmateapi.repository; + +import be.naaturel.boardmateapi.repository.dtos.GameDto; +import org.springframework.data.mongodb.repository.MongoRepository; + + +public interface GameRepo extends MongoRepository { + +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/PartyDto.java b/api/src/main/java/be/naaturel/boardmateapi/repository/PartyDto.java deleted file mode 100644 index a5f22012..00000000 --- a/api/src/main/java/be/naaturel/boardmateapi/repository/PartyDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package be.naaturel.boardmateapi.repository; - -import org.springframework.data.annotation.Id; -import org.springframework.data.mongodb.core.mapping.Document; - -@Document(collection = "parties") -public class PartyDto { - @Id - private String id; - private String[] moves; -} diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/dtos/GameDto.java b/api/src/main/java/be/naaturel/boardmateapi/repository/dtos/GameDto.java new file mode 100644 index 00000000..7307f8b3 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/repository/dtos/GameDto.java @@ -0,0 +1,60 @@ +package be.naaturel.boardmateapi.repository.dtos; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +@Document(collection = "games") +public class GameDto { + @Id + private String id; + @Field("players") + private Map players; + @Field("time") + private TimeControlDto timeControl; + @Field("moves") + private List moves; + + public String getId() { + return id; + } + + public TimeControlDto getTimeControl() { + return timeControl; + } + + public List getMoves() { + return moves; + } + + public Map getPlayers() { + return players; + } + + public void setPlayers(Map players) { + this.players = players; + } + + public void setTimeControl(TimeControlDto timeControl) { + this.timeControl = timeControl; + } + + public void setMoves(Collection moves) { + this.moves = new ArrayList<>(moves); + } + + public void addPlayer(String color, PlayerDto player){ + if(players.size() >= 2) return; + players.put(color, player); + } + + public void addMove(String move){ + moves.add(move); + } + +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/dtos/PlayerDto.java b/api/src/main/java/be/naaturel/boardmateapi/repository/dtos/PlayerDto.java new file mode 100644 index 00000000..cfa5429e --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/repository/dtos/PlayerDto.java @@ -0,0 +1,17 @@ +package be.naaturel.boardmateapi.repository.dtos; + +import org.springframework.data.mongodb.core.mapping.Field; + +public class PlayerDto { + + @Field("name") + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/dtos/TimeControlDto.java b/api/src/main/java/be/naaturel/boardmateapi/repository/dtos/TimeControlDto.java new file mode 100644 index 00000000..53cfdbc9 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/repository/dtos/TimeControlDto.java @@ -0,0 +1,26 @@ +package be.naaturel.boardmateapi.repository.dtos; + +import org.springframework.data.mongodb.core.mapping.Field; + +public class TimeControlDto { + @Field("value") + private int value; + @Field("increment") + private int increment; + + public int getValue() { + return value; + } + + public int getIncrement() { + return increment; + } + + public void setValue(int value) { + this.value = value; + } + + public void setIncrement(int increment){ + this.increment = increment; + } +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/GameMapper.java b/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/GameMapper.java new file mode 100644 index 00000000..7d454e65 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/GameMapper.java @@ -0,0 +1,45 @@ +package be.naaturel.boardmateapi.repository.mappings; + +import be.naaturel.boardmateapi.common.models.Game; +import be.naaturel.boardmateapi.common.models.Move; +import be.naaturel.boardmateapi.repository.dtos.GameDto; +import be.naaturel.boardmateapi.repository.dtos.PlayerDto; +import be.naaturel.boardmateapi.repository.dtos.TimeControlDto; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GameMapper { + + public static GameDto toDto(Game game){ + GameDto dto = new GameDto(); + + PlayerDto white = PlayerMapper.toDto(game.getWhiteName()); + PlayerDto black = PlayerMapper.toDto(game.getBlackName()); + Map players = new HashMap<>(); + players.put("white", white); + players.put("black", black); + dto.setPlayers(players); + + TimeControlDto timeControlDto = TimeControlMapper.toDto(game.getTimeValue(), game.getIncrement()); + dto.setTimeControl(timeControlDto); + + List moves = + game.getMoves() + .stream() + .map(Move::toString) + .toList(); + + dto.setMoves(moves); + return dto; + } + + public static Game toModel(GameDto dto){ + String whiteName = dto.getPlayers().get("white").getName(); + String blackName = dto.getPlayers().get("black").getName(); + int timeValue = dto.getTimeControl().getValue(); + int increment = dto.getTimeControl().getIncrement(); + return new Game(whiteName, blackName, timeValue, increment); + } +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/PlayerMapper.java b/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/PlayerMapper.java new file mode 100644 index 00000000..089d20fe --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/PlayerMapper.java @@ -0,0 +1,11 @@ +package be.naaturel.boardmateapi.repository.mappings; + +import be.naaturel.boardmateapi.repository.dtos.PlayerDto; + +public class PlayerMapper { + public static PlayerDto toDto(String playerName){ + PlayerDto dto = new PlayerDto(); + dto.setName(playerName); + return dto; + } +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/TimeControlMapper.java b/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/TimeControlMapper.java new file mode 100644 index 00000000..4a2d7ab5 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/TimeControlMapper.java @@ -0,0 +1,14 @@ +package be.naaturel.boardmateapi.repository.mappings; + +import be.naaturel.boardmateapi.repository.dtos.TimeControlDto; + +public class TimeControlMapper { + + public static TimeControlDto toDto(int control, int increment){ + TimeControlDto dto = new TimeControlDto(); + dto.setValue(control); + dto.setIncrement(increment); + return dto; + } + +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/services/GameService.java b/api/src/main/java/be/naaturel/boardmateapi/services/GameService.java new file mode 100644 index 00000000..c3c91021 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/services/GameService.java @@ -0,0 +1,47 @@ +package be.naaturel.boardmateapi.services; + +import be.naaturel.boardmateapi.common.models.Game; +import be.naaturel.boardmateapi.common.models.Move; +import be.naaturel.boardmateapi.repository.GameRepo; +import be.naaturel.boardmateapi.repository.dtos.GameDto; +import be.naaturel.boardmateapi.repository.mappings.GameMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Collection; +import java.util.Optional; + +@Service +public class GameService { + + private final GameRepo repo; + + @Autowired + public GameService(GameRepo repo){ + this.repo = repo; + } + + public void save(Game game){ + GameDto gameDto = GameMapper.toDto(game); + repo.save(gameDto); + } + + public Game retrieveGame(String id){ + Optional dtoOpt = repo.findById(id); + return dtoOpt.map(GameMapper::toModel).orElse(null); + } + + public String create(Game game){ + GameDto gameDto = GameMapper.toDto(game); + repo.save(gameDto); + return gameDto.getId(); + } + + public String addMove(@RequestBody String gameId, @RequestBody Move move) throws Exception { + Game g = retrieveGame(gameId); + g.addMove(move); + save(g); + return move.toString(); + } +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/services/PartyService.java b/api/src/main/java/be/naaturel/boardmateapi/services/PartyService.java deleted file mode 100644 index d9598b00..00000000 --- a/api/src/main/java/be/naaturel/boardmateapi/services/PartyService.java +++ /dev/null @@ -1,30 +0,0 @@ -package be.naaturel.boardmateapi.services; - -import be.naaturel.boardmateapi.models.Party; -import be.naaturel.boardmateapi.repository.CustomPartyRepoImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class PartyService { - - private final CustomPartyRepoImpl repo; - - @Autowired - public PartyService(CustomPartyRepoImpl repo){ - this.repo = repo; - } - - public Party retrieveParty(String id){ - return null; - } - - public String create(){ - return null; - } - - public String addMove(){ - return null; - } - -} diff --git a/api/src/main/resources/application.properties b/api/src/main/resources/application.properties index df2bacf3..d0b2db1d 100644 --- a/api/src/main/resources/application.properties +++ b/api/src/main/resources/application.properties @@ -17,4 +17,8 @@ management.endpoint.prometheus.enabled=true #=============DOCUMENTATION============= springdoc.swagger-ui.path=/api-docs -springdoc.api-docs.path=/v1/api-docs \ No newline at end of file +springdoc.api-docs.path=/v1/api-docs + +#=============DATABASE============= +spring.data.mongodb.uri=mongodb://board-mate-user:apx820kcng@mongodb:27017/board-mate-db +spring.data.mongodb.database=board-mate-db \ No newline at end of file