fix(数据层): 修复数据完整性与仓储一致性问题
## 数据完整性修复 (fix-critical-data-integrity) - 添加 error_translate.go 统一错误转换层 - 修复 nil 输入和 NotFound 错误处理 - 增强仓储层错误一致性 ## 仓储一致性修复 (fix-high-repository-consistency) - Group schema 添加 default_validity_days 字段 - Account schema 添加 proxy edge 关联 - 新增 UsageLog ent schema 定义 - 修复 UpdateBalance/UpdateConcurrency 受影响行数校验 ## 数据卫生修复 (fix-medium-data-hygiene) - UserSubscription 添加软删除支持 (SoftDeleteMixin) - RedeemCode/Setting 添加硬删除策略文档 - account_groups/user_allowed_groups 的 created_at 声明 timestamptz - 停止写入 legacy users.allowed_groups 列 - 新增迁移: 011-014 (索引优化、软删除、孤立数据审计、列清理) ## 测试补充 - 添加 UserSubscription 软删除测试 - 添加迁移回归测试 - 添加 NotFound 错误测试 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -43,6 +43,8 @@ type Group struct {
|
||||
WeeklyLimitUsd *float64 `json:"weekly_limit_usd,omitempty"`
|
||||
// MonthlyLimitUsd holds the value of the "monthly_limit_usd" field.
|
||||
MonthlyLimitUsd *float64 `json:"monthly_limit_usd,omitempty"`
|
||||
// DefaultValidityDays holds the value of the "default_validity_days" field.
|
||||
DefaultValidityDays int `json:"default_validity_days,omitempty"`
|
||||
// Edges holds the relations/edges for other nodes in the graph.
|
||||
// The values are being populated by the GroupQuery when eager-loading is set.
|
||||
Edges GroupEdges `json:"edges"`
|
||||
@@ -57,6 +59,8 @@ type GroupEdges struct {
|
||||
RedeemCodes []*RedeemCode `json:"redeem_codes,omitempty"`
|
||||
// Subscriptions holds the value of the subscriptions edge.
|
||||
Subscriptions []*UserSubscription `json:"subscriptions,omitempty"`
|
||||
// UsageLogs holds the value of the usage_logs edge.
|
||||
UsageLogs []*UsageLog `json:"usage_logs,omitempty"`
|
||||
// Accounts holds the value of the accounts edge.
|
||||
Accounts []*Account `json:"accounts,omitempty"`
|
||||
// AllowedUsers holds the value of the allowed_users edge.
|
||||
@@ -67,7 +71,7 @@ type GroupEdges struct {
|
||||
UserAllowedGroups []*UserAllowedGroup `json:"user_allowed_groups,omitempty"`
|
||||
// loadedTypes holds the information for reporting if a
|
||||
// type was loaded (or requested) in eager-loading or not.
|
||||
loadedTypes [7]bool
|
||||
loadedTypes [8]bool
|
||||
}
|
||||
|
||||
// APIKeysOrErr returns the APIKeys value or an error if the edge
|
||||
@@ -97,10 +101,19 @@ func (e GroupEdges) SubscriptionsOrErr() ([]*UserSubscription, error) {
|
||||
return nil, &NotLoadedError{edge: "subscriptions"}
|
||||
}
|
||||
|
||||
// UsageLogsOrErr returns the UsageLogs value or an error if the edge
|
||||
// was not loaded in eager-loading.
|
||||
func (e GroupEdges) UsageLogsOrErr() ([]*UsageLog, error) {
|
||||
if e.loadedTypes[3] {
|
||||
return e.UsageLogs, nil
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "usage_logs"}
|
||||
}
|
||||
|
||||
// AccountsOrErr returns the Accounts value or an error if the edge
|
||||
// was not loaded in eager-loading.
|
||||
func (e GroupEdges) AccountsOrErr() ([]*Account, error) {
|
||||
if e.loadedTypes[3] {
|
||||
if e.loadedTypes[4] {
|
||||
return e.Accounts, nil
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "accounts"}
|
||||
@@ -109,7 +122,7 @@ func (e GroupEdges) AccountsOrErr() ([]*Account, error) {
|
||||
// AllowedUsersOrErr returns the AllowedUsers value or an error if the edge
|
||||
// was not loaded in eager-loading.
|
||||
func (e GroupEdges) AllowedUsersOrErr() ([]*User, error) {
|
||||
if e.loadedTypes[4] {
|
||||
if e.loadedTypes[5] {
|
||||
return e.AllowedUsers, nil
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "allowed_users"}
|
||||
@@ -118,7 +131,7 @@ func (e GroupEdges) AllowedUsersOrErr() ([]*User, error) {
|
||||
// AccountGroupsOrErr returns the AccountGroups value or an error if the edge
|
||||
// was not loaded in eager-loading.
|
||||
func (e GroupEdges) AccountGroupsOrErr() ([]*AccountGroup, error) {
|
||||
if e.loadedTypes[5] {
|
||||
if e.loadedTypes[6] {
|
||||
return e.AccountGroups, nil
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "account_groups"}
|
||||
@@ -127,7 +140,7 @@ func (e GroupEdges) AccountGroupsOrErr() ([]*AccountGroup, error) {
|
||||
// UserAllowedGroupsOrErr returns the UserAllowedGroups value or an error if the edge
|
||||
// was not loaded in eager-loading.
|
||||
func (e GroupEdges) UserAllowedGroupsOrErr() ([]*UserAllowedGroup, error) {
|
||||
if e.loadedTypes[6] {
|
||||
if e.loadedTypes[7] {
|
||||
return e.UserAllowedGroups, nil
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "user_allowed_groups"}
|
||||
@@ -142,7 +155,7 @@ func (*Group) scanValues(columns []string) ([]any, error) {
|
||||
values[i] = new(sql.NullBool)
|
||||
case group.FieldRateMultiplier, group.FieldDailyLimitUsd, group.FieldWeeklyLimitUsd, group.FieldMonthlyLimitUsd:
|
||||
values[i] = new(sql.NullFloat64)
|
||||
case group.FieldID:
|
||||
case group.FieldID, group.FieldDefaultValidityDays:
|
||||
values[i] = new(sql.NullInt64)
|
||||
case group.FieldName, group.FieldDescription, group.FieldStatus, group.FieldPlatform, group.FieldSubscriptionType:
|
||||
values[i] = new(sql.NullString)
|
||||
@@ -252,6 +265,12 @@ func (_m *Group) assignValues(columns []string, values []any) error {
|
||||
_m.MonthlyLimitUsd = new(float64)
|
||||
*_m.MonthlyLimitUsd = value.Float64
|
||||
}
|
||||
case group.FieldDefaultValidityDays:
|
||||
if value, ok := values[i].(*sql.NullInt64); !ok {
|
||||
return fmt.Errorf("unexpected type %T for field default_validity_days", values[i])
|
||||
} else if value.Valid {
|
||||
_m.DefaultValidityDays = int(value.Int64)
|
||||
}
|
||||
default:
|
||||
_m.selectValues.Set(columns[i], values[i])
|
||||
}
|
||||
@@ -280,6 +299,11 @@ func (_m *Group) QuerySubscriptions() *UserSubscriptionQuery {
|
||||
return NewGroupClient(_m.config).QuerySubscriptions(_m)
|
||||
}
|
||||
|
||||
// QueryUsageLogs queries the "usage_logs" edge of the Group entity.
|
||||
func (_m *Group) QueryUsageLogs() *UsageLogQuery {
|
||||
return NewGroupClient(_m.config).QueryUsageLogs(_m)
|
||||
}
|
||||
|
||||
// QueryAccounts queries the "accounts" edge of the Group entity.
|
||||
func (_m *Group) QueryAccounts() *AccountQuery {
|
||||
return NewGroupClient(_m.config).QueryAccounts(_m)
|
||||
@@ -371,6 +395,9 @@ func (_m *Group) String() string {
|
||||
builder.WriteString("monthly_limit_usd=")
|
||||
builder.WriteString(fmt.Sprintf("%v", *v))
|
||||
}
|
||||
builder.WriteString(", ")
|
||||
builder.WriteString("default_validity_days=")
|
||||
builder.WriteString(fmt.Sprintf("%v", _m.DefaultValidityDays))
|
||||
builder.WriteByte(')')
|
||||
return builder.String()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user