package admin import ( "context" "fmt" v1 "github.com/go-nunu/nunu-layout-advanced/api/v1" adminApi "github.com/go-nunu/nunu-layout-advanced/api/v1/admin" "github.com/go-nunu/nunu-layout-advanced/internal/repository" "github.com/go-nunu/nunu-layout-advanced/internal/repository/admin" wafRep "github.com/go-nunu/nunu-layout-advanced/internal/repository/api/waf" "github.com/go-nunu/nunu-layout-advanced/internal/service" "slices" "time" ) type WafManageService interface { GetWafManageList(ctx context.Context,req adminApi.WafManageList) (*v1.PaginatedResponse[adminApi.WafManageListRes], error) RecoverWaf(ctx context.Context,req adminApi.RecoverWafRequest) error SyncExecuteRenewalActions(ctx context.Context,req adminApi.RecoverWafRequest) error } func NewWafManageService( service *service.Service, wafManageRepository admin.WafManageRepository, globalLimitRep wafRep.GlobalLimitRepository, wafOperations WafOperationsService, hostRep repository.HostRepository, ) WafManageService { return &wafManageService{ Service: service, wafManageRepository: wafManageRepository, globalLimitRep: globalLimitRep, wafOperations: wafOperations, hostRep: hostRep, } } type wafManageService struct { *service.Service wafManageRepository admin.WafManageRepository globalLimitRep wafRep.GlobalLimitRepository wafOperations WafOperationsService hostRep repository.HostRepository } func (s *wafManageService) GetWafManageList(ctx context.Context,req adminApi.WafManageList) (*v1.PaginatedResponse[adminApi.WafManageListRes], error) { return s.wafManageRepository.GetWafManageList(ctx, req) } func (s *wafManageService) RecoverWaf(ctx context.Context,req adminApi.RecoverWafRequest) error { wafModels, err := s.globalLimitRep.GetGlobalLimitsByHostIds(ctx, req.HostIds) if err != nil { return err } err = s.wafOperations.RecoverPlans(ctx, *wafModels, "closed") if err != nil { return err } return nil } func (s *wafManageService) SyncExecuteRenewalActions(ctx context.Context,req adminApi.RecoverWafRequest) error { wafData, err := s.hostRep.GetExpireTimeByHostId(ctx, req.HostIds) if err != nil { return err } wafExpireTime, err := s.globalLimitRep.GetGlobalLimitsByHostIds(ctx, req.HostIds) if err != nil { return err } var notExpiredHostIds []int for _, limit := range *wafExpireTime { if limit.ExpiredAt >= time.Now().Unix() - 1 * 60 * 60 { notExpiredHostIds = append(notExpiredHostIds, limit.HostId) } } var renewalRequest []RenewalRequest for i := range wafData { if slices.Contains(notExpiredHostIds, wafData[i].HostId) { continue } renewalRequest = append(renewalRequest, RenewalRequest{ HostId: wafData[i].HostId, ExpiredAt: wafData[i].ExpiredAt, }) } err = s.wafOperations.ExecuteRenewalActions(ctx, renewalRequest) if err != nil { return err } if len(notExpiredHostIds) != 0 { return fmt.Errorf("续费失败,套餐距离到期时间不能小于一小时,实例ID:%v", notExpiredHostIds) } return nil }