feat: 添加独立其他设置菜单及有效端参数保存

This commit is contained in:
Yvan
2026-11-04 21:18:31 +08:00
parent c2e8b729be
commit ca9ce99b66
27 changed files with 805 additions and 9 deletions
@@ -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)
}
}
+17
View File
@@ -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"`
}
+1
View File
@@ -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,