feat: 添加独立其他设置菜单及有效端参数保存
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
package business
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"kra/internal/biz/business"
|
||||
"kra/internal/service/dto"
|
||||
)
|
||||
|
||||
type OtherSettingsUsecase interface {
|
||||
Get(context.Context) (*business.OtherSettings, error)
|
||||
Save(context.Context, business.OtherSettings) (*business.OtherSettings, error)
|
||||
}
|
||||
|
||||
type OtherSettingsService struct{ uc OtherSettingsUsecase }
|
||||
|
||||
func NewOtherSettingsService(uc *business.OtherSettingsUsecase) *OtherSettingsService {
|
||||
return &OtherSettingsService{uc: uc}
|
||||
}
|
||||
|
||||
func otherSettingsResponse(value *business.OtherSettings) *dto.OtherSettingsResponse {
|
||||
defaults := business.DefaultOtherSettings()
|
||||
result := &dto.OtherSettingsResponse{OtherSettingsValues: dto.OtherSettingsValues{Amount: value.Amount, Days: value.Days}, Defaults: dto.OtherSettingsValues{Amount: defaults.Amount, Days: defaults.Days}}
|
||||
if !value.UpdatedAt.IsZero() {
|
||||
result.UpdatedAt = value.UpdatedAt.Format(time.RFC3339)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (s *OtherSettingsService) Get(ctx context.Context) (*dto.OtherSettingsResponse, error) {
|
||||
value, err := s.uc.Get(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return otherSettingsResponse(value), nil
|
||||
}
|
||||
|
||||
func (s *OtherSettingsService) Save(ctx context.Context, req *dto.OtherSettingsRequest) (*dto.OtherSettingsResponse, error) {
|
||||
if req == nil || req.Amount == nil || req.Days == nil {
|
||||
return nil, business.ErrOtherSettingsInput
|
||||
}
|
||||
value := business.OtherSettings{Amount: *req.Amount, Days: *req.Days}
|
||||
if err := business.ValidateOtherSettings(value); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
saved, err := s.uc.Save(ctx, value)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return otherSettingsResponse(saved), nil
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package business
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"kra/internal/biz/business"
|
||||
"kra/internal/service/dto"
|
||||
)
|
||||
|
||||
type settingsUsecaseFake struct{ calls int }
|
||||
|
||||
func (f *settingsUsecaseFake) Get(context.Context) (*business.OtherSettings, error) {
|
||||
value := business.DefaultOtherSettings()
|
||||
return &value, nil
|
||||
}
|
||||
func (f *settingsUsecaseFake) Save(_ context.Context, value business.OtherSettings) (*business.OtherSettings, error) {
|
||||
f.calls++
|
||||
return &value, nil
|
||||
}
|
||||
|
||||
func TestOtherSettingsServiceRequiresBothValidFields(t *testing.T) {
|
||||
f := &settingsUsecaseFake{}
|
||||
s := &OtherSettingsService{uc: f}
|
||||
zero, days, negative := int64(0), int64(30), int64(-1)
|
||||
for _, req := range []*dto.OtherSettingsRequest{nil, {}, {Amount: &zero}, {Days: &days}, {Amount: &negative, Days: &days}, {Amount: &zero, Days: &zero}} {
|
||||
if _, err := s.Save(context.Background(), req); err != business.ErrOtherSettingsInput {
|
||||
t.Fatalf("边界校验错误: %v", err)
|
||||
}
|
||||
}
|
||||
if f.calls != 0 {
|
||||
t.Fatal("无效输入不得进入用例")
|
||||
}
|
||||
res, err := s.Save(context.Background(), &dto.OtherSettingsRequest{Amount: &zero, Days: &days})
|
||||
if err != nil || res.Amount != 0 || res.Days != 30 || res.Defaults.Amount != 3000 || f.calls != 1 {
|
||||
t.Fatalf("DTO 转换或零值错误: %+v %v", res, err)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package dto
|
||||
|
||||
type OtherSettingsRequest struct {
|
||||
Amount *int64 `json:"amount"`
|
||||
Days *int64 `json:"days"`
|
||||
}
|
||||
|
||||
type OtherSettingsValues struct {
|
||||
Amount int64 `json:"amount"`
|
||||
Days int64 `json:"days"`
|
||||
}
|
||||
|
||||
type OtherSettingsResponse struct {
|
||||
OtherSettingsValues
|
||||
Defaults OtherSettingsValues `json:"defaults"`
|
||||
UpdatedAt string `json:"updatedAt"`
|
||||
}
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
// ProviderSet aggregates all service modules for Wire.
|
||||
var ProviderSet = wire.NewSet(
|
||||
businessservice.NewUserPreferenceService,
|
||||
businessservice.NewOtherSettingsService,
|
||||
businessservice.NewAccountService,
|
||||
businessservice.NewBindingService,
|
||||
businessservice.NewPasswordResetService,
|
||||
|
||||
Reference in New Issue
Block a user