Adding working board
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
CREATE TABLE osint.board_view_types (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL UNIQUE
|
||||
);
|
||||
INSERT INTO osint.board_view_types (id,name) VALUES ('timeline','Timeline');
|
||||
|
||||
CREATE TABLE osint.board_views (
|
||||
id UUID PRIMARY KEY,
|
||||
board_id UUID NOT NULL REFERENCES osint.boards(id) ON DELETE CASCADE,
|
||||
view_type_id TEXT NOT NULL REFERENCES osint.board_view_types(id),
|
||||
origin_view_id UUID REFERENCES osint.board_views(id) ON DELETE SET NULL,
|
||||
placement_mode TEXT NOT NULL DEFAULT 'docked' CHECK (placement_mode IN ('docked','canvas','window')),
|
||||
dock_edge TEXT CHECK (dock_edge IN ('top','right','bottom','left')),
|
||||
xpos DOUBLE PRECISION,
|
||||
ypos DOUBLE PRECISION,
|
||||
width DOUBLE PRECISION,
|
||||
height DOUBLE PRECISION NOT NULL DEFAULT 112 CHECK (height > 0),
|
||||
z_index INTEGER NOT NULL DEFAULT 0,
|
||||
visible BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE (board_id,view_type_id),
|
||||
CHECK (
|
||||
(placement_mode = 'docked' AND dock_edge IS NOT NULL)
|
||||
OR (placement_mode IN ('canvas','window') AND xpos IS NOT NULL AND ypos IS NOT NULL AND width IS NOT NULL)
|
||||
)
|
||||
);
|
||||
CREATE INDEX board_views_board_idx ON osint.board_views (board_id,z_index,created_at);
|
||||
|
||||
CREATE TABLE osint.timeline_views (
|
||||
view_id UUID PRIMARY KEY REFERENCES osint.board_views(id) ON DELETE CASCADE,
|
||||
range_mode TEXT NOT NULL DEFAULT 'auto' CHECK (range_mode IN ('auto','fixed')),
|
||||
range_start DATE,
|
||||
range_end DATE,
|
||||
CHECK (
|
||||
(range_mode = 'auto' AND range_start IS NULL AND range_end IS NULL)
|
||||
OR (range_mode = 'fixed' AND range_start IS NOT NULL AND range_end IS NOT NULL AND range_end > range_start)
|
||||
)
|
||||
);
|
||||
|
||||
WITH created_views AS (
|
||||
INSERT INTO osint.board_views (id,board_id,view_type_id,placement_mode,dock_edge,height)
|
||||
SELECT gen_random_uuid(),b.id,'timeline','docked','bottom',112
|
||||
FROM osint.boards b
|
||||
RETURNING id,board_id
|
||||
)
|
||||
INSERT INTO osint.timeline_views (view_id,range_mode,range_start,range_end)
|
||||
SELECT v.id,
|
||||
CASE WHEN settings.board_id IS NULL THEN 'auto' ELSE 'fixed' END,
|
||||
settings.range_start,
|
||||
settings.range_end
|
||||
FROM created_views v
|
||||
LEFT JOIN osint.board_timeline_settings settings ON settings.board_id=v.board_id;
|
||||
|
||||
DROP TABLE osint.board_timeline_settings;
|
||||
|
||||
COMMENT ON TABLE osint.board_views IS 'Persistent frontend projections and workspace apparatus. Views are not investigation-domain exhibits.';
|
||||
COMMENT ON TABLE osint.timeline_views IS 'Timeline projection settings; temporal markers remain derived from exhibits and are never duplicated here.';
|
||||
@@ -0,0 +1,16 @@
|
||||
ALTER TABLE osint.assets
|
||||
ALTER COLUMN content DROP NOT NULL,
|
||||
ADD COLUMN storage_provider TEXT NOT NULL DEFAULT 'postgres' CHECK (storage_provider IN ('postgres','s3')),
|
||||
ADD COLUMN storage_bucket TEXT,
|
||||
ADD COLUMN object_key TEXT,
|
||||
ADD COLUMN etag TEXT;
|
||||
|
||||
ALTER TABLE osint.assets
|
||||
ADD CONSTRAINT assets_storage_location_check CHECK (
|
||||
(storage_provider = 'postgres' AND content IS NOT NULL AND storage_bucket IS NULL AND object_key IS NULL)
|
||||
OR (storage_provider = 's3' AND content IS NULL AND storage_bucket IS NOT NULL AND object_key IS NOT NULL)
|
||||
),
|
||||
ADD CONSTRAINT assets_object_location_unique UNIQUE (storage_bucket,object_key);
|
||||
|
||||
COMMENT ON COLUMN osint.assets.content IS 'Compatibility storage for assets created before object storage. New uploads use the private S3/MinIO bucket.';
|
||||
COMMENT ON COLUMN osint.assets.object_key IS 'Private object key; clients retrieve bytes through the authenticated application asset endpoint.';
|
||||
Reference in New Issue
Block a user