package repository import ( "time" "gorm.io/gorm" "gorm.io/gorm/clause" "nex/backend/internal/config" "nex/backend/internal/domain" ) type statsRepository struct { db *gorm.DB } func NewStatsRepository(db *gorm.DB) StatsRepository { return &statsRepository{db: db} } func (r *statsRepository) Record(providerID, modelName string) error { today := time.Now().Format("2006-01-02") todayTime, _ := time.Parse("2006-01-02", today) stats := config.UsageStats{ ProviderID: providerID, ModelName: modelName, RequestCount: 1, Date: todayTime, } return r.db.Clauses(clause.OnConflict{ Columns: []clause.Column{ {Name: "provider_id"}, {Name: "model_name"}, {Name: "date"}, }, DoUpdates: clause.Assignments(map[string]interface{}{ "request_count": gorm.Expr("request_count + 1"), }), }).Create(&stats).Error } func (r *statsRepository) BatchUpdate(providerID, modelName string, date time.Time, delta int) error { stats := config.UsageStats{ ProviderID: providerID, ModelName: modelName, RequestCount: delta, Date: date, } return r.db.Clauses(clause.OnConflict{ Columns: []clause.Column{ {Name: "provider_id"}, {Name: "model_name"}, {Name: "date"}, }, DoUpdates: clause.Assignments(map[string]interface{}{ "request_count": gorm.Expr("request_count + ?", delta), }), }).Create(&stats).Error } func (r *statsRepository) Query(providerID, modelName string, startDate, endDate *time.Time) ([]domain.UsageStats, error) { var stats []config.UsageStats query := r.db.Model(&config.UsageStats{}) if providerID != "" { query = query.Where("provider_id = ?", providerID) } if modelName != "" { query = query.Where("model_name = ?", modelName) } if startDate != nil { query = query.Where("date >= ?", startDate) } if endDate != nil { query = query.Where("date <= ?", endDate) } err := query.Order("date DESC").Find(&stats).Error if err != nil { return nil, err } result := make([]domain.UsageStats, len(stats)) for i := range stats { result[i] = domain.UsageStats{ ID: stats[i].ID, ProviderID: stats[i].ProviderID, ModelName: stats[i].ModelName, RequestCount: stats[i].RequestCount, Date: stats[i].Date, } } return result, nil }