fix: NCS-85 Database Writeback fails without Logs (#52)
Build & Test (NowChessSystems) TeamCity build finished

Reviewed-on: #52
This commit was merged in pull request #52.
This commit is contained in:
2026-05-16 11:41:56 +02:00
parent 4ad92ab236
commit 73239088d9
3 changed files with 20 additions and 3 deletions
@@ -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],
@@ -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)
()
@@ -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 =