fix: NCS-85 Database Writeback fails without Logs #52

Merged
Janis merged 2 commits from NCS-85 into main 2026-05-16 11:41:56 +02:00
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.dto.*
import de.nowchess.api.game.{DrawReason, GameContext, GameMode, GameResult} import de.nowchess.api.game.{DrawReason, GameContext, GameMode, GameResult}
import de.nowchess.api.move.{Move, MoveType, PromotionPiece} import de.nowchess.api.move.{Move, MoveType, PromotionPiece}
import de.nowchess.chess.registry.GameCacheDto
import io.quarkus.runtime.annotations.RegisterForReflection import io.quarkus.runtime.annotations.RegisterForReflection
@RegisterForReflection( @RegisterForReflection(
targets = Array( targets = Array(
classOf[ApiErrorDto], classOf[ApiErrorDto],
classOf[GameCacheDto],
classOf[ClockDto], classOf[ClockDto],
classOf[CreateGameRequestDto], classOf[CreateGameRequestDto],
classOf[ErrorEventDto], classOf[ErrorEventDto],
@@ -7,8 +7,9 @@ import io.quarkus.redis.datasource.RedisDataSource
import jakarta.annotation.PostConstruct import jakarta.annotation.PostConstruct
import jakarta.enterprise.context.ApplicationScoped import jakarta.enterprise.context.ApplicationScoped
import jakarta.inject.Inject import jakarta.inject.Inject
import org.jboss.logging.Logger
import scala.compiletime.uninitialized import scala.compiletime.uninitialized
import scala.util.Try import scala.util.{Failure, Success, Try}
import java.util.function.Consumer import java.util.function.Consumer
@ApplicationScoped @ApplicationScoped
@@ -20,10 +21,18 @@ class GameWritebackStreamListener:
@Inject var writebackService: GameWritebackService = uninitialized @Inject var writebackService: GameWritebackService = uninitialized
// scalafix:on // scalafix:on
private val log = Logger.getLogger(classOf[GameWritebackStreamListener])
@PostConstruct @PostConstruct
def startListening(): Unit = def startListening(): Unit =
val handler: Consumer[String] = json => val handler: Consumer[String] = json =>
Try(objectMapper.readValue(json, classOf[GameWritebackEventDto])).toOption Try(objectMapper.readValue(json, classOf[GameWritebackEventDto])) match
.foreach(writebackService.writeBack) 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) redis.pubsub(classOf[String]).subscribe("game-writeback", handler)
() ()
@@ -8,6 +8,7 @@ import jakarta.annotation.PostConstruct
import jakarta.enterprise.context.ApplicationScoped import jakarta.enterprise.context.ApplicationScoped
import jakarta.inject.Inject import jakarta.inject.Inject
import jakarta.transaction.Transactional import jakarta.transaction.Transactional
import org.jboss.logging.Logger
import scala.compiletime.uninitialized import scala.compiletime.uninitialized
import java.time.Instant import java.time.Instant
@@ -15,6 +16,8 @@ import java.time.Instant
@ApplicationScoped @ApplicationScoped
class GameWritebackService: class GameWritebackService:
private val log = Logger.getLogger(classOf[GameWritebackService])
// scalafix:off DisableSyntax.var // scalafix:off DisableSyntax.var
@Inject @Inject
var repository: GameRecordRepository = uninitialized var repository: GameRecordRepository = uninitialized
@@ -46,12 +49,15 @@ class GameWritebackService:
private def doWriteBack(event: GameWritebackEventDto): Unit = private def doWriteBack(event: GameWritebackEventDto): Unit =
repository.findByGameId(event.gameId) match repository.findByGameId(event.gameId) match
case None => case None =>
log.infof("Creating game record for gameId=%s", event.gameId)
createRecord(event) createRecord(event)
gamesWrittenCounter("create").increment() gamesWrittenCounter("create").increment()
case Some(r) if event.moveCount > r.moveCount || event.pgn != r.pgn => 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) updateRecord(r, event)
gamesWrittenCounter("update").increment() gamesWrittenCounter("update").increment()
case _ => case _ =>
log.debugf("Skipping writeback for gameId=%s (no change)", event.gameId)
writebackSkipped.increment() writebackSkipped.increment()
private def createRecord(event: GameWritebackEventDto): Unit = private def createRecord(event: GameWritebackEventDto): Unit =