fix: NCS-85 Database Writeback fails without Logs (#52)
Build & Test (NowChessSystems) TeamCity build finished
Build & Test (NowChessSystems) TeamCity build finished
Reviewed-on: #52
This commit was merged in pull request #52.
This commit is contained in:
@@ -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],
|
||||
|
||||
+12
-3
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user