89 lines
2.4 KiB
Go
89 lines
2.4 KiB
Go
package usecase
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
|
|
app "haixun-backend/internal/library/errors"
|
|
"haixun-backend/internal/library/errors/code"
|
|
"haixun-backend/internal/model/setting/domain/entity"
|
|
domrepo "haixun-backend/internal/model/setting/domain/repository"
|
|
domusecase "haixun-backend/internal/model/setting/domain/usecase"
|
|
)
|
|
|
|
type UseCase = domusecase.UseCase
|
|
|
|
type settingUseCase struct {
|
|
repo domrepo.Repository
|
|
}
|
|
|
|
const (
|
|
defaultLimit = int64(50)
|
|
maxLimit = int64(200)
|
|
)
|
|
|
|
func NewUseCase(repo domrepo.Repository) UseCase {
|
|
return &settingUseCase{repo: repo}
|
|
}
|
|
|
|
func (u *settingUseCase) List(ctx context.Context, scope, scopeID string, page, pageSize int64) ([]*entity.Setting, int64, int64, int64, error) {
|
|
if err := validateIdentity(scope, scopeID, "x"); err != nil {
|
|
return nil, 0, 0, 0, err
|
|
}
|
|
if page <= 0 {
|
|
page = 1
|
|
}
|
|
if pageSize <= 0 {
|
|
pageSize = defaultLimit
|
|
}
|
|
if pageSize > maxLimit {
|
|
pageSize = maxLimit
|
|
}
|
|
offset := (page - 1) * pageSize
|
|
items, total, err := u.repo.List(ctx, scope, scopeID, offset, pageSize)
|
|
return items, total, page, pageSize, err
|
|
}
|
|
|
|
func (u *settingUseCase) Get(ctx context.Context, scope, scopeID, key string) (*entity.Setting, error) {
|
|
if err := validateIdentity(scope, scopeID, key); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return u.repo.Find(ctx, scope, scopeID, key)
|
|
}
|
|
|
|
func (u *settingUseCase) Upsert(ctx context.Context, req domusecase.UpsertRequest) (*entity.Setting, error) {
|
|
if err := validateIdentity(req.Scope, req.ScopeID, req.Key); err != nil {
|
|
return nil, err
|
|
}
|
|
if req.Value == nil {
|
|
return nil, app.For(code.Setting).InputMissingRequired("setting value must not be empty")
|
|
}
|
|
return u.repo.Upsert(ctx, &entity.Setting{
|
|
Scope: req.Scope,
|
|
ScopeID: req.ScopeID,
|
|
Key: req.Key,
|
|
Value: req.Value,
|
|
Version: req.Version,
|
|
})
|
|
}
|
|
|
|
func (u *settingUseCase) Delete(ctx context.Context, scope, scopeID, key string) error {
|
|
if err := validateIdentity(scope, scopeID, key); err != nil {
|
|
return err
|
|
}
|
|
return u.repo.Delete(ctx, scope, scopeID, key)
|
|
}
|
|
|
|
func validateIdentity(scope, scopeID, key string) error {
|
|
switch scope {
|
|
case "user", "account", "system":
|
|
default:
|
|
return app.For(code.Setting).InputInvalidFormat("invalid setting scope")
|
|
}
|
|
if strings.TrimSpace(scopeID) == "" || strings.TrimSpace(key) == "" {
|
|
return app.For(code.Setting).InputMissingRequired("setting scope_id and key must not be empty")
|
|
}
|
|
return nil
|
|
}
|