This commit is contained in:
2026-07-15 21:44:13 +08:00
parent 024b6614ba
commit 4794be896c
22 changed files with 1041 additions and 74 deletions

View File

@@ -21,6 +21,8 @@ import (
product_entities "hyapi-server/internal/domains/product/entities"
product_services "hyapi-server/internal/domains/product/services"
user_repositories "hyapi-server/internal/domains/user/repositories"
securityEntities "hyapi-server/internal/domains/security/entities"
securityServices "hyapi-server/internal/domains/security/services"
task_entities "hyapi-server/internal/infrastructure/task/entities"
"hyapi-server/internal/infrastructure/task/interfaces"
"hyapi-server/internal/shared/crypto"
@@ -83,6 +85,7 @@ type ApiApplicationServiceImpl struct {
contractInfoService user_repositories.ContractInfoRepository
productManagementService *product_services.ProductManagementService
userRepo user_repositories.UserRepository
blacklistService *securityServices.BlacklistService
txManager *database.TransactionManager
config *config.Config
logger *zap.Logger
@@ -112,6 +115,7 @@ func NewApiApplicationService(
subscriptionService *product_services.ProductSubscriptionService,
exportManager *export.ExportManager,
balanceAlertService finance_services.BalanceAlertService,
blacklistService *securityServices.BlacklistService,
) ApiApplicationService {
service := &ApiApplicationServiceImpl{
apiCallService: apiCallService,
@@ -121,6 +125,7 @@ func NewApiApplicationService(
apiCallRepository: apiCallRepository,
productManagementService: productManagementService,
userRepo: userRepo,
blacklistService: blacklistService,
txManager: txManager,
config: config,
logger: logger,
@@ -218,6 +223,24 @@ func (s *ApiApplicationServiceImpl) validateApiCall(ctx context.Context, cmd *co
return nil, ErrFrozenAccount
}
if platformUser, err := s.userRepo.GetByID(ctx, apiUser.UserId); err == nil {
if platformUser.IsOnBlacklist() {
s.logger.Error("账号已列入黑名单", zap.String("userId", apiUser.UserId))
if s.blacklistService != nil {
s.blacklistService.RecordHit(&securityEntities.BlacklistHitRecord{
HitType: securityEntities.HitTypeUserAPI,
UserID: apiUser.UserId,
Phone: platformUser.Phone,
IP: cmd.ClientIP,
Path: cmd.ApiName,
Method: "POST",
Reason: platformUser.BlacklistReason,
})
}
return nil, ErrBlacklistedAccount
}
}
// 验证产品是否启用
if !product.IsEnabled {
s.logger.Error("产品未启用", zap.String("product_code", product.Code))
@@ -440,6 +463,9 @@ func (s *ApiApplicationServiceImpl) asyncRecordFailure(ctx context.Context, apiC
errorMsg = err.Error()
case errors.Is(err, ErrFrozenAccount):
errorType = entities.ApiCallErrorFrozenAccount
case errors.Is(err, ErrBlacklistedAccount):
errorType = entities.ApiCallErrorFrozenAccount
errorMsg = err.Error()
case errors.Is(err, ErrInvalidIP):
errorType = entities.ApiCallErrorInvalidIP
case errors.Is(err, ErrArrears):

View File

@@ -12,8 +12,9 @@ var (
ErrInvalidIP = errors.New("未经授权的IP")
ErrMissingAccessId = errors.New("缺少Access-Id")
ErrInvalidAccessId = errors.New("未经授权的AccessId")
ErrFrozenAccount = errors.New("账户已冻结")
ErrArrears = errors.New("账户余额不足,无法请求")
ErrFrozenAccount = errors.New("账户已冻结")
ErrBlacklistedAccount = errors.New("账号已被列入黑名单")
ErrArrears = errors.New("账户余额不足,无法请求")
ErrInsufficientBalance = errors.New("钱包余额不足")
ErrProductNotFound = errors.New("产品不存在")
ErrProductDisabled = errors.New("产品已停用")
@@ -34,8 +35,9 @@ var ErrorCodeMap = map[error]int{
ErrInvalidIP: 1004,
ErrMissingAccessId: 1005,
ErrInvalidAccessId: 1006,
ErrFrozenAccount: 1007,
ErrArrears: 1007,
ErrFrozenAccount: 1007,
ErrBlacklistedAccount: 1007,
ErrArrears: 1007,
ErrInsufficientBalance: 1007,
ErrProductNotFound: 1008,
ErrProductDisabled: 1008,