Merge pull request #7679 from PMExtra/feat/risk-control-allowlist

feat: 新增可信用户风控白名单,保留审计并免除本地自动处罚
This commit is contained in:
Wesley Liddick
2026-09-29 15:53:18 +08:00
committed by GitHub
26 changed files with 598 additions and 45 deletions
@@ -197,6 +197,8 @@ func (r *contentModerationRepository) CountFlaggedByUserSince(ctx context.Contex
return 0, nil
}
// SQL 中的 'cyber_policy' 字面量须与 service.ContentModerationActionCyberPolicy 保持一致。
// 'cyber_log_only' matches service.ContentModerationModeCyberLogOnly; these
// events remain evidence but never become penalties after allowlist removal.
var count int
err := r.db.QueryRowContext(ctx, `
WITH last_auto_ban AS (
@@ -209,6 +211,8 @@ FROM content_moderation_logs
WHERE user_id = $1
AND flagged = TRUE
AND action <> 'hash_block'
AND mode <> 'cyber_log_only'
AND mode <> 'risk_control_log_only'
AND ($3::bool IS FALSE OR action <> 'cyber_policy')
AND created_at >= $2
AND created_at > COALESCE((SELECT at FROM last_auto_ban), '-infinity'::timestamptz)
@@ -102,3 +102,18 @@ func TestContentModerationRepositoryCountFlaggedByUserSince_ExcludesCyberPolicyW
require.Equal(t, 3, count)
require.NoError(t, mock.ExpectationsWereMet())
}
func TestContentModerationRepositoryCountFlaggedByUserSince_ExcludesCyberLogOnly(t *testing.T) {
db, mock, err := sqlmock.New()
require.NoError(t, err)
defer func() { _ = db.Close() }()
repo := NewContentModerationRepository(db)
since := time.Now().Add(-time.Hour)
mock.ExpectQuery(regexp.QuoteMeta("AND mode <> 'cyber_log_only'\n AND mode <> 'risk_control_log_only'")).
WithArgs(int64(12), since, false).
WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(0))
count, err := repo.CountFlaggedByUserSince(context.Background(), 12, since, false)
require.NoError(t, err)
require.Zero(t, count)
require.NoError(t, mock.ExpectationsWereMet())
}