package services import ( "errors" "goalfymax-admin/internal/models" "goalfymax-admin/internal/storage" ) type UserProjectQuotaService interface { Create(input *models.UserProjectQuota) (*models.UserProjectQuota, error) Update(id uint, input *models.UserProjectQuota) (*models.UserProjectQuota, error) Delete(id uint) error GetByID(id uint) (*models.UserProjectQuota, error) GetByUserID(userID string) (*models.UserProjectQuota, error) List(filter storage.UserProjectQuotaFilter) ([]models.UserProjectQuota, int64, error) } type userProjectQuotaService struct { store storage.UserProjectQuotaStorage } func NewUserProjectQuotaService(store storage.UserProjectQuotaStorage) UserProjectQuotaService { return &userProjectQuotaService{store: store} } func (s *userProjectQuotaService) validate(q *models.UserProjectQuota) error { if q.UserID == "" { return errors.New("user_id 不能为空") } if q.ProjectLimit < 0 || q.CoderVMLimit < 0 || q.BrowserVMLimit < 0 || q.ProcessLimit < 0 { return errors.New("配额上限不能为负数") } return nil } func (s *userProjectQuotaService) Create(input *models.UserProjectQuota) (*models.UserProjectQuota, error) { if err := s.validate(input); err != nil { return nil, err } if _, err := s.store.GetByUserID(input.UserID); err == nil { return nil, errors.New("该用户配额已存在") } if err := s.store.Create(input); err != nil { return nil, err } return input, nil } func (s *userProjectQuotaService) Update(id uint, input *models.UserProjectQuota) (*models.UserProjectQuota, error) { if err := s.validate(input); err != nil { return nil, err } exist, err := s.store.GetByID(id) if err != nil { return nil, errors.New("记录不存在") } // user_id 不建议修改,如需修改可放开以下行:exist.UserID = input.UserID exist.ProjectLimit = input.ProjectLimit exist.CoderVMLimit = input.CoderVMLimit exist.BrowserVMLimit = input.BrowserVMLimit exist.ProcessLimit = input.ProcessLimit exist.Enabled = input.Enabled exist.Description = input.Description if err := s.store.Update(exist); err != nil { return nil, err } return exist, nil } func (s *userProjectQuotaService) Delete(id uint) error { return s.store.Delete(id) } func (s *userProjectQuotaService) GetByID(id uint) (*models.UserProjectQuota, error) { return s.store.GetByID(id) } func (s *userProjectQuotaService) GetByUserID(userID string) (*models.UserProjectQuota, error) { return s.store.GetByUserID(userID) } func (s *userProjectQuotaService) List(filter storage.UserProjectQuotaFilter) ([]models.UserProjectQuota, int64, error) { return s.store.List(filter) }