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

@@ -9,6 +9,7 @@ import (
"hyapi-server/internal/application/user/dto/commands"
"hyapi-server/internal/application/user/dto/queries"
"hyapi-server/internal/application/user/dto/responses"
api_service "hyapi-server/internal/domains/api/services"
finance_service "hyapi-server/internal/domains/finance/services"
"hyapi-server/internal/domains/user/entities"
"hyapi-server/internal/domains/user/events"
@@ -25,6 +26,7 @@ type UserApplicationServiceImpl struct {
smsCodeService *user_service.SMSCodeService
walletService finance_service.WalletAggregateService
contractService user_service.ContractAggregateService
apiUserService api_service.ApiUserAggregateService
eventBus interfaces.EventBus
jwtAuth *middleware.JWTAuthMiddleware
logger *zap.Logger
@@ -37,6 +39,7 @@ func NewUserApplicationService(
smsCodeService *user_service.SMSCodeService,
walletService finance_service.WalletAggregateService,
contractService user_service.ContractAggregateService,
apiUserService api_service.ApiUserAggregateService,
eventBus interfaces.EventBus,
jwtAuth *middleware.JWTAuthMiddleware,
logger *zap.Logger,
@@ -47,6 +50,7 @@ func NewUserApplicationService(
smsCodeService: smsCodeService,
walletService: walletService,
contractService: contractService,
apiUserService: apiUserService,
eventBus: eventBus,
jwtAuth: jwtAuth,
logger: logger,
@@ -316,16 +320,20 @@ func (s *UserApplicationServiceImpl) ListUsers(ctx context.Context, query *queri
items := make([]*responses.UserListItem, 0, len(users))
for _, user := range users {
item := &responses.UserListItem{
ID: user.ID,
Phone: user.Phone,
UserType: user.UserType,
Username: user.Username,
IsActive: user.Active,
IsCertified: user.IsCertified,
LoginCount: user.LoginCount,
LastLoginAt: user.LastLoginAt,
CreatedAt: user.CreatedAt,
UpdatedAt: user.UpdatedAt,
ID: user.ID,
Phone: user.Phone,
UserType: user.UserType,
Username: user.Username,
IsActive: user.Active,
IsCertified: user.IsCertified,
IsBlacklisted: user.IsBlacklisted,
BlacklistReason: user.BlacklistReason,
BlacklistSource: user.BlacklistSource,
BlacklistedAt: user.BlacklistedAt,
LoginCount: user.LoginCount,
LastLoginAt: user.LastLoginAt,
CreatedAt: user.CreatedAt,
UpdatedAt: user.UpdatedAt,
}
// 添加企业信息
@@ -388,16 +396,20 @@ func (s *UserApplicationServiceImpl) GetUserDetail(ctx context.Context, userID s
// 2. 构建响应数据
item := &responses.UserListItem{
ID: user.ID,
Phone: user.Phone,
UserType: user.UserType,
Username: user.Username,
IsActive: user.Active,
IsCertified: user.IsCertified,
LoginCount: user.LoginCount,
LastLoginAt: user.LastLoginAt,
CreatedAt: user.CreatedAt,
UpdatedAt: user.UpdatedAt,
ID: user.ID,
Phone: user.Phone,
UserType: user.UserType,
Username: user.Username,
IsActive: user.Active,
IsCertified: user.IsCertified,
IsBlacklisted: user.IsBlacklisted,
BlacklistReason: user.BlacklistReason,
BlacklistSource: user.BlacklistSource,
BlacklistedAt: user.BlacklistedAt,
LoginCount: user.LoginCount,
LastLoginAt: user.LastLoginAt,
CreatedAt: user.CreatedAt,
UpdatedAt: user.UpdatedAt,
}
// 添加企业信息
@@ -459,3 +471,64 @@ func (s *UserApplicationServiceImpl) GetUserStats(ctx context.Context) (*respons
CertifiedUsers: stats.CertifiedUsers,
}, nil
}
// BlacklistUser 将用户列入黑名单,并同步冻结 API 账号
func (s *UserApplicationServiceImpl) BlacklistUser(ctx context.Context, cmd *commands.BlacklistUserCommand) error {
user, err := s.userAggregateService.GetUserByID(ctx, cmd.UserID)
if err != nil {
return fmt.Errorf("用户不存在")
}
source := cmd.Source
if source == "" {
source = "self"
}
if err := user.AddToBlacklist(cmd.Reason, source, cmd.OperatorUserID); err != nil {
return err
}
if err := s.userAggregateService.SaveUser(ctx, user); err != nil {
return fmt.Errorf("保存黑名单状态失败: %w", err)
}
// 同步冻结 API 访问(无 API 账号时忽略)
if err := s.apiUserService.FreezeApiUser(ctx, cmd.UserID); err != nil {
s.logger.Warn("冻结 API 账号失败(可能尚未开通)",
zap.String("user_id", cmd.UserID),
zap.Error(err))
}
s.logger.Info("用户已列入黑名单",
zap.String("user_id", cmd.UserID),
zap.String("operator", cmd.OperatorUserID),
zap.String("reason", cmd.Reason),
zap.Time("blacklisted_at", *user.BlacklistedAt),
)
return nil
}
// UnblacklistUser 移出黑名单并解冻 API
func (s *UserApplicationServiceImpl) UnblacklistUser(ctx context.Context, cmd *commands.UnblacklistUserCommand) error {
user, err := s.userAggregateService.GetUserByID(ctx, cmd.UserID)
if err != nil {
return fmt.Errorf("用户不存在")
}
if err := user.RemoveFromBlacklist(); err != nil {
return err
}
if err := s.userAggregateService.SaveUser(ctx, user); err != nil {
return fmt.Errorf("移出黑名单失败: %w", err)
}
if err := s.apiUserService.UnfreezeApiUser(ctx, cmd.UserID); err != nil {
s.logger.Warn("解冻 API 账号失败(可能尚未开通)",
zap.String("user_id", cmd.UserID),
zap.Error(err))
}
s.logger.Info("用户已移出黑名单",
zap.String("user_id", cmd.UserID),
zap.String("operator", cmd.OperatorUserID),
)
return nil
}