diff --git a/internal/handler/live/gameover.go b/internal/handler/live/gameover.go index 7fa63a1..f4b7cce 100644 --- a/internal/handler/live/gameover.go +++ b/internal/handler/live/gameover.go @@ -12,12 +12,11 @@ import ( func gameOver(ctx *gin.Context) { ss := session.Get(ctx) - defer func() { + defer ss.FinalizeOrRollbackAfter(func() { if ss.UserEng != nil { ss.ClearLiveInProgress() } - ss.Finalize() - }() + }) ss.Respond(BuildGameOverResp()) } diff --git a/internal/handler/live/reward.go b/internal/handler/live/reward.go index b590228..02c1cd1 100644 --- a/internal/handler/live/reward.go +++ b/internal/handler/live/reward.go @@ -17,12 +17,11 @@ import ( func reward(ctx *gin.Context) { ss := session.Get(ctx) - defer func() { + defer ss.FinalizeOrRollbackAfter(func() { if ss.UserEng != nil { ss.ClearLiveInProgress() } - ss.Finalize() - }() + }) playRewardReq := liveschema.RewardReq{} err := honokautils.ParseRequestData(ctx, &playRewardReq) diff --git a/internal/handler/rlive/gameover.go b/internal/handler/rlive/gameover.go index 34f4256..42ebf24 100644 --- a/internal/handler/rlive/gameover.go +++ b/internal/handler/rlive/gameover.go @@ -14,13 +14,12 @@ import ( func gameOver(ctx *gin.Context) { ss := session.Get(ctx) token := "" - defer func() { + defer ss.FinalizeOrRollbackAfter(func() { if ss.UserEng != nil { deleteRandomLiveByToken(ss, token) ss.ClearLiveInProgress() } - ss.Finalize() - }() + }) req := rliveschema.TokenReq{} err := honokautils.ParseRequestData(ctx, &req) diff --git a/internal/handler/rlive/reward.go b/internal/handler/rlive/reward.go index d0ffe2d..e55f6dd 100644 --- a/internal/handler/rlive/reward.go +++ b/internal/handler/rlive/reward.go @@ -15,13 +15,12 @@ import ( func reward(ctx *gin.Context) { ss := session.Get(ctx) token := "" - defer func() { + defer ss.FinalizeOrRollbackAfter(func() { if ss.UserEng != nil { deleteRandomLiveByToken(ss, token) ss.ClearLiveInProgress() } - ss.Finalize() - }() + }) req := rliveschema.RewardReq{} err := honokautils.ParseRequestData(ctx, &req) diff --git a/internal/session/session.go b/internal/session/session.go index cf18e0f..00a7525 100644 --- a/internal/session/session.go +++ b/internal/session/session.go @@ -130,6 +130,22 @@ func (ss *Session) FinalizeOrRollback() { ss.Finalize() } +// FinalizeOrRollbackAfter runs cleanup only on the normal completion path. +func (ss *Session) FinalizeOrRollbackAfter(cleanup func()) { + defer func() { + if recovered := recover(); recovered != nil { + ss.Rollback() + panic(recovered) + } + }() + + if ss.done { + return + } + cleanup() + ss.Finalize() +} + func (ss *Session) Rollback() { if ss.done { return