129 lines
3.5 KiB
Go
129 lines
3.5 KiB
Go
package services
|
|
|
|
import (
|
|
"errors"
|
|
"goalfymax-admin/internal/models"
|
|
"goalfymax-admin/pkg/utils"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// QuotaService 配额服务接口
|
|
type QuotaService interface {
|
|
GetQuotaHistory(req *models.QuotaHistoryRequest) (*models.QuotaHistoryResponse, error)
|
|
HealthCheck() error
|
|
GetQuotaRules() (*models.QuotaRulesResponse, error)
|
|
CreateQuotaRule(body any) (*models.QuotaRulesResponse, error)
|
|
UpdateQuotaRule(id string, body any) (*models.QuotaRulesResponse, error)
|
|
DeleteQuotaRule(id string) (*models.QuotaRulesResponse, error)
|
|
}
|
|
|
|
type quotaService struct {
|
|
gatewayClient *GatewayClient
|
|
logger *utils.Logger
|
|
}
|
|
|
|
// NewQuotaService 创建配额服务实例
|
|
func NewQuotaService(gatewayClient *GatewayClient, logger *utils.Logger) QuotaService {
|
|
return "aService{
|
|
gatewayClient: gatewayClient,
|
|
logger: logger,
|
|
}
|
|
}
|
|
|
|
// GetQuotaHistory 获取配额历史数据
|
|
func (s *quotaService) GetQuotaHistory(req *models.QuotaHistoryRequest) (*models.QuotaHistoryResponse, error) {
|
|
// 验证请求参数
|
|
if err := s.validateQuotaHistoryRequest(req); err != nil {
|
|
s.logger.Error("配额历史请求参数验证失败", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
|
|
// 调用网关客户端
|
|
response, err := s.gatewayClient.GetQuotaHistory(req)
|
|
if err != nil {
|
|
s.logger.Error("获取配额历史数据失败", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
|
|
s.logger.Info("配额历史数据获取成功",
|
|
zap.String("start_date", req.StartDate),
|
|
zap.String("end_date", req.EndDate),
|
|
zap.Int("data_count", len(response.Data)),
|
|
)
|
|
|
|
return response, nil
|
|
}
|
|
|
|
// HealthCheck 健康检查
|
|
func (s *quotaService) HealthCheck() error {
|
|
err := s.gatewayClient.HealthCheck()
|
|
if err != nil {
|
|
s.logger.Error("配额服务健康检查失败", zap.Error(err))
|
|
return err
|
|
}
|
|
|
|
s.logger.Info("配额服务健康检查成功")
|
|
return nil
|
|
}
|
|
|
|
// GetQuotaRules 获取配额规则列表
|
|
func (s *quotaService) GetQuotaRules() (*models.QuotaRulesResponse, error) {
|
|
resp, err := s.gatewayClient.GetQuotaRules("")
|
|
if err != nil {
|
|
s.logger.Error("获取配额规则失败", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func (s *quotaService) CreateQuotaRule(body any) (*models.QuotaRulesResponse, error) {
|
|
return s.gatewayClient.CreateQuotaRule("", body)
|
|
}
|
|
|
|
func (s *quotaService) UpdateQuotaRule(id string, body any) (*models.QuotaRulesResponse, error) {
|
|
if id == "" {
|
|
return nil, errors.New("缺少规则ID")
|
|
}
|
|
return s.gatewayClient.UpdateQuotaRule("", id, body)
|
|
}
|
|
|
|
func (s *quotaService) DeleteQuotaRule(id string) (*models.QuotaRulesResponse, error) {
|
|
if id == "" {
|
|
return nil, errors.New("缺少规则ID")
|
|
}
|
|
return s.gatewayClient.DeleteQuotaRule("", id)
|
|
}
|
|
|
|
// validateQuotaHistoryRequest 验证配额历史请求参数
|
|
func (s *quotaService) validateQuotaHistoryRequest(req *models.QuotaHistoryRequest) error {
|
|
if req.StartDate == "" {
|
|
return errors.New("开始日期不能为空")
|
|
}
|
|
|
|
if req.EndDate == "" {
|
|
return errors.New("结束日期不能为空")
|
|
}
|
|
|
|
// 验证日期格式 (简单验证,实际项目中可以使用更严格的验证)
|
|
if len(req.StartDate) != 10 || len(req.EndDate) != 10 {
|
|
return errors.New("日期格式不正确,应为 YYYY-MM-DD")
|
|
}
|
|
|
|
// 验证周期参数
|
|
if req.Period != "" && req.Period != "daily" && req.Period != "monthly" {
|
|
return errors.New("周期参数只能是 daily 或 monthly")
|
|
}
|
|
|
|
// 设置默认值
|
|
if req.Period == "" {
|
|
req.Period = "daily"
|
|
}
|
|
|
|
if len(req.GroupBy) == 0 {
|
|
req.GroupBy = []string{"user_id"}
|
|
}
|
|
|
|
return nil
|
|
}
|