108 lines
3.4 KiB
Go
108 lines
3.4 KiB
Go
package dto
|
||
|
||
import (
|
||
"errors"
|
||
"regexp"
|
||
"time"
|
||
|
||
validation "github.com/go-ozzo/ozzo-validation/v4"
|
||
)
|
||
|
||
// TeamKey 结构体定义
|
||
type TeamKey struct {
|
||
ID *int64 `json:"id,omitempty"`
|
||
UserID *int64 `json:"userID,omitempty"`
|
||
Name *string `json:"name,omitempty"` // 必须
|
||
Key *string `json:"key,omitempty"`
|
||
Status *int64 `json:"status,omitempty"` // 默认1 允许,0禁止
|
||
Quota *int64 `json:"quota,omitempty"` // UnlimitedQuota不为1 的时候必须
|
||
UnlimitedQuota *bool `json:"unlimitedQuota,omitempty"` // 默认1 不限制,0限制
|
||
UsedQuota *int64 `json:"usedQuota,omitempty"`
|
||
CreatedAt *int64 `json:"createdAt,omitempty"`
|
||
ExpiredAt *int64 `json:"expiredAt,omitempty"` // 可选
|
||
}
|
||
|
||
// DefaultTeamKey 创建一个具有默认值的 TeamKey
|
||
func DefaultTeamKey() TeamKey {
|
||
status := int64(1) // 默认允许
|
||
unlimitedQuota := true // 默认不限制
|
||
createdAt := time.Now().Unix()
|
||
|
||
return TeamKey{
|
||
Status: &status,
|
||
UnlimitedQuota: &unlimitedQuota,
|
||
CreatedAt: &createdAt,
|
||
}
|
||
}
|
||
|
||
// Validate 验证 TeamKey 结构体
|
||
func (t TeamKey) Validate() error {
|
||
// 自定义验证规则
|
||
var quotaRule validation.Rule = validation.Skip
|
||
if t.UnlimitedQuota != nil && !*t.UnlimitedQuota {
|
||
quotaRule = validation.Required.Error("当 UnlimitedQuota 为 false 时,Quota 是必填项")
|
||
}
|
||
|
||
// 过期时间校验
|
||
var expiredAtRule validation.Rule = validation.Skip
|
||
if t.ExpiredAt != nil {
|
||
expiredAtRule = validation.Min(time.Now().Unix()).Error("过期时间不能早于当前时间")
|
||
}
|
||
|
||
return validation.ValidateStruct(&t,
|
||
// ID 通常由系统生成,不需要验证
|
||
|
||
// UserID 可选,但如果提供必须大于 0
|
||
validation.Field(&t.UserID,
|
||
validation.When(t.UserID != nil, validation.Min(int64(1)).Error("用户 ID 必须大于 0"))),
|
||
|
||
// Name 是必填字段
|
||
validation.Field(&t.Name,
|
||
validation.Required.Error("名称不能为空"),
|
||
validation.When(t.Name != nil, validation.Length(1, 100).Error("名称长度应在 1-100 之间"))),
|
||
|
||
// Key 可选,但如果提供需要符合特定格式
|
||
validation.Field(&t.Key,
|
||
validation.When(t.Key != nil,
|
||
validation.Length(1, 255).Error("Key 长度应在 1-255 之间")),
|
||
validation.Match(regexp.MustCompile(`^[^\s]+$`)).Error("Key 不能包含空格"),
|
||
),
|
||
|
||
// Status 只能是 0 或 1
|
||
validation.Field(&t.Status,
|
||
validation.When(t.Status != nil, validation.In(int64(0), int64(1)).Error("状态只能是 0(禁止) 或 1(允许)"))),
|
||
|
||
// Quota 要求依赖于 UnlimitedQuota
|
||
validation.Field(&t.Quota, quotaRule,
|
||
validation.When(t.Quota != nil, validation.Min(int64(1)).Error("配额必须大于 0"))),
|
||
|
||
// UnlimitedQuota 是否限制配额
|
||
validation.Field(&t.UnlimitedQuota),
|
||
|
||
// UsedQuota 系统维护,不需要验证
|
||
validation.Field(&t.UsedQuota,
|
||
validation.When(t.UsedQuota != nil, validation.Min(int64(0)).Error("已使用配额不能为负数"))),
|
||
|
||
// CreatedAt 系统维护,不需要验证
|
||
validation.Field(&t.CreatedAt),
|
||
|
||
// ExpiredAt 可选,但如果提供必须大于当前时间
|
||
validation.Field(&t.ExpiredAt, expiredAtRule),
|
||
)
|
||
}
|
||
|
||
// ValidateCreate 创建时的特殊验证
|
||
func (t TeamKey) ValidateCreate() error {
|
||
// 首先进行基本验证
|
||
if err := t.Validate(); err != nil {
|
||
return err
|
||
}
|
||
|
||
// 创建时的额外验证
|
||
if t.Name == nil {
|
||
return errors.New("创建时必须提供名称")
|
||
}
|
||
|
||
return nil
|
||
}
|