Files
Erupe/server/channelserver/repo_diva.go
Houmgaor 2be589beae refactor(channelserver): eliminate *sqlx.Rows/*sql.Rows from repository interfaces
Move scan loops from handlers into repository methods so that interfaces
return typed slices instead of leaking database cursors. This fixes
resource leaks (7 of 12 call sites never closed rows) and makes all
12 methods mockable for unit tests.

Affected repos: CafeRepo, ShopRepo, EventRepo, RengokuRepo, DivaRepo,
ScenarioRepo, MiscRepo, MercenaryRepo. New structs: DivaEvent,
MercenaryLoan, GuildHuntCatUsage. EventRepo.GetEventQuests left as-is
(requires broader Server refactor).
2026-02-21 14:16:58 +01:00

41 lines
1.2 KiB
Go

package channelserver
import (
"github.com/jmoiron/sqlx"
)
// DivaRepository centralizes all database access for diva defense events.
type DivaRepository struct {
db *sqlx.DB
}
// NewDivaRepository creates a new DivaRepository.
func NewDivaRepository(db *sqlx.DB) *DivaRepository {
return &DivaRepository{db: db}
}
// DeleteEvents removes all diva events.
func (r *DivaRepository) DeleteEvents() error {
_, err := r.db.Exec("DELETE FROM events WHERE event_type='diva'")
return err
}
// InsertEvent creates a new diva event with the given start epoch.
func (r *DivaRepository) InsertEvent(startEpoch uint32) error {
_, err := r.db.Exec("INSERT INTO events (event_type, start_time) VALUES ('diva', to_timestamp($1)::timestamp without time zone)", startEpoch)
return err
}
// DivaEvent represents a diva event row with ID and start_time epoch.
type DivaEvent struct {
ID uint32 `db:"id"`
StartTime uint32 `db:"start_time"`
}
// GetEvents returns all diva events with their ID and start_time epoch.
func (r *DivaRepository) GetEvents() ([]DivaEvent, error) {
var result []DivaEvent
err := r.db.Select(&result, "SELECT id, (EXTRACT(epoch FROM start_time)::int) as start_time FROM events WHERE event_type='diva'")
return result, err
}