fix(risk/report): close Phase 17 KEEP-VERIFY/EXTEND — 6 defects + 1 hidden compile defect (jakarta) + test-coverage blind zone (3 missing tables); add sensitive-access audit + ReportAndRiskPhase17IntegrationTest (7); full regression 488 green

This commit is contained in:
WorkBuddy
2026-09-17 20:42:09 +08:00
parent 556f95a562
commit 307c9efb36
13 changed files with 540 additions and 17 deletions
+53
View File
@@ -358,3 +358,56 @@ CREATE TABLE matchmaker_followups (
deleted_at TIMESTAMP WITH TIME ZONE
);
-- Phase 17:举报与风控三表(与 V012__add_risk_and_report_tables.sql 生产 DDL 对齐)。
-- 此前完全缺失 → ReportService / RiskReferralService 整条真实 DB 路径零覆盖,
-- 且 ReportServiceTest 只能写 assertTrue(true) 假绿。已补入并移出 TEST_SCHEMA_OPTIONAL_TABLES 白名单。
-- 注意:H2 无 operators 表,故去掉生产 DDL 中的 REFERENCES operators(id) 外键;
-- 保留 status / action_type 的 CHECK 约束,防止非法取值在测试期被静默放过(同 Phase 14/15/16 原则)。
CREATE TABLE reports (
id VARCHAR(36) PRIMARY KEY,
reporter_user_id VARCHAR(36) NOT NULL,
reported_user_id VARCHAR(36),
reason_type VARCHAR(64) NOT NULL,
description CLOB,
evidence_file_ids CLOB,
status VARCHAR(32) NOT NULL DEFAULT 'pending',
process_result VARCHAR(64),
processed_by VARCHAR(36),
processed_at TIMESTAMP WITH TIME ZONE,
process_note CLOB,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE,
deleted_at TIMESTAMP WITH TIME ZONE,
CONSTRAINT chk_report_status CHECK (status IN ('pending', 'processing', 'resolved', 'rejected', 'dismissed'))
);
CREATE TABLE risk_events (
id VARCHAR(36) PRIMARY KEY,
user_id VARCHAR(36) NOT NULL,
event_type VARCHAR(64) NOT NULL,
score INT NOT NULL DEFAULT 0,
source VARCHAR(32) NOT NULL DEFAULT 'auto',
source_id VARCHAR(128),
note CLOB,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE,
deleted_at TIMESTAMP WITH TIME ZONE
);
CREATE TABLE risk_actions (
id VARCHAR(36) PRIMARY KEY,
user_id VARCHAR(36) NOT NULL,
action_type VARCHAR(64) NOT NULL,
reason VARCHAR(256) NOT NULL,
reason_detail CLOB,
created_by VARCHAR(36) NOT NULL,
effective_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
expires_at TIMESTAMP WITH TIME ZONE,
status VARCHAR(32) NOT NULL DEFAULT 'active',
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE,
deleted_at TIMESTAMP WITH TIME ZONE,
CONSTRAINT chk_risk_action_type CHECK (action_type IN ('warning', 'feature_limit', 'temporary_suspend', 'ban')),
CONSTRAINT chk_risk_action_status CHECK (status IN ('active', 'resolved', 'expired'))
);