2025-12-17 22:57:57 +01:00
|
|
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
|
|
|
|
|
|
|
|
CREATE TABLE users (
|
|
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
|
email TEXT UNIQUE NOT NULL,
|
|
|
|
|
display_name TEXT,
|
|
|
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
|
|
|
last_login_at TIMESTAMP WITH TIME ZONE
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE TABLE organizations (
|
|
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
|
name TEXT NOT NULL,
|
|
|
|
|
slug TEXT UNIQUE NOT NULL,
|
|
|
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE TABLE memberships (
|
|
|
|
|
user_id UUID REFERENCES users(id),
|
|
|
|
|
org_id UUID REFERENCES organizations(id),
|
|
|
|
|
role TEXT NOT NULL,
|
|
|
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
|
|
|
PRIMARY KEY (user_id, org_id)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE TABLE sessions (
|
|
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
|
user_id UUID REFERENCES users(id),
|
|
|
|
|
expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
|
|
|
|
|
revoked_at TIMESTAMP WITH TIME ZONE
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE TABLE audit_logs (
|
|
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
|
user_id UUID REFERENCES users(id),
|
|
|
|
|
org_id UUID REFERENCES organizations(id),
|
|
|
|
|
action TEXT NOT NULL,
|
|
|
|
|
resource TEXT,
|
|
|
|
|
success BOOLEAN NOT NULL,
|
|
|
|
|
timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
|
|
|
metadata JSONB
|
2025-12-18 00:02:50 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE TABLE activities (
|
|
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
|
user_id UUID REFERENCES users(id),
|
|
|
|
|
org_id UUID REFERENCES organizations(id),
|
|
|
|
|
file_id TEXT, -- nullable, for future file table
|
|
|
|
|
action TEXT NOT NULL,
|
|
|
|
|
metadata JSONB,
|
|
|
|
|
timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
2025-12-17 22:57:57 +01:00
|
|
|
);
|