multi tenancy part 1
This commit is contained in:
@@ -0,0 +1 @@
|
||||
DROP TABLE IF EXISTS public.tenants;
|
||||
@@ -0,0 +1,10 @@
|
||||
CREATE TABLE public.tenants (
|
||||
tenant_id UUID PRIMARY KEY,
|
||||
slug TEXT NOT NULL UNIQUE,
|
||||
storage_root TEXT,
|
||||
quickwit_index TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
config JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
@@ -0,0 +1,2 @@
|
||||
DELETE FROM public.tenants
|
||||
WHERE slug = 'admin';
|
||||
@@ -0,0 +1,10 @@
|
||||
INSERT INTO public.tenants (tenant_id, slug, storage_root, quickwit_index, status, config)
|
||||
VALUES (
|
||||
gen_random_uuid(),
|
||||
'admin',
|
||||
NULL,
|
||||
NULL,
|
||||
'active',
|
||||
'{}'::jsonb
|
||||
)
|
||||
ON CONFLICT (slug) DO NOTHING;
|
||||
@@ -0,0 +1 @@
|
||||
DROP TABLE IF EXISTS public.user_memberships;
|
||||
@@ -0,0 +1,12 @@
|
||||
CREATE TABLE public.user_memberships (
|
||||
id UUID PRIMARY KEY,
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
tenant_id UUID NOT NULL REFERENCES public.tenants(tenant_id) ON DELETE CASCADE,
|
||||
role TEXT NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE (user_id, tenant_id)
|
||||
);
|
||||
|
||||
CREATE INDEX user_memberships_tenant_id_idx ON public.user_memberships (tenant_id);
|
||||
CREATE INDEX user_memberships_user_id_idx ON public.user_memberships (user_id);
|
||||
@@ -0,0 +1,7 @@
|
||||
DELETE FROM public.user_memberships
|
||||
WHERE user_id IN (
|
||||
SELECT id FROM public.users WHERE username = 'admin'
|
||||
)
|
||||
AND tenant_id IN (
|
||||
SELECT tenant_id FROM public.tenants WHERE slug = 'admin'
|
||||
);
|
||||
@@ -0,0 +1,7 @@
|
||||
INSERT INTO public.user_memberships (id, user_id, tenant_id, role)
|
||||
SELECT gen_random_uuid(), u.id, t.tenant_id, 'admin'
|
||||
FROM public.users AS u
|
||||
JOIN public.tenants AS t ON t.slug = 'admin'
|
||||
LEFT JOIN public.user_memberships AS um ON um.user_id = u.id AND um.tenant_id = t.tenant_id
|
||||
WHERE u.username = 'admin' AND um.id IS NULL
|
||||
ON CONFLICT (user_id, tenant_id) DO NOTHING;
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE users
|
||||
ADD COLUMN role VARCHAR(16) NOT NULL DEFAULT 'user';
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE users
|
||||
DROP COLUMN role;
|
||||
@@ -0,0 +1,47 @@
|
||||
DROP INDEX IF EXISTS jobs_tenant_id_idx;
|
||||
ALTER TABLE jobs DROP CONSTRAINT IF EXISTS jobs_tenant_id_fkey;
|
||||
ALTER TABLE jobs DROP COLUMN IF EXISTS tenant_id;
|
||||
|
||||
DROP INDEX IF EXISTS refresh_tokens_tenant_id_idx;
|
||||
ALTER TABLE refresh_tokens DROP CONSTRAINT IF EXISTS refresh_tokens_tenant_id_fkey;
|
||||
ALTER TABLE refresh_tokens DROP COLUMN IF EXISTS tenant_id;
|
||||
|
||||
DROP INDEX IF EXISTS users_tenant_id_idx;
|
||||
ALTER TABLE users DROP CONSTRAINT IF EXISTS users_tenant_id_fkey;
|
||||
ALTER TABLE users DROP COLUMN IF EXISTS tenant_id;
|
||||
|
||||
DROP INDEX IF EXISTS folders_tenant_id_idx;
|
||||
ALTER TABLE folders DROP CONSTRAINT IF EXISTS folders_tenant_id_fkey;
|
||||
ALTER TABLE folders DROP COLUMN IF EXISTS tenant_id;
|
||||
|
||||
DROP INDEX IF EXISTS tags_tenant_id_idx;
|
||||
ALTER TABLE tags DROP CONSTRAINT IF EXISTS tags_tenant_id_fkey;
|
||||
ALTER TABLE tags DROP COLUMN IF EXISTS tenant_id;
|
||||
|
||||
DROP INDEX IF EXISTS correspondents_tenant_id_idx;
|
||||
ALTER TABLE correspondents DROP CONSTRAINT IF EXISTS correspondents_tenant_id_fkey;
|
||||
ALTER TABLE correspondents DROP COLUMN IF EXISTS tenant_id;
|
||||
|
||||
DROP INDEX IF EXISTS document_correspondents_tenant_id_idx;
|
||||
ALTER TABLE document_correspondents DROP CONSTRAINT IF EXISTS document_correspondents_tenant_id_fkey;
|
||||
ALTER TABLE document_correspondents DROP COLUMN IF EXISTS tenant_id;
|
||||
|
||||
DROP INDEX IF EXISTS document_tags_tenant_id_idx;
|
||||
ALTER TABLE document_tags DROP CONSTRAINT IF EXISTS document_tags_tenant_id_fkey;
|
||||
ALTER TABLE document_tags DROP COLUMN IF EXISTS tenant_id;
|
||||
|
||||
DROP INDEX IF EXISTS document_asset_objects_tenant_id_idx;
|
||||
ALTER TABLE document_asset_objects DROP CONSTRAINT IF EXISTS document_asset_objects_tenant_id_fkey;
|
||||
ALTER TABLE document_asset_objects DROP COLUMN IF EXISTS tenant_id;
|
||||
|
||||
DROP INDEX IF EXISTS document_assets_tenant_id_idx;
|
||||
ALTER TABLE document_assets DROP CONSTRAINT IF EXISTS document_assets_tenant_id_fkey;
|
||||
ALTER TABLE document_assets DROP COLUMN IF EXISTS tenant_id;
|
||||
|
||||
DROP INDEX IF EXISTS document_versions_tenant_id_idx;
|
||||
ALTER TABLE document_versions DROP CONSTRAINT IF EXISTS document_versions_tenant_id_fkey;
|
||||
ALTER TABLE document_versions DROP COLUMN IF EXISTS tenant_id;
|
||||
|
||||
DROP INDEX IF EXISTS documents_tenant_id_idx;
|
||||
ALTER TABLE documents DROP CONSTRAINT IF EXISTS documents_tenant_id_fkey;
|
||||
ALTER TABLE documents DROP COLUMN IF EXISTS tenant_id;
|
||||
@@ -0,0 +1,119 @@
|
||||
-- Add tenant_id to documents
|
||||
ALTER TABLE documents ADD COLUMN tenant_id UUID;
|
||||
UPDATE documents
|
||||
SET tenant_id = (SELECT tenant_id FROM public.tenants WHERE slug = 'admin');
|
||||
ALTER TABLE documents ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE documents
|
||||
ADD CONSTRAINT documents_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX documents_tenant_id_idx ON documents (tenant_id);
|
||||
|
||||
-- Add tenant_id to document_versions
|
||||
ALTER TABLE document_versions ADD COLUMN tenant_id UUID;
|
||||
UPDATE document_versions AS dv
|
||||
SET tenant_id = d.tenant_id
|
||||
FROM documents AS d
|
||||
WHERE dv.document_id = d.id;
|
||||
ALTER TABLE document_versions ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE document_versions
|
||||
ADD CONSTRAINT document_versions_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX document_versions_tenant_id_idx ON document_versions (tenant_id);
|
||||
|
||||
-- Add tenant_id to document_assets
|
||||
ALTER TABLE document_assets ADD COLUMN tenant_id UUID;
|
||||
UPDATE document_assets AS da
|
||||
SET tenant_id = dv.tenant_id
|
||||
FROM document_versions AS dv
|
||||
WHERE da.document_version_id = dv.id;
|
||||
ALTER TABLE document_assets ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE document_assets
|
||||
ADD CONSTRAINT document_assets_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX document_assets_tenant_id_idx ON document_assets (tenant_id);
|
||||
|
||||
-- Add tenant_id to document_asset_objects
|
||||
ALTER TABLE document_asset_objects ADD COLUMN tenant_id UUID;
|
||||
UPDATE document_asset_objects AS dao
|
||||
SET tenant_id = da.tenant_id
|
||||
FROM document_assets AS da
|
||||
WHERE dao.asset_id = da.id;
|
||||
ALTER TABLE document_asset_objects ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE document_asset_objects
|
||||
ADD CONSTRAINT document_asset_objects_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX document_asset_objects_tenant_id_idx ON document_asset_objects (tenant_id);
|
||||
|
||||
-- Add tenant_id to document_tags
|
||||
ALTER TABLE document_tags ADD COLUMN tenant_id UUID;
|
||||
UPDATE document_tags AS dt
|
||||
SET tenant_id = d.tenant_id
|
||||
FROM documents AS d
|
||||
WHERE dt.document_id = d.id;
|
||||
ALTER TABLE document_tags ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE document_tags
|
||||
ADD CONSTRAINT document_tags_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX document_tags_tenant_id_idx ON document_tags (tenant_id);
|
||||
|
||||
-- Add tenant_id to document_correspondents
|
||||
ALTER TABLE document_correspondents ADD COLUMN tenant_id UUID;
|
||||
UPDATE document_correspondents AS dc
|
||||
SET tenant_id = d.tenant_id
|
||||
FROM documents AS d
|
||||
WHERE dc.document_id = d.id;
|
||||
ALTER TABLE document_correspondents ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE document_correspondents
|
||||
ADD CONSTRAINT document_correspondents_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX document_correspondents_tenant_id_idx ON document_correspondents (tenant_id);
|
||||
|
||||
-- Add tenant_id to correspondents
|
||||
ALTER TABLE correspondents ADD COLUMN tenant_id UUID;
|
||||
UPDATE correspondents
|
||||
SET tenant_id = (SELECT tenant_id FROM public.tenants WHERE slug = 'admin');
|
||||
ALTER TABLE correspondents ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE correspondents
|
||||
ADD CONSTRAINT correspondents_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX correspondents_tenant_id_idx ON correspondents (tenant_id);
|
||||
|
||||
-- Add tenant_id to tags
|
||||
ALTER TABLE tags ADD COLUMN tenant_id UUID;
|
||||
UPDATE tags
|
||||
SET tenant_id = (SELECT tenant_id FROM public.tenants WHERE slug = 'admin');
|
||||
ALTER TABLE tags ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE tags
|
||||
ADD CONSTRAINT tags_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX tags_tenant_id_idx ON tags (tenant_id);
|
||||
|
||||
-- Add tenant_id to folders
|
||||
ALTER TABLE folders ADD COLUMN tenant_id UUID;
|
||||
UPDATE folders
|
||||
SET tenant_id = (SELECT tenant_id FROM public.tenants WHERE slug = 'admin');
|
||||
ALTER TABLE folders ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE folders
|
||||
ADD CONSTRAINT folders_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX folders_tenant_id_idx ON folders (tenant_id);
|
||||
|
||||
-- Add tenant_id to users
|
||||
ALTER TABLE users ADD COLUMN tenant_id UUID;
|
||||
UPDATE users
|
||||
SET tenant_id = (SELECT tenant_id FROM public.tenants WHERE slug = 'admin');
|
||||
ALTER TABLE users ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE users
|
||||
ADD CONSTRAINT users_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX users_tenant_id_idx ON users (tenant_id);
|
||||
|
||||
-- Add tenant_id to refresh_tokens
|
||||
ALTER TABLE refresh_tokens ADD COLUMN tenant_id UUID;
|
||||
UPDATE refresh_tokens AS rt
|
||||
SET tenant_id = u.tenant_id
|
||||
FROM users AS u
|
||||
WHERE rt.user_id = u.id;
|
||||
ALTER TABLE refresh_tokens ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE refresh_tokens
|
||||
ADD CONSTRAINT refresh_tokens_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX refresh_tokens_tenant_id_idx ON refresh_tokens (tenant_id);
|
||||
|
||||
-- Add tenant_id to jobs
|
||||
ALTER TABLE jobs ADD COLUMN tenant_id UUID;
|
||||
UPDATE jobs
|
||||
SET tenant_id = (SELECT tenant_id FROM public.tenants WHERE slug = 'admin');
|
||||
ALTER TABLE jobs ALTER COLUMN tenant_id SET NOT NULL;
|
||||
ALTER TABLE jobs
|
||||
ADD CONSTRAINT jobs_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(tenant_id);
|
||||
CREATE INDEX jobs_tenant_id_idx ON jobs (tenant_id);
|
||||
Reference in New Issue
Block a user