Files
Sauci/apps/api/drizzle/0006_media_storage.sql
jjbrunton 006761d3b0 feat(backend): add standalone data plane
Replace the Supabase application data plane with the Node/PostgreSQL API, migrate mobile, admin, web, and MCP callers, add controlled cutover tooling, and define hardened Dokploy infrastructure.
2026-08-28 14:42:11 +01:00

36 lines
1.6 KiB
PL/PgSQL

CREATE TABLE IF NOT EXISTS media_objects (
id uuid PRIMARY KEY,
owner_id uuid NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,
couple_id uuid REFERENCES couples(id) ON DELETE CASCADE,
kind text NOT NULL CHECK (kind IN ('avatar', 'response', 'chat', 'feedback')),
storage_key text NOT NULL UNIQUE,
mime_type text NOT NULL,
byte_size integer NOT NULL CHECK (byte_size > 0),
question_id uuid REFERENCES questions(id) ON DELETE CASCADE,
match_id uuid REFERENCES matches(id) ON DELETE CASCADE,
expires_at timestamptz,
created_at timestamptz NOT NULL DEFAULT now(),
deleted_at timestamptz
);
--> statement-breakpoint
CREATE INDEX IF NOT EXISTS media_objects_owner_idx ON media_objects(owner_id, created_at DESC);
--> statement-breakpoint
CREATE INDEX IF NOT EXISTS media_objects_couple_idx ON media_objects(couple_id) WHERE couple_id IS NOT NULL;
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS media_deletion_queue (
storage_key text PRIMARY KEY,
queued_at timestamptz NOT NULL DEFAULT now()
);
--> statement-breakpoint
CREATE OR REPLACE FUNCTION queue_media_blob_deletion() RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
INSERT INTO media_deletion_queue(storage_key) VALUES(OLD.storage_key) ON CONFLICT DO NOTHING;
RETURN OLD;
END $$;
--> statement-breakpoint
DROP TRIGGER IF EXISTS media_objects_queue_blob_deletion ON media_objects;
CREATE TRIGGER media_objects_queue_blob_deletion BEFORE DELETE ON media_objects
FOR EACH ROW EXECUTE FUNCTION queue_media_blob_deletion();
--> statement-breakpoint
ALTER TABLE feedback ADD COLUMN IF NOT EXISTS screenshot_media_id uuid REFERENCES media_objects(id) ON DELETE SET NULL;