package repository import ( "errors" "time" "gorm.io/gorm" "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) return r.db.Transaction(func(tx *gorm.DB) error { var stats config.UsageStats err := tx.Where("provider_id = ? AND model_name = ? AND date = ?", providerID, modelName, todayTime).First(&stats).Error if errors.Is(err, gorm.ErrRecordNotFound) { stats = config.UsageStats{ ProviderID: providerID, ModelName: modelName, RequestCount: 1, Date: todayTime, } return tx.Create(&stats).Error } else if err != nil { return err } return tx.Model(&stats).Update("request_count", gorm.Expr("request_count + 1")).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 }