From 6715a9c679086da224a4a432666db857696e3ec2 Mon Sep 17 00:00:00 2001 From: aecsocket <43144841+aecsocket@users.noreply.github.com> Date: Tue, 4 Aug 2026 03:15:13 +0900 Subject: [PATCH] fix: global traces QA notes (#6977) * updated at cols + search by path * speed up scanning * migration does not auto-set updated_at * merge migrations --- ...84d26550d01a1917d1af64fe236d63dd5005.json} | 11 ++-- ...bc49666e9fc8a400a5c41660504205e7cac5.json} | 4 +- ...6d08579dff663d5146c2bdfa0812fed6a4587.json | 22 +++++++ ...a48057c24dece008dbf2c00c6ec135d8cef41.json | 60 ++++++++++++++++++ ...7935ac84730b52a2ee090512a460cf512432.json} | 4 +- ...8501addc8f203a0a152346aaebd32db52be30.json | 60 ------------------ ...01239cefbe174f4a5cc4b8eb21a10268cd73.json} | 4 +- ...cf7a059a49387c0c564b730733bda7358f7fe.json | 22 ------- ...20000_delphi_detail_verdict_timestamps.sql | 11 ++++ .../internal/delphi/tech_review_sync.rs | 62 ++++++++++--------- .../routes/internal/moderation/tech_review.rs | 20 ++++-- .../internal/moderation/tech_review/global.rs | 26 ++++++++ 12 files changed, 180 insertions(+), 126 deletions(-) rename apps/labrinth/.sqlx/{query-87d30e8802ebe69858141d0d918cafb5286f984cfe55ad1a7ac2219ec50539a4.json => query-1551b022217df05490a01e715b3584d26550d01a1917d1af64fe236d63dd5005.json} (76%) rename apps/labrinth/.sqlx/{query-4680c4a59c6679f90e3b9e1a33ed1cb1fb60b93ffb79ba5b99e01ee0c14c991a.json => query-33d4e31565ece4a99832cbfd0a39bc49666e9fc8a400a5c41660504205e7cac5.json} (63%) create mode 100644 apps/labrinth/.sqlx/query-58a1fc9e1d76a891c961e02544b6d08579dff663d5146c2bdfa0812fed6a4587.json create mode 100644 apps/labrinth/.sqlx/query-6241bc72a80de01fd8e5506442da48057c24dece008dbf2c00c6ec135d8cef41.json rename apps/labrinth/.sqlx/{query-7ca85bcc45e7d53106ea75b606ce2219bd37be7bb33588179cca6f1a26e5bb23.json => query-7ca9b8f5699f4d60acc50647b7577935ac84730b52a2ee090512a460cf512432.json} (64%) delete mode 100644 apps/labrinth/.sqlx/query-bb94018c84f3809b9ad89f35ff08501addc8f203a0a152346aaebd32db52be30.json rename apps/labrinth/.sqlx/{query-e8b6e423aaf62046afd19fb1e177a3ef1f18f4814df8924926c47d4b0c7145c7.json => query-c40c2085202bc4486568fb24db9201239cefbe174f4a5cc4b8eb21a10268cd73.json} (72%) delete mode 100644 apps/labrinth/.sqlx/query-c9d5796b2c98dedd9f2f237a1a2cf7a059a49387c0c564b730733bda7358f7fe.json create mode 100644 apps/labrinth/migrations/20260803120000_delphi_detail_verdict_timestamps.sql diff --git a/apps/labrinth/.sqlx/query-87d30e8802ebe69858141d0d918cafb5286f984cfe55ad1a7ac2219ec50539a4.json b/apps/labrinth/.sqlx/query-1551b022217df05490a01e715b3584d26550d01a1917d1af64fe236d63dd5005.json similarity index 76% rename from apps/labrinth/.sqlx/query-87d30e8802ebe69858141d0d918cafb5286f984cfe55ad1a7ac2219ec50539a4.json rename to apps/labrinth/.sqlx/query-1551b022217df05490a01e715b3584d26550d01a1917d1af64fe236d63dd5005.json index eabfd4299d..434d224cc7 100644 --- a/apps/labrinth/.sqlx/query-87d30e8802ebe69858141d0d918cafb5286f984cfe55ad1a7ac2219ec50539a4.json +++ b/apps/labrinth/.sqlx/query-1551b022217df05490a01e715b3584d26550d01a1917d1af64fe236d63dd5005.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n WITH ranked_local_traces AS (\n SELECT\n didws.key AS detail_key,\n didws.id AS detail_id,\n didws.issue_id,\n dri.issue_type,\n m.id AS project_id,\n m.slug AS project_slug,\n m.name AS project_name,\n v.id AS version_id,\n v.version_number,\n f.id AS file_id,\n f.filename AS file_name,\n didws.jar,\n didws.file_path,\n didws.severity,\n COALESCE(didv.verdict, 'pending'::delphi_report_issue_status)\n AS local_status,\n didws.status AS effective_status,\n ROW_NUMBER() OVER (\n PARTITION BY didws.key\n ORDER BY didws.id\n ) AS row_num\n FROM delphi_issue_details_with_statuses didws\n INNER JOIN delphi_report_issues dri ON dri.id = didws.issue_id\n INNER JOIN delphi_reports dr ON dr.id = dri.report_id\n INNER JOIN files f ON f.id = dr.file_id\n INNER JOIN versions v ON v.id = f.version_id\n INNER JOIN mods m ON m.id = v.mod_id\n LEFT JOIN delphi_issue_detail_verdicts didv\n ON didv.project_id = didws.project_id\n AND didv.detail_key = didws.key\n WHERE\n didws.key = ANY($1::text[])\n AND dri.issue_type != '__dummy'\n )\n SELECT\n detail_key AS \"detail_key!\",\n detail_id AS \"detail_id!: DelphiReportIssueDetailsId\",\n issue_id AS \"issue_id!: DelphiReportIssueId\",\n issue_type,\n project_id AS \"project_id!: DBProjectId\",\n project_slug AS \"project_slug?\",\n project_name AS \"project_name!\",\n version_id AS \"version_id!: DBVersionId\",\n v.version_number,\n file_id AS \"file_id!: DBFileId\",\n file_name AS \"file_name!\",\n jar AS \"jar?\",\n file_path AS \"file_path!\",\n severity AS \"severity!: DelphiSeverity\",\n local_status AS \"local_status!: DelphiStatus\",\n effective_status AS \"effective_status!: DelphiStatus\"\n FROM ranked_local_traces v\n WHERE row_num <= $2\n ORDER BY detail_key, detail_id\n ", + "query": "\n WITH ranked_local_traces AS (\n SELECT\n didws.key AS detail_key,\n didws.id AS detail_id,\n didws.issue_id,\n dri.issue_type,\n m.id AS project_id,\n m.slug AS project_slug,\n m.name AS project_name,\n v.id AS version_id,\n v.version_number,\n f.id AS file_id,\n f.filename AS file_name,\n didws.jar,\n didws.file_path,\n didws.severity,\n COALESCE(didv.verdict, 'pending'::delphi_report_issue_status)\n AS local_status,\n didws.status AS effective_status,\n ROW_NUMBER() OVER (\n PARTITION BY didws.key\n ORDER BY didws.id\n ) AS row_num\n FROM delphi_issue_details_with_statuses didws\n INNER JOIN delphi_report_issues dri ON dri.id = didws.issue_id\n INNER JOIN delphi_reports dr ON dr.id = dri.report_id\n INNER JOIN files f ON f.id = dr.file_id\n INNER JOIN versions v ON v.id = f.version_id\n INNER JOIN mods m ON m.id = v.mod_id\n LEFT JOIN delphi_issue_detail_verdicts didv\n ON didv.project_id = didws.project_id\n AND didv.detail_key = didws.key\n WHERE\n didws.key = ANY($1::text[])\n AND dri.issue_type != '__dummy'\n AND (\n $3::text IS NULL\n OR didws.key ILIKE '%' || $3 || '%'\n OR didws.file_path ILIKE '%' || $3 || '%'\n )\n )\n SELECT\n detail_key AS \"detail_key!\",\n detail_id AS \"detail_id!: DelphiReportIssueDetailsId\",\n issue_id AS \"issue_id!: DelphiReportIssueId\",\n issue_type,\n project_id AS \"project_id!: DBProjectId\",\n project_slug AS \"project_slug?\",\n project_name AS \"project_name!\",\n version_id AS \"version_id!: DBVersionId\",\n v.version_number,\n file_id AS \"file_id!: DBFileId\",\n file_name AS \"file_name!\",\n jar AS \"jar?\",\n file_path AS \"file_path!\",\n severity AS \"severity!: DelphiSeverity\",\n local_status AS \"local_status!: DelphiStatus\",\n effective_status AS \"effective_status!: DelphiStatus\"\n FROM ranked_local_traces v\n WHERE row_num <= $2\n ORDER BY detail_key, detail_id\n ", "describe": { "columns": [ { @@ -76,10 +76,12 @@ "name": "delphi_severity", "kind": { "Enum": [ + "hidden", "low", "medium", "high", - "severe" + "severe", + "malware" ] } } @@ -121,7 +123,8 @@ "parameters": { "Left": [ "TextArray", - "Int8" + "Int8", + "Text" ] }, "nullable": [ @@ -143,5 +146,5 @@ true ] }, - "hash": "87d30e8802ebe69858141d0d918cafb5286f984cfe55ad1a7ac2219ec50539a4" + "hash": "1551b022217df05490a01e715b3584d26550d01a1917d1af64fe236d63dd5005" } diff --git a/apps/labrinth/.sqlx/query-4680c4a59c6679f90e3b9e1a33ed1cb1fb60b93ffb79ba5b99e01ee0c14c991a.json b/apps/labrinth/.sqlx/query-33d4e31565ece4a99832cbfd0a39bc49666e9fc8a400a5c41660504205e7cac5.json similarity index 63% rename from apps/labrinth/.sqlx/query-4680c4a59c6679f90e3b9e1a33ed1cb1fb60b93ffb79ba5b99e01ee0c14c991a.json rename to apps/labrinth/.sqlx/query-33d4e31565ece4a99832cbfd0a39bc49666e9fc8a400a5c41660504205e7cac5.json index 21c5f042e6..509e4cc4dd 100644 --- a/apps/labrinth/.sqlx/query-4680c4a59c6679f90e3b9e1a33ed1cb1fb60b93ffb79ba5b99e01ee0c14c991a.json +++ b/apps/labrinth/.sqlx/query-33d4e31565ece4a99832cbfd0a39bc49666e9fc8a400a5c41660504205e7cac5.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n dgdv.detail_key,\n dgdv.verdict AS \"verdict!: DelphiStatus\",\n COUNT(dri.id) AS \"local_trace_count!\"\n FROM delphi_global_detail_verdicts dgdv\n LEFT JOIN delphi_issue_details_with_statuses didws\n ON didws.key = dgdv.detail_key\n LEFT JOIN delphi_report_issues dri\n ON dri.id = didws.issue_id\n AND dri.issue_type != '__dummy'\n WHERE (\n $1::text IS NULL\n OR dgdv.detail_key ILIKE '%' || $1 || '%'\n )\n GROUP BY dgdv.detail_key, dgdv.verdict\n ORDER BY dgdv.detail_key\n LIMIT $2 OFFSET $3\n ", + "query": "\n SELECT\n dgdv.detail_key,\n dgdv.verdict AS \"verdict!: DelphiStatus\",\n COUNT(dri.id) AS \"local_trace_count!\"\n FROM delphi_global_detail_verdicts dgdv\n LEFT JOIN delphi_issue_details_with_statuses didws\n ON didws.key = dgdv.detail_key\n LEFT JOIN delphi_report_issues dri\n ON dri.id = didws.issue_id\n AND dri.issue_type != '__dummy'\n WHERE (\n $1::text IS NULL\n OR dgdv.detail_key ILIKE '%' || $1 || '%'\n OR EXISTS (\n SELECT 1\n FROM delphi_issue_details_with_statuses matching_didws\n INNER JOIN delphi_report_issues matching_dri\n ON matching_dri.id = matching_didws.issue_id\n WHERE\n matching_didws.key = dgdv.detail_key\n AND matching_dri.issue_type != '__dummy'\n AND matching_didws.file_path ILIKE '%' || $1 || '%'\n )\n )\n GROUP BY dgdv.detail_key, dgdv.verdict\n ORDER BY dgdv.detail_key\n LIMIT $2 OFFSET $3\n ", "describe": { "columns": [ { @@ -43,5 +43,5 @@ null ] }, - "hash": "4680c4a59c6679f90e3b9e1a33ed1cb1fb60b93ffb79ba5b99e01ee0c14c991a" + "hash": "33d4e31565ece4a99832cbfd0a39bc49666e9fc8a400a5c41660504205e7cac5" } diff --git a/apps/labrinth/.sqlx/query-58a1fc9e1d76a891c961e02544b6d08579dff663d5146c2bdfa0812fed6a4587.json b/apps/labrinth/.sqlx/query-58a1fc9e1d76a891c961e02544b6d08579dff663d5146c2bdfa0812fed6a4587.json new file mode 100644 index 0000000000..772f1d9346 --- /dev/null +++ b/apps/labrinth/.sqlx/query-58a1fc9e1d76a891c961e02544b6d08579dff663d5146c2bdfa0812fed6a4587.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT COUNT(*) AS \"total!\"\n FROM delphi_global_detail_verdicts dgdv\n WHERE (\n $1::text IS NULL\n OR dgdv.detail_key ILIKE '%' || $1 || '%'\n OR EXISTS (\n SELECT 1\n FROM delphi_issue_details_with_statuses matching_didws\n INNER JOIN delphi_report_issues matching_dri\n ON matching_dri.id = matching_didws.issue_id\n WHERE\n matching_didws.key = dgdv.detail_key\n AND matching_dri.issue_type != '__dummy'\n AND matching_didws.file_path ILIKE '%' || $1 || '%'\n )\n )\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "total!", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "58a1fc9e1d76a891c961e02544b6d08579dff663d5146c2bdfa0812fed6a4587" +} diff --git a/apps/labrinth/.sqlx/query-6241bc72a80de01fd8e5506442da48057c24dece008dbf2c00c6ec135d8cef41.json b/apps/labrinth/.sqlx/query-6241bc72a80de01fd8e5506442da48057c24dece008dbf2c00c6ec135d8cef41.json new file mode 100644 index 0000000000..665cd936e4 --- /dev/null +++ b/apps/labrinth/.sqlx/query-6241bc72a80de01fd8e5506442da48057c24dece008dbf2c00c6ec135d8cef41.json @@ -0,0 +1,60 @@ +{ + "db_name": "PostgreSQL", + "query": "\n WITH project_ids AS (\n SELECT unnest($1::bigint[]) AS project_id\n ),\n detail_states AS (\n SELECT\n p.project_id,\n COALESCE(\n BOOL_OR(\n didws.status = 'pending'\n AND dri.issue_type != $3\n ),\n FALSE\n ) AS has_pending_detail,\n COALESCE(\n BOOL_OR(\n didws.status = 'unsafe'\n AND dri.issue_type != $3\n ),\n FALSE\n ) AS has_unsafe_detail,\n COALESCE(\n BOOL_OR(\n didws.status = 'pending'\n AND dri.issue_type = $3\n ),\n FALSE\n ) AS has_dummy\n FROM project_ids p\n LEFT JOIN delphi_issue_details_with_statuses didws\n ON didws.project_id = p.project_id\n LEFT JOIN delphi_report_issues dri ON dri.id = didws.issue_id\n GROUP BY p.project_id\n )\n SELECT\n p.project_id AS \"project_id!: DBProjectId\",\n p.has_pending_detail AS \"has_pending_detail!\",\n p.has_unsafe_detail AS \"has_unsafe_detail!\",\n p.has_dummy AS \"has_dummy!\",\n (\n SELECT t.id\n FROM threads t\n WHERE t.mod_id = p.project_id\n ORDER BY t.id\n LIMIT 1\n ) AS \"thread_id: DBThreadId\",\n (\n SELECT tm.body->>'type'\n FROM threads t\n INNER JOIN threads_messages tm ON tm.thread_id = t.id\n WHERE\n t.mod_id = p.project_id\n AND tm.body->>'type' = ANY($2::text[])\n ORDER BY tm.created DESC, tm.id DESC\n LIMIT 1\n ) AS \"last_tech_review_message_type\",\n (\n SELECT dr.id\n FROM versions v\n INNER JOIN files f ON f.version_id = v.id\n INNER JOIN delphi_reports dr ON dr.file_id = f.id\n WHERE v.mod_id = p.project_id\n ORDER BY dr.created DESC, dr.id DESC\n LIMIT 1\n ) AS \"report_id: DelphiReportId\"\n FROM detail_states p\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "project_id!: DBProjectId", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "has_pending_detail!", + "type_info": "Bool" + }, + { + "ordinal": 2, + "name": "has_unsafe_detail!", + "type_info": "Bool" + }, + { + "ordinal": 3, + "name": "has_dummy!", + "type_info": "Bool" + }, + { + "ordinal": 4, + "name": "thread_id: DBThreadId", + "type_info": "Int8" + }, + { + "ordinal": 5, + "name": "last_tech_review_message_type", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "report_id: DelphiReportId", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8Array", + "TextArray", + "Text" + ] + }, + "nullable": [ + null, + null, + null, + null, + null, + null, + null + ] + }, + "hash": "6241bc72a80de01fd8e5506442da48057c24dece008dbf2c00c6ec135d8cef41" +} diff --git a/apps/labrinth/.sqlx/query-7ca85bcc45e7d53106ea75b606ce2219bd37be7bb33588179cca6f1a26e5bb23.json b/apps/labrinth/.sqlx/query-7ca9b8f5699f4d60acc50647b7577935ac84730b52a2ee090512a460cf512432.json similarity index 64% rename from apps/labrinth/.sqlx/query-7ca85bcc45e7d53106ea75b606ce2219bd37be7bb33588179cca6f1a26e5bb23.json rename to apps/labrinth/.sqlx/query-7ca9b8f5699f4d60acc50647b7577935ac84730b52a2ee090512a460cf512432.json index f97540b2bc..606f1b807f 100644 --- a/apps/labrinth/.sqlx/query-7ca85bcc45e7d53106ea75b606ce2219bd37be7bb33588179cca6f1a26e5bb23.json +++ b/apps/labrinth/.sqlx/query-7ca9b8f5699f4d60acc50647b7577935ac84730b52a2ee090512a460cf512432.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n WITH incoming AS (\n SELECT *\n FROM unnest($1::text[], $2::text[]) WITH ORDINALITY\n AS u(detail_key, verdict, ord)\n ),\n latest AS (\n SELECT DISTINCT ON (detail_key)\n detail_key,\n verdict\n FROM incoming\n ORDER BY detail_key, ord DESC\n ),\n deleted AS (\n DELETE FROM delphi_global_detail_verdicts dgdv\n USING latest\n WHERE\n dgdv.detail_key = latest.detail_key\n AND latest.verdict = 'pending'\n RETURNING 1\n )\n INSERT INTO delphi_global_detail_verdicts (\n detail_key,\n verdict\n )\n SELECT\n detail_key,\n verdict::delphi_report_issue_status\n FROM latest\n WHERE verdict != 'pending'\n ON CONFLICT (detail_key)\n DO UPDATE SET verdict = EXCLUDED.verdict\n ", + "query": "\n WITH incoming AS (\n SELECT *\n FROM unnest($1::text[], $2::text[]) WITH ORDINALITY\n AS u(detail_key, verdict, ord)\n ),\n latest AS (\n SELECT DISTINCT ON (detail_key)\n detail_key,\n verdict\n FROM incoming\n ORDER BY detail_key, ord DESC\n ),\n deleted AS (\n DELETE FROM delphi_global_detail_verdicts dgdv\n USING latest\n WHERE\n dgdv.detail_key = latest.detail_key\n AND latest.verdict = 'pending'\n RETURNING 1\n )\n INSERT INTO delphi_global_detail_verdicts (\n detail_key,\n verdict,\n updated_at\n )\n SELECT\n detail_key,\n verdict::delphi_report_issue_status,\n NOW()\n FROM latest\n WHERE verdict != 'pending'\n ON CONFLICT (detail_key)\n DO UPDATE SET\n verdict = EXCLUDED.verdict,\n updated_at = EXCLUDED.updated_at\n ", "describe": { "columns": [], "parameters": { @@ -11,5 +11,5 @@ }, "nullable": [] }, - "hash": "7ca85bcc45e7d53106ea75b606ce2219bd37be7bb33588179cca6f1a26e5bb23" + "hash": "7ca9b8f5699f4d60acc50647b7577935ac84730b52a2ee090512a460cf512432" } diff --git a/apps/labrinth/.sqlx/query-bb94018c84f3809b9ad89f35ff08501addc8f203a0a152346aaebd32db52be30.json b/apps/labrinth/.sqlx/query-bb94018c84f3809b9ad89f35ff08501addc8f203a0a152346aaebd32db52be30.json deleted file mode 100644 index 247c99cd89..0000000000 --- a/apps/labrinth/.sqlx/query-bb94018c84f3809b9ad89f35ff08501addc8f203a0a152346aaebd32db52be30.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n WITH project_ids AS (\n SELECT unnest($1::bigint[]) AS project_id\n )\n SELECT\n p.project_id AS \"project_id!: DBProjectId\",\n EXISTS(\n SELECT 1\n FROM delphi_issue_details_with_statuses didws\n INNER JOIN delphi_report_issues dri ON dri.id = didws.issue_id\n WHERE\n didws.project_id = p.project_id\n AND didws.status = 'pending'\n AND dri.issue_type != $3\n ) AS \"has_pending_detail!\",\n EXISTS(\n SELECT 1\n FROM delphi_issue_details_with_statuses didws\n INNER JOIN delphi_report_issues dri ON dri.id = didws.issue_id\n WHERE\n didws.project_id = p.project_id\n AND didws.status = 'unsafe'\n AND dri.issue_type != $3\n ) AS \"has_unsafe_detail!\",\n EXISTS(\n SELECT 1\n FROM delphi_issue_details_with_statuses didws\n INNER JOIN delphi_report_issues dri ON dri.id = didws.issue_id\n WHERE\n didws.project_id = p.project_id\n AND didws.status = 'pending'\n AND dri.issue_type = $3\n ) AS \"has_dummy!\",\n (\n SELECT t.id\n FROM threads t\n WHERE t.mod_id = p.project_id\n ORDER BY t.id\n LIMIT 1\n ) AS \"thread_id: DBThreadId\",\n (\n SELECT tm.body->>'type'\n FROM threads t\n INNER JOIN threads_messages tm ON tm.thread_id = t.id\n WHERE\n t.mod_id = p.project_id\n AND tm.body->>'type' = ANY($2::text[])\n ORDER BY tm.created DESC, tm.id DESC\n LIMIT 1\n ) AS \"last_tech_review_message_type\",\n (\n SELECT dr.id\n FROM versions v\n INNER JOIN files f ON f.version_id = v.id\n INNER JOIN delphi_reports dr ON dr.file_id = f.id\n WHERE v.mod_id = p.project_id\n ORDER BY dr.created DESC, dr.id DESC\n LIMIT 1\n ) AS \"report_id: DelphiReportId\"\n FROM project_ids p\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "project_id!: DBProjectId", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "has_pending_detail!", - "type_info": "Bool" - }, - { - "ordinal": 2, - "name": "has_unsafe_detail!", - "type_info": "Bool" - }, - { - "ordinal": 3, - "name": "has_dummy!", - "type_info": "Bool" - }, - { - "ordinal": 4, - "name": "thread_id: DBThreadId", - "type_info": "Int8" - }, - { - "ordinal": 5, - "name": "last_tech_review_message_type", - "type_info": "Text" - }, - { - "ordinal": 6, - "name": "report_id: DelphiReportId", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Int8Array", - "TextArray", - "Text" - ] - }, - "nullable": [ - null, - null, - null, - null, - null, - null, - null - ] - }, - "hash": "bb94018c84f3809b9ad89f35ff08501addc8f203a0a152346aaebd32db52be30" -} diff --git a/apps/labrinth/.sqlx/query-e8b6e423aaf62046afd19fb1e177a3ef1f18f4814df8924926c47d4b0c7145c7.json b/apps/labrinth/.sqlx/query-c40c2085202bc4486568fb24db9201239cefbe174f4a5cc4b8eb21a10268cd73.json similarity index 72% rename from apps/labrinth/.sqlx/query-e8b6e423aaf62046afd19fb1e177a3ef1f18f4814df8924926c47d4b0c7145c7.json rename to apps/labrinth/.sqlx/query-c40c2085202bc4486568fb24db9201239cefbe174f4a5cc4b8eb21a10268cd73.json index 1e3e8c4d7f..81c343b584 100644 --- a/apps/labrinth/.sqlx/query-e8b6e423aaf62046afd19fb1e177a3ef1f18f4814df8924926c47d4b0c7145c7.json +++ b/apps/labrinth/.sqlx/query-c40c2085202bc4486568fb24db9201239cefbe174f4a5cc4b8eb21a10268cd73.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n WITH incoming AS (\n SELECT *\n FROM unnest($1::bigint[], $2::text[]) WITH ORDINALITY\n AS u(detail_id, verdict, ord)\n ),\n resolved AS (\n SELECT\n i.ord,\n didws.project_id,\n didws.key AS detail_key,\n i.verdict\n FROM incoming i\n INNER JOIN delphi_issue_details_with_statuses didws ON didws.id = i.detail_id\n INNER JOIN delphi_report_issues dri ON dri.id = didws.issue_id\n WHERE\n -- see delphi.rs todo comment\n dri.issue_type != '__dummy'\n ),\n validated AS (\n SELECT\n (SELECT COUNT(*) FROM incoming) AS incoming_count,\n (SELECT COUNT(*) FROM resolved) AS resolved_count\n ),\n latest AS (\n SELECT DISTINCT ON (project_id, detail_key)\n project_id,\n detail_key,\n verdict\n FROM resolved\n ORDER BY project_id, detail_key, ord DESC\n ),\n deleted AS (\n DELETE FROM delphi_issue_detail_verdicts didv\n USING latest\n WHERE\n didv.project_id = latest.project_id\n AND didv.detail_key = latest.detail_key\n AND latest.verdict = 'pending'\n RETURNING 1\n ),\n upserted AS (\n INSERT INTO delphi_issue_detail_verdicts (\n project_id,\n detail_key,\n verdict\n )\n SELECT\n project_id,\n detail_key,\n verdict::delphi_report_issue_status\n FROM latest\n WHERE verdict != 'pending'\n ON CONFLICT (project_id, detail_key)\n DO UPDATE SET verdict = EXCLUDED.verdict\n RETURNING 1\n )\n SELECT\n (v.incoming_count = v.resolved_count) AS \"all_found!\",\n (SELECT COUNT(*) FROM upserted) AS \"upserted_count!\"\n FROM validated v\n ", + "query": "\n WITH incoming AS (\n SELECT *\n FROM unnest($1::bigint[], $2::text[]) WITH ORDINALITY\n AS u(detail_id, verdict, ord)\n ),\n resolved AS (\n SELECT\n i.ord,\n didws.project_id,\n didws.key AS detail_key,\n i.verdict\n FROM incoming i\n INNER JOIN delphi_issue_details_with_statuses didws ON didws.id = i.detail_id\n INNER JOIN delphi_report_issues dri ON dri.id = didws.issue_id\n WHERE\n -- see delphi.rs todo comment\n dri.issue_type != '__dummy'\n ),\n validated AS (\n SELECT\n (SELECT COUNT(*) FROM incoming) AS incoming_count,\n (SELECT COUNT(*) FROM resolved) AS resolved_count\n ),\n latest AS (\n SELECT DISTINCT ON (project_id, detail_key)\n project_id,\n detail_key,\n verdict\n FROM resolved\n ORDER BY project_id, detail_key, ord DESC\n ),\n deleted AS (\n DELETE FROM delphi_issue_detail_verdicts didv\n USING latest\n WHERE\n didv.project_id = latest.project_id\n AND didv.detail_key = latest.detail_key\n AND latest.verdict = 'pending'\n RETURNING 1\n ),\n upserted AS (\n INSERT INTO delphi_issue_detail_verdicts (\n project_id,\n detail_key,\n verdict,\n updated_at\n )\n SELECT\n project_id,\n detail_key,\n verdict::delphi_report_issue_status,\n NOW()\n FROM latest\n WHERE verdict != 'pending'\n ON CONFLICT (project_id, detail_key)\n DO UPDATE SET\n verdict = EXCLUDED.verdict,\n updated_at = EXCLUDED.updated_at\n RETURNING 1\n )\n SELECT\n (v.incoming_count = v.resolved_count) AS \"all_found!\",\n (SELECT COUNT(*) FROM upserted) AS \"upserted_count!\"\n FROM validated v\n ", "describe": { "columns": [ { @@ -25,5 +25,5 @@ null ] }, - "hash": "e8b6e423aaf62046afd19fb1e177a3ef1f18f4814df8924926c47d4b0c7145c7" + "hash": "c40c2085202bc4486568fb24db9201239cefbe174f4a5cc4b8eb21a10268cd73" } diff --git a/apps/labrinth/.sqlx/query-c9d5796b2c98dedd9f2f237a1a2cf7a059a49387c0c564b730733bda7358f7fe.json b/apps/labrinth/.sqlx/query-c9d5796b2c98dedd9f2f237a1a2cf7a059a49387c0c564b730733bda7358f7fe.json deleted file mode 100644 index 3d0aa419ad..0000000000 --- a/apps/labrinth/.sqlx/query-c9d5796b2c98dedd9f2f237a1a2cf7a059a49387c0c564b730733bda7358f7fe.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT COUNT(*) AS \"total!\"\n FROM delphi_global_detail_verdicts dgdv\n WHERE (\n $1::text IS NULL\n OR dgdv.detail_key ILIKE '%' || $1 || '%'\n )\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "total!", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Text" - ] - }, - "nullable": [ - null - ] - }, - "hash": "c9d5796b2c98dedd9f2f237a1a2cf7a059a49387c0c564b730733bda7358f7fe" -} diff --git a/apps/labrinth/migrations/20260803120000_delphi_detail_verdict_timestamps.sql b/apps/labrinth/migrations/20260803120000_delphi_detail_verdict_timestamps.sql new file mode 100644 index 0000000000..8ed20055a5 --- /dev/null +++ b/apps/labrinth/migrations/20260803120000_delphi_detail_verdict_timestamps.sql @@ -0,0 +1,11 @@ +ALTER TABLE delphi_issue_detail_verdicts + ADD COLUMN updated_at TIMESTAMPTZ; + +ALTER TABLE delphi_global_detail_verdicts + ADD COLUMN updated_at TIMESTAMPTZ; + +CREATE INDEX delphi_report_issue_details_issue_id + ON delphi_report_issue_details (issue_id); + +CREATE INDEX threads_messages_thread_id_created_id + ON threads_messages (thread_id, created DESC, id DESC); diff --git a/apps/labrinth/src/routes/internal/delphi/tech_review_sync.rs b/apps/labrinth/src/routes/internal/delphi/tech_review_sync.rs index 23a45d218a..e67c9e517e 100644 --- a/apps/labrinth/src/routes/internal/delphi/tech_review_sync.rs +++ b/apps/labrinth/src/routes/internal/delphi/tech_review_sync.rs @@ -88,36 +88,42 @@ pub async fn sync_project_tech_review_state( r#" WITH project_ids AS ( SELECT unnest($1::bigint[]) AS project_id + ), + detail_states AS ( + SELECT + p.project_id, + COALESCE( + BOOL_OR( + didws.status = 'pending' + AND dri.issue_type != $3 + ), + FALSE + ) AS has_pending_detail, + COALESCE( + BOOL_OR( + didws.status = 'unsafe' + AND dri.issue_type != $3 + ), + FALSE + ) AS has_unsafe_detail, + COALESCE( + BOOL_OR( + didws.status = 'pending' + AND dri.issue_type = $3 + ), + FALSE + ) AS has_dummy + FROM project_ids p + LEFT JOIN delphi_issue_details_with_statuses didws + ON didws.project_id = p.project_id + LEFT JOIN delphi_report_issues dri ON dri.id = didws.issue_id + GROUP BY p.project_id ) SELECT p.project_id AS "project_id!: DBProjectId", - EXISTS( - SELECT 1 - FROM delphi_issue_details_with_statuses didws - INNER JOIN delphi_report_issues dri ON dri.id = didws.issue_id - WHERE - didws.project_id = p.project_id - AND didws.status = 'pending' - AND dri.issue_type != $3 - ) AS "has_pending_detail!", - EXISTS( - SELECT 1 - FROM delphi_issue_details_with_statuses didws - INNER JOIN delphi_report_issues dri ON dri.id = didws.issue_id - WHERE - didws.project_id = p.project_id - AND didws.status = 'unsafe' - AND dri.issue_type != $3 - ) AS "has_unsafe_detail!", - EXISTS( - SELECT 1 - FROM delphi_issue_details_with_statuses didws - INNER JOIN delphi_report_issues dri ON dri.id = didws.issue_id - WHERE - didws.project_id = p.project_id - AND didws.status = 'pending' - AND dri.issue_type = $3 - ) AS "has_dummy!", + p.has_pending_detail AS "has_pending_detail!", + p.has_unsafe_detail AS "has_unsafe_detail!", + p.has_dummy AS "has_dummy!", ( SELECT t.id FROM threads t @@ -144,7 +150,7 @@ pub async fn sync_project_tech_review_state( ORDER BY dr.created DESC, dr.id DESC LIMIT 1 ) AS "report_id: DelphiReportId" - FROM project_ids p + FROM detail_states p "#, &project_ids_raw, &tech_review_message_types, diff --git a/apps/labrinth/src/routes/internal/moderation/tech_review.rs b/apps/labrinth/src/routes/internal/moderation/tech_review.rs index 2cb592533b..ea694627eb 100644 --- a/apps/labrinth/src/routes/internal/moderation/tech_review.rs +++ b/apps/labrinth/src/routes/internal/moderation/tech_review.rs @@ -1288,16 +1288,20 @@ pub async fn update_issue_details( INSERT INTO delphi_issue_detail_verdicts ( project_id, detail_key, - verdict + verdict, + updated_at ) SELECT project_id, detail_key, - verdict::delphi_report_issue_status + verdict::delphi_report_issue_status, + NOW() FROM latest WHERE verdict != 'pending' ON CONFLICT (project_id, detail_key) - DO UPDATE SET verdict = EXCLUDED.verdict + DO UPDATE SET + verdict = EXCLUDED.verdict, + updated_at = EXCLUDED.updated_at RETURNING 1 ) SELECT @@ -1431,15 +1435,19 @@ pub async fn update_global_issue_details( ) INSERT INTO delphi_global_detail_verdicts ( detail_key, - verdict + verdict, + updated_at ) SELECT detail_key, - verdict::delphi_report_issue_status + verdict::delphi_report_issue_status, + NOW() FROM latest WHERE verdict != 'pending' ON CONFLICT (detail_key) - DO UPDATE SET verdict = EXCLUDED.verdict + DO UPDATE SET + verdict = EXCLUDED.verdict, + updated_at = EXCLUDED.updated_at "#, &detail_keys, &verdicts, diff --git a/apps/labrinth/src/routes/internal/moderation/tech_review/global.rs b/apps/labrinth/src/routes/internal/moderation/tech_review/global.rs index 6b69125466..c152d5c2f9 100644 --- a/apps/labrinth/src/routes/internal/moderation/tech_review/global.rs +++ b/apps/labrinth/src/routes/internal/moderation/tech_review/global.rs @@ -170,6 +170,16 @@ pub async fn search_global_issue_details( WHERE ( $1::text IS NULL OR dgdv.detail_key ILIKE '%' || $1 || '%' + OR EXISTS ( + SELECT 1 + FROM delphi_issue_details_with_statuses matching_didws + INNER JOIN delphi_report_issues matching_dri + ON matching_dri.id = matching_didws.issue_id + WHERE + matching_didws.key = dgdv.detail_key + AND matching_dri.issue_type != '__dummy' + AND matching_didws.file_path ILIKE '%' || $1 || '%' + ) ) "#, query, @@ -194,6 +204,16 @@ pub async fn search_global_issue_details( WHERE ( $1::text IS NULL OR dgdv.detail_key ILIKE '%' || $1 || '%' + OR EXISTS ( + SELECT 1 + FROM delphi_issue_details_with_statuses matching_didws + INNER JOIN delphi_report_issues matching_dri + ON matching_dri.id = matching_didws.issue_id + WHERE + matching_didws.key = dgdv.detail_key + AND matching_dri.issue_type != '__dummy' + AND matching_didws.file_path ILIKE '%' || $1 || '%' + ) ) GROUP BY dgdv.detail_key, dgdv.verdict ORDER BY dgdv.detail_key @@ -249,6 +269,11 @@ pub async fn search_global_issue_details( WHERE didws.key = ANY($1::text[]) AND dri.issue_type != '__dummy' + AND ( + $3::text IS NULL + OR didws.key ILIKE '%' || $3 || '%' + OR didws.file_path ILIKE '%' || $3 || '%' + ) ) SELECT detail_key AS "detail_key!", @@ -273,6 +298,7 @@ pub async fn search_global_issue_details( "#, &detail_keys, LOCAL_TRACE_PREVIEW_LIMIT, + query, ) .fetch_all(&**pool) .await