Files
modrinth/apps/labrinth/migrations/20260720105358_delphi_trace_rules.sql
T
2026-08-02 15:08:27 +01:00

104 lines
2.9 KiB
SQL

ALTER TYPE delphi_severity ADD VALUE IF NOT EXISTS 'hidden' BEFORE 'low';
ALTER TYPE delphi_severity ADD VALUE IF NOT EXISTS 'malware' AFTER 'severe';
CREATE TABLE delphi_rules (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
created_by BIGINT REFERENCES users(id)
ON DELETE SET NULL,
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_by BIGINT REFERENCES users(id)
ON DELETE SET NULL,
name VARCHAR(256) NOT NULL,
rule VARCHAR(65536) NOT NULL,
priority INTEGER NOT NULL DEFAULT 0,
revision BIGINT NOT NULL DEFAULT 0,
delete_on_next_revision BOOL NOT NULL DEFAULT FALSE
);
CREATE TABLE delphi_rule_revisions (
revision BIGINT PRIMARY KEY
);
INSERT INTO delphi_rule_revisions (revision)
VALUES (1);
CREATE TABLE delphi_rule_effects (
revision BIGINT NOT NULL,
detail_id BIGINT NOT NULL REFERENCES delphi_report_issue_details(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
rule_id BIGINT NOT NULL REFERENCES delphi_rules(id)
ON UPDATE CASCADE,
severity delphi_severity NOT NULL,
PRIMARY KEY (revision, detail_id)
);
CREATE INDEX delphi_rule_effects_rule_id ON delphi_rule_effects(rule_id);
DROP VIEW delphi_issue_details_with_statuses;
CREATE VIEW delphi_issue_details_with_statuses AS
SELECT
drid.id,
drid.issue_id,
drid.key,
drid.jar,
drid.file_path,
drid.decompiled_source,
drid.data,
drid.severity AS original_severity,
COALESCE(dre.severity, drid.severity) AS severity,
m.id AS project_id,
didv.verdict AS local_status,
dgdv.verdict AS global_status,
COALESCE(dgdv.verdict, didv.verdict, 'pending') AS status
FROM delphi_report_issue_details drid
INNER JOIN delphi_report_issues dri ON dri.id = drid.issue_id
INNER JOIN delphi_reports dr ON dr.id = dri.report_id
INNER JOIN files f ON f.id = dr.file_id
INNER JOIN versions v ON v.id = f.version_id
INNER JOIN mods m ON m.id = v.mod_id
LEFT JOIN delphi_global_detail_verdicts dgdv
ON drid.key = dgdv.detail_key
LEFT JOIN delphi_issue_detail_verdicts didv
ON m.id = didv.project_id
AND drid.key = didv.detail_key
LEFT JOIN (
SELECT revision
FROM delphi_rule_revisions
LIMIT 1
) drr ON TRUE
LEFT JOIN delphi_rule_effects dre
ON dre.revision = drr.revision
AND dre.detail_id = drid.id;
CREATE TABLE delphi_tech_review_queue (
project_id BIGINT PRIMARY KEY REFERENCES mods(id)
ON DELETE CASCADE
);
INSERT INTO delphi_tech_review_queue (project_id)
SELECT DISTINCT didws.project_id
FROM delphi_issue_details_with_statuses didws
INNER JOIN delphi_report_issues dri ON dri.id = didws.issue_id
WHERE
(
dri.issue_type = '__dummy'
AND didws.status = 'pending'
)
OR (
dri.issue_type != '__dummy'
AND didws.status IN ('pending', 'unsafe')
AND didws.severity::text != 'hidden'
);
DELETE FROM delphi_report_issue_details detail
USING delphi_report_issues issue
WHERE
detail.issue_id = issue.id
AND issue.issue_type = '__dummy';
DELETE FROM delphi_report_issues
WHERE issue_type = '__dummy';