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 }