feat(rpm): RPM 限流模块优化
P0: - rpm_override 嵌入 Auth Cache Snapshot,消除每请求 DB 查询 (snapshot v6→v7) - 429 RPM 响应返回 Retry-After 头(当前分钟剩余秒数) P1: - ClearAll 按钮直连 DELETE API,带 loading 防重复 - 新增 GET /admin/users/:id/rpm-status 管理员 RPM 用量查询端点 优化: - checkRPM 从级联互斥改为并行取最严,user.rpm_limit 作为全局硬上限始终生效 - Override/Group 变更后自动失效 auth cache - fail-open 语义不变,Redis 故障不阻塞业务
This commit is contained in:
@@ -325,6 +325,20 @@ func (_c *UserCreate) SetNillableTotalRecharged(v *float64) *UserCreate {
|
||||
return _c
|
||||
}
|
||||
|
||||
// SetRpmLimit sets the "rpm_limit" field.
|
||||
func (_c *UserCreate) SetRpmLimit(v int) *UserCreate {
|
||||
_c.mutation.SetRpmLimit(v)
|
||||
return _c
|
||||
}
|
||||
|
||||
// SetNillableRpmLimit sets the "rpm_limit" field if the given value is not nil.
|
||||
func (_c *UserCreate) SetNillableRpmLimit(v *int) *UserCreate {
|
||||
if v != nil {
|
||||
_c.SetRpmLimit(*v)
|
||||
}
|
||||
return _c
|
||||
}
|
||||
|
||||
// AddAPIKeyIDs adds the "api_keys" edge to the APIKey entity by IDs.
|
||||
func (_c *UserCreate) AddAPIKeyIDs(ids ...int64) *UserCreate {
|
||||
_c.mutation.AddAPIKeyIDs(ids...)
|
||||
@@ -604,6 +618,10 @@ func (_c *UserCreate) defaults() error {
|
||||
v := user.DefaultTotalRecharged
|
||||
_c.mutation.SetTotalRecharged(v)
|
||||
}
|
||||
if _, ok := _c.mutation.RpmLimit(); !ok {
|
||||
v := user.DefaultRpmLimit
|
||||
_c.mutation.SetRpmLimit(v)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -687,6 +705,9 @@ func (_c *UserCreate) check() error {
|
||||
if _, ok := _c.mutation.TotalRecharged(); !ok {
|
||||
return &ValidationError{Name: "total_recharged", err: errors.New(`ent: missing required field "User.total_recharged"`)}
|
||||
}
|
||||
if _, ok := _c.mutation.RpmLimit(); !ok {
|
||||
return &ValidationError{Name: "rpm_limit", err: errors.New(`ent: missing required field "User.rpm_limit"`)}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -802,6 +823,10 @@ func (_c *UserCreate) createSpec() (*User, *sqlgraph.CreateSpec) {
|
||||
_spec.SetField(user.FieldTotalRecharged, field.TypeFloat64, value)
|
||||
_node.TotalRecharged = value
|
||||
}
|
||||
if value, ok := _c.mutation.RpmLimit(); ok {
|
||||
_spec.SetField(user.FieldRpmLimit, field.TypeInt, value)
|
||||
_node.RpmLimit = value
|
||||
}
|
||||
if nodes := _c.mutation.APIKeysIDs(); len(nodes) > 0 {
|
||||
edge := &sqlgraph.EdgeSpec{
|
||||
Rel: sqlgraph.O2M,
|
||||
@@ -1362,6 +1387,24 @@ func (u *UserUpsert) AddTotalRecharged(v float64) *UserUpsert {
|
||||
return u
|
||||
}
|
||||
|
||||
// SetRpmLimit sets the "rpm_limit" field.
|
||||
func (u *UserUpsert) SetRpmLimit(v int) *UserUpsert {
|
||||
u.Set(user.FieldRpmLimit, v)
|
||||
return u
|
||||
}
|
||||
|
||||
// UpdateRpmLimit sets the "rpm_limit" field to the value that was provided on create.
|
||||
func (u *UserUpsert) UpdateRpmLimit() *UserUpsert {
|
||||
u.SetExcluded(user.FieldRpmLimit)
|
||||
return u
|
||||
}
|
||||
|
||||
// AddRpmLimit adds v to the "rpm_limit" field.
|
||||
func (u *UserUpsert) AddRpmLimit(v int) *UserUpsert {
|
||||
u.Add(user.FieldRpmLimit, v)
|
||||
return u
|
||||
}
|
||||
|
||||
// UpdateNewValues updates the mutable fields using the new values that were set on create.
|
||||
// Using this option is equivalent to using:
|
||||
//
|
||||
@@ -1771,6 +1814,27 @@ func (u *UserUpsertOne) UpdateTotalRecharged() *UserUpsertOne {
|
||||
})
|
||||
}
|
||||
|
||||
// SetRpmLimit sets the "rpm_limit" field.
|
||||
func (u *UserUpsertOne) SetRpmLimit(v int) *UserUpsertOne {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
s.SetRpmLimit(v)
|
||||
})
|
||||
}
|
||||
|
||||
// AddRpmLimit adds v to the "rpm_limit" field.
|
||||
func (u *UserUpsertOne) AddRpmLimit(v int) *UserUpsertOne {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
s.AddRpmLimit(v)
|
||||
})
|
||||
}
|
||||
|
||||
// UpdateRpmLimit sets the "rpm_limit" field to the value that was provided on create.
|
||||
func (u *UserUpsertOne) UpdateRpmLimit() *UserUpsertOne {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
s.UpdateRpmLimit()
|
||||
})
|
||||
}
|
||||
|
||||
// Exec executes the query.
|
||||
func (u *UserUpsertOne) Exec(ctx context.Context) error {
|
||||
if len(u.create.conflict) == 0 {
|
||||
@@ -2346,6 +2410,27 @@ func (u *UserUpsertBulk) UpdateTotalRecharged() *UserUpsertBulk {
|
||||
})
|
||||
}
|
||||
|
||||
// SetRpmLimit sets the "rpm_limit" field.
|
||||
func (u *UserUpsertBulk) SetRpmLimit(v int) *UserUpsertBulk {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
s.SetRpmLimit(v)
|
||||
})
|
||||
}
|
||||
|
||||
// AddRpmLimit adds v to the "rpm_limit" field.
|
||||
func (u *UserUpsertBulk) AddRpmLimit(v int) *UserUpsertBulk {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
s.AddRpmLimit(v)
|
||||
})
|
||||
}
|
||||
|
||||
// UpdateRpmLimit sets the "rpm_limit" field to the value that was provided on create.
|
||||
func (u *UserUpsertBulk) UpdateRpmLimit() *UserUpsertBulk {
|
||||
return u.Update(func(s *UserUpsert) {
|
||||
s.UpdateRpmLimit()
|
||||
})
|
||||
}
|
||||
|
||||
// Exec executes the query.
|
||||
func (u *UserUpsertBulk) Exec(ctx context.Context) error {
|
||||
if u.create.err != nil {
|
||||
|
||||
Reference in New Issue
Block a user