From 5542d369259730be8d4b36d5d57270bc332d1784 Mon Sep 17 00:00:00 2001 From: Zelytra Date: Sun, 7 Jul 2024 20:42:30 +0200 Subject: [PATCH 1/3] Start mongodb integration --- backend/pom.xml | 8 ++++++++ .../manager/socket/PoolSocketService.java | 8 ++++++++ .../java/fr/zelytra/game/pool/PoolParty.java | 3 ++- .../game/pool/game/PoolGameInterface.java | 2 ++ .../game/pool/game/PoolGameManager.java | 18 +++++++++++++++++ .../{ => customs}/AmericanEightPoolGame.java | 5 ++++- .../pool/game/services/PoolGameService.java | 9 +++++++++ .../src/main/resources/application.properties | 8 ++++++++ .../fr/zelytra/game/pool/PoolPartyTest.java | 2 +- .../pool/game/AmericanEightPoolGameTest.java | 1 + deployment/dev/docker-compose.yml | 20 +++++++++++++++++-- deployment/dev/mongodb/init-mongo.sh | 14 +++++++++++++ .../src/objects/stores/NotificationStore.ts | 5 ----- 13 files changed, 93 insertions(+), 10 deletions(-) rename backend/src/main/java/fr/zelytra/game/pool/game/{ => customs}/AmericanEightPoolGame.java (95%) create mode 100644 backend/src/main/java/fr/zelytra/game/pool/game/services/PoolGameService.java create mode 100644 deployment/dev/mongodb/init-mongo.sh diff --git a/backend/pom.xml b/backend/pom.xml index afe11dc..8f6057a 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -112,6 +112,14 @@ io.quarkus quarkus-swagger-ui + + io.quarkus + quarkus-mongodb-client + + + io.quarkus + quarkus-mongodb-panache + diff --git a/backend/src/main/java/fr/zelytra/game/manager/socket/PoolSocketService.java b/backend/src/main/java/fr/zelytra/game/manager/socket/PoolSocketService.java index 512c416..a013681 100644 --- a/backend/src/main/java/fr/zelytra/game/manager/socket/PoolSocketService.java +++ b/backend/src/main/java/fr/zelytra/game/manager/socket/PoolSocketService.java @@ -5,7 +5,9 @@ import fr.zelytra.game.pool.PoolParty; import fr.zelytra.game.pool.PoolPlayer; import fr.zelytra.game.pool.data.*; +import fr.zelytra.game.pool.game.PoolGameManager; import fr.zelytra.game.pool.game.PoolVictoryState; +import fr.zelytra.game.pool.game.services.PoolGameService; import fr.zelytra.notification.Notification; import fr.zelytra.notification.NotificationMessageKey; import fr.zelytra.notification.NotificationMessageType; @@ -29,6 +31,9 @@ public class PoolSocketService { @Inject UserService userService; + @Inject + PoolGameService poolGameService; + private final ConcurrentMap games = new ConcurrentHashMap<>(); /** @@ -382,7 +387,10 @@ public void playAction(GameAction gameAction, String socketSessionId) { user.setPp(reportPlayer.pp()); user.setGamePlayed(user.getGamePlayed() + 1); } + // Persist game + poolGameService.persist((PoolGameManager) poolParty.getGame()); } + broadcastPoolDataToParty(poolParty); Log.info("[playAction][" + poolParty.getUuid() + "] User: " + poolPlayer.getUsername() + " play game action"); } diff --git a/backend/src/main/java/fr/zelytra/game/pool/PoolParty.java b/backend/src/main/java/fr/zelytra/game/pool/PoolParty.java index 98e033f..66f3e1b 100644 --- a/backend/src/main/java/fr/zelytra/game/pool/PoolParty.java +++ b/backend/src/main/java/fr/zelytra/game/pool/PoolParty.java @@ -4,7 +4,7 @@ import fr.zelytra.game.manager.message.SocketTimeOutManager; import fr.zelytra.game.manager.socket.PoolSocketService; import fr.zelytra.game.pool.data.*; -import fr.zelytra.game.pool.game.AmericanEightPoolGame; +import fr.zelytra.game.pool.game.customs.AmericanEightPoolGame; import fr.zelytra.game.pool.game.PoolGameInterface; import fr.zelytra.game.pool.game.PoolVictoryState; import fr.zelytra.notification.NotificationMessageKey; @@ -171,6 +171,7 @@ public GameReport getGameReport(PoolVictoryState victoryState) { gameReport.looserPlayer().add(new GameReportPlayer(player.getPp(), newPlayerPP, player.getUsername())); } } + game.setGameReport(gameReport); return gameReport; } diff --git a/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameInterface.java b/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameInterface.java index 5fcf480..efb79ea 100644 --- a/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameInterface.java +++ b/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameInterface.java @@ -1,6 +1,7 @@ package fr.zelytra.game.pool.game; import fr.zelytra.game.pool.data.GameAction; +import fr.zelytra.game.pool.data.GameReport; import fr.zelytra.game.pool.data.PoolTeam; public interface PoolGameInterface { @@ -11,4 +12,5 @@ public interface PoolGameInterface { GameAction getCurrentAction(); void setCurrentAction(GameAction action); void setVictoryState(PoolVictoryState state); + void setGameReport(GameReport report); } diff --git a/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java b/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java index f9c4a24..b6a9968 100644 --- a/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java +++ b/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java @@ -2,13 +2,22 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import fr.zelytra.game.pool.data.GameAction; +import fr.zelytra.game.pool.data.GameReport; import fr.zelytra.game.pool.data.PoolTeam; +import io.quarkus.mongodb.panache.common.MongoEntity; +import jakarta.persistence.GeneratedValue; +import org.bson.codecs.pojo.annotations.BsonId; import java.util.ArrayList; import java.util.List; +@MongoEntity(collection = "PoolGames") public class PoolGameManager { + @BsonId + @GeneratedValue + private int id; + private final PoolTeam teams = new PoolTeam(new ArrayList<>(), new ArrayList<>()); private final long startingTime; private long endTime; @@ -16,6 +25,7 @@ public class PoolGameManager { private GameAction currentAction; private boolean paused = false; private PoolVictoryState victoryState = PoolVictoryState.NONE; + private GameReport gameReport; public PoolGameManager() { startingTime = System.currentTimeMillis(); @@ -130,4 +140,12 @@ public List getHistory() { public boolean isPaused() { return paused; } + + public GameReport getGameReport() { + return gameReport; + } + + public void setGameReport(GameReport gameReport) { + this.gameReport = gameReport; + } } diff --git a/backend/src/main/java/fr/zelytra/game/pool/game/AmericanEightPoolGame.java b/backend/src/main/java/fr/zelytra/game/pool/game/customs/AmericanEightPoolGame.java similarity index 95% rename from backend/src/main/java/fr/zelytra/game/pool/game/AmericanEightPoolGame.java rename to backend/src/main/java/fr/zelytra/game/pool/game/customs/AmericanEightPoolGame.java index 3c222f7..8f3808c 100644 --- a/backend/src/main/java/fr/zelytra/game/pool/game/AmericanEightPoolGame.java +++ b/backend/src/main/java/fr/zelytra/game/pool/game/customs/AmericanEightPoolGame.java @@ -1,8 +1,11 @@ -package fr.zelytra.game.pool.game; +package fr.zelytra.game.pool.game.customs; import fr.zelytra.game.pool.data.GameAction; import fr.zelytra.game.pool.data.PoolBalls; import fr.zelytra.game.pool.data.PoolFault; +import fr.zelytra.game.pool.game.PoolGameInterface; +import fr.zelytra.game.pool.game.PoolGameManager; +import fr.zelytra.game.pool.game.PoolVictoryState; import java.util.ArrayList; import java.util.List; diff --git a/backend/src/main/java/fr/zelytra/game/pool/game/services/PoolGameService.java b/backend/src/main/java/fr/zelytra/game/pool/game/services/PoolGameService.java new file mode 100644 index 0000000..60c8cbe --- /dev/null +++ b/backend/src/main/java/fr/zelytra/game/pool/game/services/PoolGameService.java @@ -0,0 +1,9 @@ +package fr.zelytra.game.pool.game.services; + +import fr.zelytra.game.pool.game.PoolGameManager; +import io.quarkus.mongodb.panache.PanacheMongoRepository; +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class PoolGameService implements PanacheMongoRepository { +} diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 5c174c3..a9c85bb 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -5,6 +5,14 @@ quarkus.datasource.password=${DB_PASSWORD:password} quarkus.datasource.jdbc.url=jdbc:postgresql://${DB_HOST:127.0.0.1:24900}/${DB_DATABASE:onepool} quarkus.hibernate-orm.database.generation=update +#MongoDB +quarkus.mongodb.database=onepool +#quarkus.mongodb.credentials.username=${DB_USER:admin} +#quarkus.mongodb.credentials.password=${DB_PASSWORD:password} +#quarkus.mongodb.hosts=${DB_HOST:127.0.0.1:24905} +#quarkus.mongodb.credentials.auth-source=admin +quarkus.mongodb.connection-string=mongodb://${DB_USER:admin}:${DB_PASSWORD:password}@${DB_HOST:127.0.0.1:24905}/onepool?retryWrites=false&authSource=admin + # Test %test.quarkus.datasource.db-kind=h2 %test.quarkus.datasource.jdbc.url=jdbc:h2:mem:db diff --git a/backend/src/test/java/fr/zelytra/game/pool/PoolPartyTest.java b/backend/src/test/java/fr/zelytra/game/pool/PoolPartyTest.java index 64cb5f2..9eaf1fc 100644 --- a/backend/src/test/java/fr/zelytra/game/pool/PoolPartyTest.java +++ b/backend/src/test/java/fr/zelytra/game/pool/PoolPartyTest.java @@ -4,7 +4,7 @@ import fr.zelytra.game.pool.data.GameRules; import fr.zelytra.game.pool.data.GameStatus; import fr.zelytra.game.pool.data.PoolTeam; -import fr.zelytra.game.pool.game.AmericanEightPoolGame; +import fr.zelytra.game.pool.game.customs.AmericanEightPoolGame; import fr.zelytra.user.UserEntity; import io.quarkus.test.junit.QuarkusTest; import jakarta.transaction.Transactional; diff --git a/backend/src/test/java/fr/zelytra/game/pool/game/AmericanEightPoolGameTest.java b/backend/src/test/java/fr/zelytra/game/pool/game/AmericanEightPoolGameTest.java index b05e6ce..c2811ab 100644 --- a/backend/src/test/java/fr/zelytra/game/pool/game/AmericanEightPoolGameTest.java +++ b/backend/src/test/java/fr/zelytra/game/pool/game/AmericanEightPoolGameTest.java @@ -3,6 +3,7 @@ import fr.zelytra.game.pool.data.GameAction; import fr.zelytra.game.pool.data.PoolBalls; import fr.zelytra.game.pool.data.PoolFault; +import fr.zelytra.game.pool.game.customs.AmericanEightPoolGame; import io.quarkus.test.junit.QuarkusTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/deployment/dev/docker-compose.yml b/deployment/dev/docker-compose.yml index 97a2b81..82f01c7 100644 --- a/deployment/dev/docker-compose.yml +++ b/deployment/dev/docker-compose.yml @@ -8,7 +8,7 @@ services: ports: - "24900:5432" volumes: - - /onepool/psql-data/app:/var/lib/postgresql/data + - ./onepool/psql-data/app:/var/lib/postgresql/data - /etc/localtime:/etc/localtime:ro environment: POSTGRES_USER: ${POSTGRES_USER} @@ -23,7 +23,7 @@ services: ports: - "24903:5432" volumes: - - /onepool/psql-data/auth:/var/lib/postgresql/data/pgdata + - ./onepool/psql-data/auth:/var/lib/postgresql/data/pgdata - /etc/localtime:/etc/localtime:ro environment: POSTGRES_USER: ${POSTGRES_USER} @@ -32,6 +32,22 @@ services: PGDATA: /var/lib/postgresql/data/pgdata restart: unless-stopped + mongo-app: + image: mongo + container_name: onepool-mongo-app + restart: unless-stopped + ports: + - "24905:27017" + volumes: + - ./onepool/mongo-data/app:/data/db + - ./mongodb/init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh + environment: + MONGO_INITDB_ROOT_USERNAME: ${POSTGRES_USER} + MONGO_INITDB_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + MONGO_INITDB_DATABASE: onepool + MONGO_INITDB_USER: ${POSTGRES_USER} + MONGO_INITDB_PWD: ${POSTGRES_PASSWORD} + keycloak: image: quay.io/keycloak/keycloak:latest container_name: onepool-keycloak diff --git a/deployment/dev/mongodb/init-mongo.sh b/deployment/dev/mongodb/init-mongo.sh new file mode 100644 index 0000000..16a998f --- /dev/null +++ b/deployment/dev/mongodb/init-mongo.sh @@ -0,0 +1,14 @@ +set -e + +mongo < { - useAlertStore().send({ - content: t('alert.websocketAuthFailed.content'), - title: t('alert.websocketAuthFailed.title'), - type: AlertType.ERROR - }) }) if (!socket) return; From 2213fb5d03df10014e2cc958d166edb3ece5cb25 Mon Sep 17 00:00:00 2001 From: Zelytra Date: Mon, 8 Jul 2024 16:56:19 +0200 Subject: [PATCH 2/3] Setup mongodb replicate set but still wip --- .../game/pool/game/PoolGameManager.java | 2 + .../src/main/resources/application.properties | 2 +- deployment/dev/docker-compose.yml | 5 +- deployment/dev/mongodb/init-mongo.sh | 51 ++++++++++++++----- deployment/dev/mongodb/keyFile.sh | 3 ++ deployment/dev/mongodb/mongod.conf | 6 +++ 6 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 deployment/dev/mongodb/keyFile.sh create mode 100644 deployment/dev/mongodb/mongod.conf diff --git a/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java b/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java index b6a9968..f315ad9 100644 --- a/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java +++ b/backend/src/main/java/fr/zelytra/game/pool/game/PoolGameManager.java @@ -7,6 +7,7 @@ import io.quarkus.mongodb.panache.common.MongoEntity; import jakarta.persistence.GeneratedValue; import org.bson.codecs.pojo.annotations.BsonId; +import org.bson.codecs.pojo.annotations.BsonIgnore; import java.util.ArrayList; import java.util.List; @@ -60,6 +61,7 @@ public List getTeamActions(List teamNames) { } @JsonIgnore + @BsonIgnore public String getNextPlayer() { // Get the list of players from both teams List team1 = teams.team1(); diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index a9c85bb..219795b 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -11,7 +11,7 @@ quarkus.mongodb.database=onepool #quarkus.mongodb.credentials.password=${DB_PASSWORD:password} #quarkus.mongodb.hosts=${DB_HOST:127.0.0.1:24905} #quarkus.mongodb.credentials.auth-source=admin -quarkus.mongodb.connection-string=mongodb://${DB_USER:admin}:${DB_PASSWORD:password}@${DB_HOST:127.0.0.1:24905}/onepool?retryWrites=false&authSource=admin +quarkus.mongodb.connection-string=mongodb://${DB_USER:admin}:${DB_PASSWORD:password}@${DB_HOST:127.0.0.1:24905}/onepool?retryWrites=false # Test %test.quarkus.datasource.db-kind=h2 diff --git a/deployment/dev/docker-compose.yml b/deployment/dev/docker-compose.yml index 82f01c7..d4395b6 100644 --- a/deployment/dev/docker-compose.yml +++ b/deployment/dev/docker-compose.yml @@ -39,14 +39,17 @@ services: ports: - "24905:27017" volumes: - - ./onepool/mongo-data/app:/data/db + - ./mongodb/rs_keyfile:/etc/mongodb/pki/keyfile + - /onepool/mongo-data/app:/data/db - ./mongodb/init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh + - ./mongodb/mongod.conf:/etc/mongod.conf environment: MONGO_INITDB_ROOT_USERNAME: ${POSTGRES_USER} MONGO_INITDB_ROOT_PASSWORD: ${POSTGRES_PASSWORD} MONGO_INITDB_DATABASE: onepool MONGO_INITDB_USER: ${POSTGRES_USER} MONGO_INITDB_PWD: ${POSTGRES_PASSWORD} + command: [ "--config" , "/etc/mongod.conf" ] keycloak: image: quay.io/keycloak/keycloak:latest diff --git a/deployment/dev/mongodb/init-mongo.sh b/deployment/dev/mongodb/init-mongo.sh index 16a998f..0e65392 100644 --- a/deployment/dev/mongodb/init-mongo.sh +++ b/deployment/dev/mongodb/init-mongo.sh @@ -1,14 +1,41 @@ +#!/bin/bash set -e -mongo < ${PWD}/rs_keyfile +chmod 0400 ${PWD}/rs_keyfile +chown 999:999 ${PWD}/rs_keyfile \ No newline at end of file diff --git a/deployment/dev/mongodb/mongod.conf b/deployment/dev/mongodb/mongod.conf new file mode 100644 index 0000000..c5070c2 --- /dev/null +++ b/deployment/dev/mongodb/mongod.conf @@ -0,0 +1,6 @@ +net: + bindIpAll: true +security: + keyFile: /etc/mongodb/pki/keyfile +replication: + replSetName: rs0 \ No newline at end of file From 03a21ddb4d11c0dcc00d366a0164d18006f8237f Mon Sep 17 00:00:00 2001 From: Zelytra Date: Tue, 9 Jul 2024 14:32:12 +0200 Subject: [PATCH 3/3] Testing some solutions --- .../src/main/resources/application.properties | 2 +- deployment/dev/docker-compose.yml | 27 ++++------------- deployment/dev/mongodb/init-mongo.sh | 1 + deployment/dev/mongodb/keyFile.sh | 4 +-- .../dev/mongodb/mongo-replica-compose.yml | 29 +++++++++++++++++++ deployment/dev/mongodb/mongod.conf | 2 +- 6 files changed, 39 insertions(+), 26 deletions(-) create mode 100644 deployment/dev/mongodb/mongo-replica-compose.yml diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 219795b..f7a74aa 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -11,7 +11,7 @@ quarkus.mongodb.database=onepool #quarkus.mongodb.credentials.password=${DB_PASSWORD:password} #quarkus.mongodb.hosts=${DB_HOST:127.0.0.1:24905} #quarkus.mongodb.credentials.auth-source=admin -quarkus.mongodb.connection-string=mongodb://${DB_USER:admin}:${DB_PASSWORD:password}@${DB_HOST:127.0.0.1:24905}/onepool?retryWrites=false +quarkus.mongodb.connection-string=mongodb://${DB_HOST:127.0.0.1:24905}/?replicaSet=rs0 # Test %test.quarkus.datasource.db-kind=h2 diff --git a/deployment/dev/docker-compose.yml b/deployment/dev/docker-compose.yml index d4395b6..7695fbf 100644 --- a/deployment/dev/docker-compose.yml +++ b/deployment/dev/docker-compose.yml @@ -1,5 +1,7 @@ -version: '3.4' name: onepool +include: + - ./mongodb/mongo-replica-compose.yml + services: postgres-app: @@ -8,7 +10,7 @@ services: ports: - "24900:5432" volumes: - - ./onepool/psql-data/app:/var/lib/postgresql/data + - /onepool/psql-data/app:/var/lib/postgresql/data - /etc/localtime:/etc/localtime:ro environment: POSTGRES_USER: ${POSTGRES_USER} @@ -23,7 +25,7 @@ services: ports: - "24903:5432" volumes: - - ./onepool/psql-data/auth:/var/lib/postgresql/data/pgdata + - /onepool/psql-data/auth:/var/lib/postgresql/data/pgdata - /etc/localtime:/etc/localtime:ro environment: POSTGRES_USER: ${POSTGRES_USER} @@ -32,25 +34,6 @@ services: PGDATA: /var/lib/postgresql/data/pgdata restart: unless-stopped - mongo-app: - image: mongo - container_name: onepool-mongo-app - restart: unless-stopped - ports: - - "24905:27017" - volumes: - - ./mongodb/rs_keyfile:/etc/mongodb/pki/keyfile - - /onepool/mongo-data/app:/data/db - - ./mongodb/init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh - - ./mongodb/mongod.conf:/etc/mongod.conf - environment: - MONGO_INITDB_ROOT_USERNAME: ${POSTGRES_USER} - MONGO_INITDB_ROOT_PASSWORD: ${POSTGRES_PASSWORD} - MONGO_INITDB_DATABASE: onepool - MONGO_INITDB_USER: ${POSTGRES_USER} - MONGO_INITDB_PWD: ${POSTGRES_PASSWORD} - command: [ "--config" , "/etc/mongod.conf" ] - keycloak: image: quay.io/keycloak/keycloak:latest container_name: onepool-keycloak diff --git a/deployment/dev/mongodb/init-mongo.sh b/deployment/dev/mongodb/init-mongo.sh index 0e65392..ed018c7 100644 --- a/deployment/dev/mongodb/init-mongo.sh +++ b/deployment/dev/mongodb/init-mongo.sh @@ -2,6 +2,7 @@ set -e echo "Starting MongoDB initialization script..." +openssl rand -base64 756 > ~/rs_keyfile mongosh < ${PWD}/rs_keyfile -chmod 0400 ${PWD}/rs_keyfile -chown 999:999 ${PWD}/rs_keyfile \ No newline at end of file +chmod 600 ${PWD}/rs_keyfile +chown 9999:9999 ${PWD}/rs_keyfile \ No newline at end of file diff --git a/deployment/dev/mongodb/mongo-replica-compose.yml b/deployment/dev/mongodb/mongo-replica-compose.yml new file mode 100644 index 0000000..48a48c9 --- /dev/null +++ b/deployment/dev/mongodb/mongo-replica-compose.yml @@ -0,0 +1,29 @@ +services: + mongo-rs0-1: + image: mongo:latest + container_name: mongodb + ports: + - "24905:27017" + environment: + MONGO_INITDB_ROOT_USERNAME: ${POSTGRES_USER} + MONGO_INITDB_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + MONGO_INITDB_DATABASE: onepool + MONGO_REPLICA_SET_NAME: rs0 + volumes: + - /onepool/mongo-data/app:/data/db + command: > + bash -c "mongod --replSet rs0 --bind_ip_all + && mongo --eval 'rs.initiate({_id: \"rs0\", members: [{ _id: 0, host: \"localhost:27017\" }]})'" + + mongo-init-replica: + image: mongo:latest + depends_on: + - mongo-rs0-1 + entrypoint: > + bash -c " + sleep 10; + mongo --host mongo:27017 <