-- +goose Up CREATE TABLE procurement_reference_sources ( procurement_request_id TEXT PRIMARY KEY NOT NULL REFERENCES procurement_requests(id) ON UPDATE RESTRICT ON DELETE RESTRICT, origin TEXT NOT NULL CHECK (origin IN ('ERP_FREIGHT_IMAGE', 'MANUAL_UPLOAD')), product_thumb_ref TEXT CHECK ( product_thumb_ref IS NULL OR ( product_thumb_ref GLOB '[1-9]*' AND product_thumb_ref NOT GLOB '*[^0-9]*' AND length(product_thumb_ref) <= 20 ) ), source_image_sha256 TEXT CHECK ( source_image_sha256 IS NULL OR ( length(source_image_sha256) = 64 AND source_image_sha256 NOT GLOB '*[^0-9a-f]*' ) ), bound_at TEXT NOT NULL, CHECK ( (origin = 'ERP_FREIGHT_IMAGE' AND product_thumb_ref IS NOT NULL AND source_image_sha256 IS NOT NULL) OR (origin = 'MANUAL_UPLOAD' AND product_thumb_ref IS NULL AND source_image_sha256 IS NULL) ) ); INSERT INTO procurement_reference_sources ( procurement_request_id, origin, product_thumb_ref, source_image_sha256, bound_at ) SELECT id, 'MANUAL_UPLOAD', NULL, NULL, updated_at FROM procurement_requests WHERE reference_asset_id IS NOT NULL; CREATE INDEX procurement_reference_sources_origin_idx ON procurement_reference_sources (origin, bound_at, procurement_request_id); -- +goose Down CREATE TEMP TABLE procurement_reference_sources_v17_down_guard ( allowed INTEGER NOT NULL CHECK (allowed = 1) ); INSERT INTO procurement_reference_sources_v17_down_guard (allowed) SELECT CASE WHEN EXISTS (SELECT 1 FROM procurement_reference_sources) THEN 0 ELSE 1 END; DROP TABLE procurement_reference_sources_v17_down_guard; DROP INDEX procurement_reference_sources_origin_idx; DROP TABLE procurement_reference_sources;