149 lines
4.4 KiB
Go
149 lines
4.4 KiB
Go
package services
|
||
|
||
import (
|
||
"context"
|
||
"errors"
|
||
"time"
|
||
|
||
"hyapi-server/internal/config"
|
||
"hyapi-server/internal/domains/api/entities"
|
||
repo "hyapi-server/internal/domains/api/repositories"
|
||
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
type ApiUserAggregateService interface {
|
||
CreateApiUser(ctx context.Context, apiUserId string) error
|
||
UpdateWhiteList(ctx context.Context, apiUserId string, whiteList []string) error
|
||
AddToWhiteList(ctx context.Context, apiUserId string, entry string, remark string) error
|
||
RemoveFromWhiteList(ctx context.Context, apiUserId string, entry string) error
|
||
FreezeApiUser(ctx context.Context, apiUserId string) error
|
||
UnfreezeApiUser(ctx context.Context, apiUserId string) error
|
||
LoadApiUserByUserId(ctx context.Context, apiUserId string) (*entities.ApiUser, error)
|
||
LoadApiUserByAccessId(ctx context.Context, accessId string) (*entities.ApiUser, error)
|
||
SaveApiUser(ctx context.Context, apiUser *entities.ApiUser) error
|
||
}
|
||
|
||
type ApiUserAggregateServiceImpl struct {
|
||
repo repo.ApiUserRepository
|
||
cfg *config.Config
|
||
}
|
||
|
||
func NewApiUserAggregateService(repo repo.ApiUserRepository, cfg *config.Config) ApiUserAggregateService {
|
||
return &ApiUserAggregateServiceImpl{repo: repo, cfg: cfg}
|
||
}
|
||
|
||
func (s *ApiUserAggregateServiceImpl) CreateApiUser(ctx context.Context, apiUserId string) error {
|
||
// 已存在则幂等成功,避免重复 INSERT 导致 PostgreSQL 事务中止(SQLSTATE 25P02)
|
||
existing, err := s.repo.FindByUserId(ctx, apiUserId)
|
||
if err == nil && existing != nil {
|
||
return nil
|
||
}
|
||
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
||
return err
|
||
}
|
||
|
||
apiUser, err := entities.NewApiUser(apiUserId, s.cfg.Wallet.BalanceAlert.DefaultEnabled, s.cfg.Wallet.BalanceAlert.DefaultThreshold)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if err := apiUser.Validate(); err != nil {
|
||
return err
|
||
}
|
||
return s.repo.Create(ctx, apiUser)
|
||
}
|
||
|
||
func (s *ApiUserAggregateServiceImpl) UpdateWhiteList(ctx context.Context, apiUserId string, whiteList []string) error {
|
||
apiUser, err := s.repo.FindByUserId(ctx, apiUserId)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
// 将字符串数组转换为WhiteListItem数组
|
||
items := make([]entities.WhiteListItem, 0, len(whiteList))
|
||
now := time.Now()
|
||
for _, ip := range whiteList {
|
||
items = append(items, entities.WhiteListItem{
|
||
IPAddress: ip,
|
||
AddedAt: now, // 批量更新时使用当前时间
|
||
})
|
||
}
|
||
apiUser.UpdateWhiteList(items) // UpdateWhiteList 会转换为 WhiteList 类型
|
||
return s.repo.Update(ctx, apiUser)
|
||
}
|
||
|
||
func (s *ApiUserAggregateServiceImpl) AddToWhiteList(ctx context.Context, apiUserId string, entry string, remark string) error {
|
||
apiUser, err := s.repo.FindByUserId(ctx, apiUserId)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
err = apiUser.AddToWhiteList(entry, remark)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return s.repo.Update(ctx, apiUser)
|
||
}
|
||
|
||
func (s *ApiUserAggregateServiceImpl) RemoveFromWhiteList(ctx context.Context, apiUserId string, entry string) error {
|
||
apiUser, err := s.repo.FindByUserId(ctx, apiUserId)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
err = apiUser.RemoveFromWhiteList(entry)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return s.repo.Update(ctx, apiUser)
|
||
}
|
||
|
||
func (s *ApiUserAggregateServiceImpl) FreezeApiUser(ctx context.Context, apiUserId string) error {
|
||
apiUser, err := s.repo.FindByUserId(ctx, apiUserId)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
apiUser.Freeze()
|
||
return s.repo.Update(ctx, apiUser)
|
||
}
|
||
|
||
func (s *ApiUserAggregateServiceImpl) UnfreezeApiUser(ctx context.Context, apiUserId string) error {
|
||
apiUser, err := s.repo.FindByUserId(ctx, apiUserId)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
apiUser.Unfreeze()
|
||
return s.repo.Update(ctx, apiUser)
|
||
}
|
||
|
||
func (s *ApiUserAggregateServiceImpl) LoadApiUserByAccessId(ctx context.Context, accessId string) (*entities.ApiUser, error) {
|
||
return s.repo.FindByAccessId(ctx, accessId)
|
||
}
|
||
|
||
func (s *ApiUserAggregateServiceImpl) LoadApiUserByUserId(ctx context.Context, apiUserId string) (*entities.ApiUser, error) {
|
||
apiUser, err := s.repo.FindByUserId(ctx, apiUserId)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
// 确保WhiteList不为nil
|
||
if apiUser.WhiteList == nil {
|
||
apiUser.WhiteList = entities.WhiteList{}
|
||
}
|
||
|
||
return apiUser, nil
|
||
}
|
||
|
||
func (s *ApiUserAggregateServiceImpl) SaveApiUser(ctx context.Context, apiUser *entities.ApiUser) error {
|
||
exists, err := s.repo.FindByUserId(ctx, apiUser.UserId)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if exists != nil {
|
||
// 确保WhiteList不为nil
|
||
if apiUser.WhiteList == nil {
|
||
apiUser.WhiteList = []entities.WhiteListItem{}
|
||
}
|
||
return s.repo.Update(ctx, apiUser)
|
||
} else {
|
||
return s.repo.Create(ctx, apiUser)
|
||
}
|
||
}
|