From 73239088d985f01aa6b1067ed9097a845e471d4f Mon Sep 17 00:00:00 2001 From: Janis Date: Sat, 16 May 2026 11:41:56 +0200 Subject: [PATCH] fix: NCS-85 Database Writeback fails without Logs (#52) Reviewed-on: https://git.janis-eccarius.de/NowChess/NowChessSystems/pulls/52 --- .../chess/config/NativeReflectionConfig.scala | 2 ++ .../store/redis/GameWritebackStreamListener.scala | 15 ++++++++++++--- .../store/service/GameWritebackService.scala | 6 ++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala b/modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala index 5fa2ea4..2e8d9ae 100644 --- a/modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala +++ b/modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala @@ -4,11 +4,13 @@ import de.nowchess.api.board.{CastlingRights, Color, File, Piece, PieceType, Ran import de.nowchess.api.dto.* import de.nowchess.api.game.{DrawReason, GameContext, GameMode, GameResult} import de.nowchess.api.move.{Move, MoveType, PromotionPiece} +import de.nowchess.chess.registry.GameCacheDto import io.quarkus.runtime.annotations.RegisterForReflection @RegisterForReflection( targets = Array( classOf[ApiErrorDto], + classOf[GameCacheDto], classOf[ClockDto], classOf[CreateGameRequestDto], classOf[ErrorEventDto], diff --git a/modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala b/modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala index 3cc0243..b33a215 100644 --- a/modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala +++ b/modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala @@ -7,8 +7,9 @@ import io.quarkus.redis.datasource.RedisDataSource import jakarta.annotation.PostConstruct import jakarta.enterprise.context.ApplicationScoped import jakarta.inject.Inject +import org.jboss.logging.Logger import scala.compiletime.uninitialized -import scala.util.Try +import scala.util.{Failure, Success, Try} import java.util.function.Consumer @ApplicationScoped @@ -20,10 +21,18 @@ class GameWritebackStreamListener: @Inject var writebackService: GameWritebackService = uninitialized // scalafix:on + private val log = Logger.getLogger(classOf[GameWritebackStreamListener]) + @PostConstruct def startListening(): Unit = val handler: Consumer[String] = json => - Try(objectMapper.readValue(json, classOf[GameWritebackEventDto])).toOption - .foreach(writebackService.writeBack) + Try(objectMapper.readValue(json, classOf[GameWritebackEventDto])) match + case Failure(ex) => + log.errorf(ex, "Failed to parse game-writeback event: %s", json) + case Success(event) => + Try(writebackService.writeBack(event)) match + case Failure(ex) => + log.errorf(ex, "Failed to write back game event for gameId=%s", event.gameId) + case Success(_) => () redis.pubsub(classOf[String]).subscribe("game-writeback", handler) () diff --git a/modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala b/modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala index 9784084..cf4f27a 100644 --- a/modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala +++ b/modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala @@ -8,6 +8,7 @@ import jakarta.annotation.PostConstruct import jakarta.enterprise.context.ApplicationScoped import jakarta.inject.Inject import jakarta.transaction.Transactional +import org.jboss.logging.Logger import scala.compiletime.uninitialized import java.time.Instant @@ -15,6 +16,8 @@ import java.time.Instant @ApplicationScoped class GameWritebackService: + private val log = Logger.getLogger(classOf[GameWritebackService]) + // scalafix:off DisableSyntax.var @Inject var repository: GameRecordRepository = uninitialized @@ -46,12 +49,15 @@ class GameWritebackService: private def doWriteBack(event: GameWritebackEventDto): Unit = repository.findByGameId(event.gameId) match case None => + log.infof("Creating game record for gameId=%s", event.gameId) createRecord(event) gamesWrittenCounter("create").increment() case Some(r) if event.moveCount > r.moveCount || event.pgn != r.pgn => + log.infof("Updating game record for gameId=%s moveCount=%d", event.gameId, event.moveCount) updateRecord(r, event) gamesWrittenCounter("update").increment() case _ => + log.debugf("Skipping writeback for gameId=%s (no change)", event.gameId) writebackSkipped.increment() private def createRecord(event: GameWritebackEventDto): Unit =