Files
k-photos/crates/adapters/postgres/migrations/006_sharing.sql

50 lines
1.7 KiB
SQL

CREATE TABLE share_scopes (
scope_id UUID PRIMARY KEY,
scope_type TEXT NOT NULL,
shareable_type TEXT NOT NULL,
shareable_id UUID NOT NULL,
created_by_user_id UUID NOT NULL REFERENCES users(id),
expires_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_share_scopes_shareable ON share_scopes(shareable_id);
CREATE TABLE share_targets (
scope_id UUID NOT NULL REFERENCES share_scopes(scope_id) ON DELETE CASCADE,
target_type TEXT NOT NULL,
target_id UUID NOT NULL,
role_id UUID NOT NULL,
PRIMARY KEY (scope_id, target_id)
);
CREATE TABLE share_links (
scope_id UUID NOT NULL REFERENCES share_scopes(scope_id) ON DELETE CASCADE,
token TEXT UNIQUE NOT NULL,
expires_at TIMESTAMPTZ,
access_level TEXT NOT NULL DEFAULT 'view_only',
is_active BOOLEAN NOT NULL DEFAULT true,
max_uses INTEGER,
use_count INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (scope_id)
);
CREATE INDEX idx_share_links_token ON share_links(token);
CREATE TABLE invite_codes (
code_id UUID PRIMARY KEY,
scope_id UUID NOT NULL REFERENCES share_scopes(scope_id) ON DELETE CASCADE,
created_by_user_id UUID NOT NULL REFERENCES users(id),
expires_at TIMESTAMPTZ,
max_uses INTEGER,
use_count INTEGER NOT NULL DEFAULT 0,
assigned_role_id UUID NOT NULL
);
CREATE TABLE visibility_filters (
filter_id UUID PRIMARY KEY,
scope_id UUID NOT NULL REFERENCES share_scopes(scope_id) ON DELETE CASCADE,
role_id UUID NOT NULL,
hidden_fields TEXT[] NOT NULL DEFAULT '{}'
);