diff --git a/server/channelserver/repo_gacha.go b/server/channelserver/repo_gacha.go index 208e76b7d..a93915ebf 100644 --- a/server/channelserver/repo_gacha.go +++ b/server/channelserver/repo_gacha.go @@ -6,17 +6,22 @@ import ( "time" "github.com/jmoiron/sqlx" + "go.uber.org/zap" ) // GachaRepository centralizes all database access for gacha-related tables // (gacha_shop, gacha_entries, gacha_items, gacha_stepup, gacha_box). type GachaRepository struct { - db *sqlx.DB + db *sqlx.DB + logger *zap.Logger } // NewGachaRepository creates a new GachaRepository. -func NewGachaRepository(db *sqlx.DB) *GachaRepository { - return &GachaRepository{db: db} +func NewGachaRepository(db *sqlx.DB, logger *zap.Logger) *GachaRepository { + if logger == nil { + logger = zap.NewNop() + } + return &GachaRepository{db: db, logger: logger} } // GetEntryForTransaction reads the cost type/amount and roll count for a gacha transaction. @@ -65,9 +70,12 @@ func (r *GachaRepository) GetItemsForEntry(entryID uint32) ([]GachaItem, error) defer func() { _ = rows.Close() }() for rows.Next() { var item GachaItem - if err := rows.StructScan(&item); err == nil { - items = append(items, item) + if err := rows.StructScan(&item); err != nil { + r.logger.Warn("Skipping gacha_items row that failed to scan — check item_type (≤255) and item_id/quantity (≤65535) for out-of-range values", + zap.Uint32("entryID", entryID), zap.Error(err)) + continue } + items = append(items, item) } return items, nil } @@ -85,9 +93,12 @@ func (r *GachaRepository) GetGuaranteedItems(rollType uint8, gachaID uint32) ([] defer func() { _ = rows.Close() }() for rows.Next() { var item GachaItem - if err := rows.StructScan(&item); err == nil { - items = append(items, item) + if err := rows.StructScan(&item); err != nil { + r.logger.Warn("Skipping guaranteed gacha_items row that failed to scan — check item_type (≤255) and item_id/quantity (≤65535) for out-of-range values", + zap.Uint8("rollType", rollType), zap.Uint32("gachaID", gachaID), zap.Error(err)) + continue } + items = append(items, item) } return items, nil } diff --git a/server/channelserver/repo_gacha_test.go b/server/channelserver/repo_gacha_test.go index 23ef3feaf..56a9847bd 100644 --- a/server/channelserver/repo_gacha_test.go +++ b/server/channelserver/repo_gacha_test.go @@ -13,7 +13,7 @@ func setupGachaRepo(t *testing.T) (*GachaRepository, *sqlx.DB, uint32) { db := SetupTestDB(t) userID := CreateTestUser(t, db, "gacha_test_user") charID := CreateTestCharacter(t, db, userID, "GachaChar") - repo := NewGachaRepository(db) + repo := NewGachaRepository(db, nil) t.Cleanup(func() { TeardownTestDB(t, db) }) return repo, db, charID } diff --git a/server/channelserver/session_lifecycle_integration_test.go b/server/channelserver/session_lifecycle_integration_test.go index 7884ec8d1..eb0d4cb5c 100644 --- a/server/channelserver/session_lifecycle_integration_test.go +++ b/server/channelserver/session_lifecycle_integration_test.go @@ -581,7 +581,7 @@ func createTestServerWithDB(t *testing.T, db *sqlx.DB) *Server { server.charRepo = NewCharacterRepository(db) server.guildRepo = NewGuildRepository(db) server.userRepo = NewUserRepository(db) - server.gachaRepo = NewGachaRepository(db) + server.gachaRepo = NewGachaRepository(db, nil) server.houseRepo = NewHouseRepository(db) server.festaRepo = NewFestaRepository(db) server.towerRepo = NewTowerRepository(db) diff --git a/server/channelserver/sys_channel_server.go b/server/channelserver/sys_channel_server.go index 712c61b9c..72f537b81 100644 --- a/server/channelserver/sys_channel_server.go +++ b/server/channelserver/sys_channel_server.go @@ -149,7 +149,7 @@ func NewServer(config *Config) *Server { s.charRepo = NewCharacterRepository(config.DB) s.guildRepo = NewGuildRepository(config.DB) s.userRepo = NewUserRepository(config.DB) - s.gachaRepo = NewGachaRepository(config.DB) + s.gachaRepo = NewGachaRepository(config.DB, s.logger) s.houseRepo = NewHouseRepository(config.DB) s.festaRepo = NewFestaRepository(config.DB) s.towerRepo = NewTowerRepository(config.DB) diff --git a/server/channelserver/testhelpers_db.go b/server/channelserver/testhelpers_db.go index 5fb6f36ed..60a07afc8 100644 --- a/server/channelserver/testhelpers_db.go +++ b/server/channelserver/testhelpers_db.go @@ -333,7 +333,7 @@ func SetTestDB(s *Server, db *sqlx.DB) { s.charRepo = NewCharacterRepository(db) s.guildRepo = NewGuildRepository(db) s.userRepo = NewUserRepository(db) - s.gachaRepo = NewGachaRepository(db) + s.gachaRepo = NewGachaRepository(db, nil) s.houseRepo = NewHouseRepository(db) s.festaRepo = NewFestaRepository(db) s.towerRepo = NewTowerRepository(db)