71 lines
1.8 KiB
SQL
71 lines
1.8 KiB
SQL
DROP SCHEMA IF EXISTS haystack CASCADE;
|
|
|
|
CREATE SCHEMA haystack;
|
|
|
|
/* -----| Enums |----- */
|
|
|
|
CREATE TYPE haystack.progress AS ENUM('not-started','in-progress', 'complete');
|
|
|
|
/* -----| Schema tables |----- */
|
|
|
|
CREATE TABLE haystack.users (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
email TEXT NOT NULL,
|
|
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE haystack.image (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES haystack.users (id),
|
|
|
|
image_name TEXT NOT NULL,
|
|
description TEXT NOT NULL,
|
|
|
|
status haystack.progress NOT NULL DEFAULT 'not-started',
|
|
|
|
image BYTEA NOT NULL,
|
|
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE haystack.stacks (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES haystack.users (id),
|
|
|
|
status haystack.progress NOT NULL DEFAULT 'not-started',
|
|
|
|
name TEXT NOT NULL,
|
|
description TEXT NOT NULL,
|
|
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE haystack.image_stacks (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
image_id UUID NOT NULL REFERENCES haystack.image (id) ON DELETE CASCADE,
|
|
stack_id UUID NOT NULL REFERENCES haystack.stacks (id) ON DELETE CASCADE,
|
|
|
|
UNIQUE(image_id, stack_id)
|
|
);
|
|
|
|
CREATE TABLE haystack.schema_items (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
item TEXT NOT NULL,
|
|
value TEXT NOT NULL,
|
|
description TEXT NOT NULL,
|
|
|
|
stack_id UUID NOT NULL REFERENCES haystack.stacks (id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE haystack.image_schema_items (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
value TEXT,
|
|
|
|
schema_item_id UUID NOT NULL REFERENCES haystack.schema_items (id) ON DELETE CASCADE,
|
|
image_id UUID NOT NULL REFERENCES haystack.image_stacks (id) ON DELETE CASCADE
|
|
);
|