95 lines
2.8 KiB
PL/PgSQL
95 lines
2.8 KiB
PL/PgSQL
-- Restore the 012 local-only publication guard.
|
|
|
|
BEGIN;
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF current_database() <> 'booking_test' THEN
|
|
RAISE EXCEPTION
|
|
'ARR monthly OSS artifact rollback is allowed only in booking_test';
|
|
END IF;
|
|
IF to_regclass('reporting.monthly_runs') IS NULL
|
|
OR to_regprocedure('reporting.validate_monthly_run_publication()') IS NULL THEN
|
|
RAISE EXCEPTION
|
|
'ARR migration 016 is not applied';
|
|
END IF;
|
|
IF EXISTS (
|
|
SELECT 1
|
|
FROM reporting.monthly_runs AS run
|
|
JOIN ingestion.artifacts AS artifact
|
|
ON artifact.id IN (run.workbook_artifact_id, run.result_artifact_id)
|
|
WHERE run.report_status IN ('active', 'superseded')
|
|
AND artifact.storage_provider <> 'local'
|
|
) THEN
|
|
RAISE EXCEPTION
|
|
'ARR monthly OSS artifact rollback refused while a published OSS artifact exists';
|
|
END IF;
|
|
END;
|
|
$$;
|
|
|
|
CREATE OR REPLACE FUNCTION reporting.validate_monthly_run_publication()
|
|
RETURNS trigger
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
DECLARE
|
|
workbook_kind text;
|
|
workbook_provider text;
|
|
result_kind text;
|
|
result_provider text;
|
|
manifest_count integer;
|
|
manifest_rows bigint;
|
|
manifest_min integer;
|
|
manifest_max integer;
|
|
lineage_count integer;
|
|
BEGIN
|
|
IF NEW.report_status NOT IN ('active', 'superseded') THEN
|
|
RETURN NEW;
|
|
END IF;
|
|
|
|
SELECT artifact_kind, storage_provider
|
|
INTO workbook_kind, workbook_provider
|
|
FROM ingestion.artifacts
|
|
WHERE id = NEW.workbook_artifact_id;
|
|
|
|
SELECT artifact_kind, storage_provider
|
|
INTO result_kind, result_provider
|
|
FROM ingestion.artifacts
|
|
WHERE id = NEW.result_artifact_id;
|
|
|
|
IF workbook_kind IS DISTINCT FROM 'monthly_xlsx'
|
|
OR workbook_provider IS DISTINCT FROM 'local'
|
|
OR result_kind IS DISTINCT FROM 'result_json'
|
|
OR result_provider IS DISTINCT FROM 'local' THEN
|
|
RAISE EXCEPTION
|
|
'published monthly run must reference controlled local monthly_xlsx and result_json artifacts';
|
|
END IF;
|
|
|
|
SELECT count(*), COALESCE(sum(row_count), 0), min(worksheet_order), max(worksheet_order)
|
|
INTO manifest_count, manifest_rows, manifest_min, manifest_max
|
|
FROM reporting.monthly_channel_manifest
|
|
WHERE report_id = NEW.id;
|
|
|
|
IF manifest_count <> NEW.channel_count
|
|
OR manifest_rows <> NEW.row_count
|
|
OR manifest_min <> 1
|
|
OR manifest_max <> manifest_count THEN
|
|
RAISE EXCEPTION
|
|
'published monthly run requires a continuous reconciled channel manifest';
|
|
END IF;
|
|
|
|
SELECT count(*)
|
|
INTO lineage_count
|
|
FROM reporting.monthly_run_daily_versions
|
|
WHERE report_id = NEW.id;
|
|
|
|
IF lineage_count < 1 THEN
|
|
RAISE EXCEPTION
|
|
'published monthly run requires daily-version lineage';
|
|
END IF;
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$;
|
|
|
|
COMMIT;
|