mirror of
https://github.com/penpot/penpot.git
synced 2025-06-03 00:31:40 +02:00
♻️ Big refactor of the default data model.
Introduce teams.
This commit is contained in:
parent
6379c62e37
commit
7a5145fa37
65 changed files with 4529 additions and 3005 deletions
|
@ -1,8 +1,53 @@
|
|||
-- Tables
|
||||
|
||||
CREATE TABLE projects (
|
||||
CREATE TABLE project (
|
||||
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
team_id uuid NOT NULL REFERENCES team(id) ON DELETE CASCADE,
|
||||
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
modified_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
deleted_at timestamptz DEFAULT NULL,
|
||||
|
||||
is_default boolean NOT NULL DEFAULT false,
|
||||
|
||||
name text NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX project__team_id__idx
|
||||
ON project(team_id);
|
||||
|
||||
CREATE TRIGGER project__modified_at__tgr
|
||||
BEFORE UPDATE ON project
|
||||
FOR EACH ROW EXECUTE PROCEDURE update_modified_at();
|
||||
|
||||
|
||||
|
||||
CREATE TABLE project_profile_rel (
|
||||
profile_id uuid NOT NULL REFERENCES profile(id) ON DELETE CASCADE,
|
||||
project_id uuid NOT NULL REFERENCES project(id) ON DELETE CASCADE,
|
||||
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
modified_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
|
||||
is_owner boolean DEFAULT false,
|
||||
is_admin boolean DEFAULT false,
|
||||
can_edit boolean DEFAULT false,
|
||||
|
||||
PRIMARY KEY (profile_id, project_id)
|
||||
);
|
||||
|
||||
COMMENT ON TABLE project_profile_rel
|
||||
IS 'Relation between projects and profiles (NM)';
|
||||
|
||||
CREATE INDEX project_profile_rel__profile_id__idx
|
||||
ON project_profile_rel(profile_id);
|
||||
|
||||
CREATE INDEX project_profile_rel__project_id__idx
|
||||
ON project_profile_rel(project_id);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE file (
|
||||
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
project_id uuid NOT NULL REFERENCES project(id) ON DELETE CASCADE,
|
||||
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
modified_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
|
@ -11,49 +56,47 @@ CREATE TABLE projects (
|
|||
name text NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX projects__user_id__idx
|
||||
ON projects(user_id);
|
||||
CREATE TRIGGER file__modified_at__tgr
|
||||
BEFORE UPDATE ON file
|
||||
FOR EACH ROW EXECUTE PROCEDURE update_modified_at();
|
||||
|
||||
CREATE TABLE project_users (
|
||||
user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
|
||||
CREATE TABLE file_profile_rel (
|
||||
file_id uuid NOT NULL REFERENCES file(id) ON DELETE CASCADE,
|
||||
profile_id uuid NOT NULL REFERENCES profile(id) ON DELETE CASCADE,
|
||||
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
modified_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
|
||||
is_owner boolean DEFAULT false,
|
||||
is_admin boolean DEFAULT false,
|
||||
can_edit boolean DEFAULT false,
|
||||
|
||||
PRIMARY KEY (user_id, project_id)
|
||||
PRIMARY KEY (file_id, profile_id)
|
||||
);
|
||||
|
||||
CREATE INDEX project_users__user_id__idx
|
||||
ON project_users(user_id);
|
||||
COMMENT ON TABLE file_profile_rel
|
||||
IS 'Relation between files and profiles (NM)';
|
||||
|
||||
CREATE INDEX project_users__project_id__idx
|
||||
ON project_users(project_id);
|
||||
CREATE INDEX file_profile_rel__profile_id__idx
|
||||
ON file_profile_rel(profile_id);
|
||||
|
||||
CREATE TABLE project_files (
|
||||
CREATE INDEX file_profile_rel__file_id__idx
|
||||
ON file_profile_rel(file_id);
|
||||
|
||||
CREATE TRIGGER file_profile_rel__modified_at__tgr
|
||||
BEFORE UPDATE ON file
|
||||
FOR EACH ROW EXECUTE PROCEDURE update_modified_at();
|
||||
|
||||
|
||||
|
||||
CREATE TABLE file_image (
|
||||
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
project_id uuid NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
|
||||
name text NOT NULL,
|
||||
file_id uuid NOT NULL REFERENCES file(id) ON DELETE CASCADE,
|
||||
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
modified_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
deleted_at timestamptz DEFAULT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX project_files__user_id__idx
|
||||
ON project_files(user_id);
|
||||
|
||||
CREATE INDEX project_files__project_id__idx
|
||||
ON project_files(project_id);
|
||||
|
||||
CREATE TABLE project_file_images (
|
||||
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
file_id uuid NOT NULL REFERENCES project_files(id) ON DELETE CASCADE,
|
||||
user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
deleted_at timestamptz DEFAULT NULL,
|
||||
|
||||
name text NOT NULL,
|
||||
|
||||
|
@ -69,103 +112,56 @@ CREATE TABLE project_file_images (
|
|||
thumb_mtype text NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX project_file_images__file_id__idx
|
||||
ON project_file_images(file_id);
|
||||
CREATE INDEX file_image__file_id__idx
|
||||
ON file_image(file_id);
|
||||
|
||||
CREATE INDEX project_file_images__user_id__idx
|
||||
ON project_file_images(user_id);
|
||||
CREATE TRIGGER file_image__modified_at__tgr
|
||||
BEFORE UPDATE ON file_image
|
||||
FOR EACH ROW EXECUTE PROCEDURE update_modified_at();
|
||||
|
||||
CREATE TABLE project_file_users (
|
||||
file_id uuid NOT NULL REFERENCES project_files(id) ON DELETE CASCADE,
|
||||
user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
CREATE TRIGGER file_image__on_delete__tgr
|
||||
AFTER DELETE ON file_image
|
||||
FOR EACH ROW EXECUTE PROCEDURE handle_delete();
|
||||
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
modified_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
|
||||
can_edit boolean DEFAULT false,
|
||||
|
||||
PRIMARY KEY (user_id, file_id)
|
||||
);
|
||||
|
||||
CREATE INDEX project_file_users__user_id__idx
|
||||
ON project_file_users(user_id);
|
||||
|
||||
CREATE INDEX project_file_users__file_id__idx
|
||||
ON project_file_users(file_id);
|
||||
|
||||
CREATE TABLE project_pages (
|
||||
CREATE TABLE page (
|
||||
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
|
||||
user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
file_id uuid NOT NULL REFERENCES project_files(id) ON DELETE CASCADE,
|
||||
file_id uuid NOT NULL REFERENCES file(id) ON DELETE CASCADE,
|
||||
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
modified_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
deleted_at timestamptz DEFAULT NULL,
|
||||
|
||||
version bigint NOT NULL,
|
||||
version bigint NOT NULL DEFAULT 0,
|
||||
revn bigint NOT NULL DEFAULT 0,
|
||||
|
||||
ordering smallint NOT NULL,
|
||||
|
||||
name text NOT NULL,
|
||||
data bytea NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX project_pages__user_id__idx
|
||||
ON project_pages(user_id);
|
||||
CREATE INDEX page__file_id__idx
|
||||
ON page(file_id);
|
||||
|
||||
CREATE INDEX project_pages__file_id__idx
|
||||
ON project_pages(file_id);
|
||||
|
||||
CREATE TABLE project_page_snapshots (
|
||||
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
|
||||
user_id uuid NULL REFERENCES users(id) ON DELETE SET NULL,
|
||||
page_id uuid NOT NULL REFERENCES project_pages(id) ON DELETE CASCADE,
|
||||
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
modified_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
version bigint NOT NULL DEFAULT 0,
|
||||
|
||||
pinned bool NOT NULL DEFAULT false,
|
||||
label text NOT NULL DEFAULT '',
|
||||
|
||||
data bytea NOT NULL,
|
||||
changes bytea NULL DEFAULT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX project_page_snapshots__user_id__idx
|
||||
ON project_page_snapshots(user_id);
|
||||
|
||||
CREATE INDEX project_page_snapshots__page_id_id__idx
|
||||
ON project_page_snapshots(page_id);
|
||||
|
||||
-- Triggers
|
||||
|
||||
CREATE OR REPLACE FUNCTION handle_project_insert()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
INSERT INTO project_users (user_id, project_id, can_edit)
|
||||
VALUES (NEW.user_id, NEW.id, true);
|
||||
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION handle_page_update()
|
||||
CREATE FUNCTION handle_page_update()
|
||||
RETURNS TRIGGER AS $pagechange$
|
||||
DECLARE
|
||||
current_dt timestamptz := clock_timestamp();
|
||||
proj_id uuid;
|
||||
BEGIN
|
||||
UPDATE project_files
|
||||
NEW.modified_at := current_dt;
|
||||
|
||||
UPDATE file
|
||||
SET modified_at = current_dt
|
||||
WHERE id = OLD.file_id
|
||||
RETURNING project_id
|
||||
RETURNING project_id
|
||||
INTO STRICT proj_id;
|
||||
|
||||
--- Update projects modified_at attribute when a
|
||||
--- page of that project is modified.
|
||||
UPDATE projects
|
||||
UPDATE project
|
||||
SET modified_at = current_dt
|
||||
WHERE id = proj_id;
|
||||
|
||||
|
@ -173,27 +169,60 @@ CREATE OR REPLACE FUNCTION handle_page_update()
|
|||
END;
|
||||
$pagechange$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER projects_on_insert_tgr
|
||||
AFTER INSERT ON projects
|
||||
FOR EACH ROW EXECUTE PROCEDURE handle_project_insert();
|
||||
|
||||
CREATE TRIGGER pages__on_update__tgr
|
||||
BEFORE UPDATE ON project_pages
|
||||
CREATE TRIGGER page__on_update__tgr
|
||||
BEFORE UPDATE ON page
|
||||
FOR EACH ROW EXECUTE PROCEDURE handle_page_update();
|
||||
|
||||
|
||||
CREATE TRIGGER projects__modified_at__tgr
|
||||
BEFORE UPDATE ON projects
|
||||
|
||||
CREATE TABLE page_version (
|
||||
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
|
||||
page_id uuid NOT NULL REFERENCES page(id) ON DELETE CASCADE,
|
||||
profile_id uuid NULL REFERENCES profile(id) ON DELETE SET NULL,
|
||||
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
modified_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
deleted_at timestamptz DEFAULT NULL,
|
||||
|
||||
version bigint NOT NULL DEFAULT 0,
|
||||
|
||||
label text NOT NULL DEFAULT '',
|
||||
data bytea NOT NULL,
|
||||
|
||||
changes bytea NULL DEFAULT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX page_version__profile_id__idx
|
||||
ON page_version(profile_id);
|
||||
|
||||
CREATE INDEX page_version__page_id__idx
|
||||
ON page_version(page_id);
|
||||
|
||||
CREATE TRIGGER page_version__modified_at__tgr
|
||||
BEFORE UPDATE ON page_version
|
||||
FOR EACH ROW EXECUTE PROCEDURE update_modified_at();
|
||||
|
||||
CREATE TRIGGER project_files__modified_at__tgr
|
||||
BEFORE UPDATE ON project_files
|
||||
FOR EACH ROW EXECUTE PROCEDURE update_modified_at();
|
||||
|
||||
CREATE TRIGGER project_pages__modified_at__tgr
|
||||
BEFORE UPDATE ON project_pages
|
||||
FOR EACH ROW EXECUTE PROCEDURE update_modified_at();
|
||||
|
||||
CREATE TRIGGER project_page_snapshots__modified_at__tgr
|
||||
BEFORE UPDATE ON project_page_snapshots
|
||||
CREATE TABLE page_change (
|
||||
id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
page_id uuid NOT NULL REFERENCES page(id) ON DELETE CASCADE,
|
||||
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
modified_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
|
||||
revn bigint NOT NULL DEFAULT 0,
|
||||
|
||||
label text NOT NULL DEFAULT '',
|
||||
data bytea NOT NULL,
|
||||
|
||||
changes bytea NULL DEFAULT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX page_change__page_id__idx
|
||||
ON page_change(page_id);
|
||||
|
||||
CREATE TRIGGER page_change__modified_at__tgr
|
||||
BEFORE UPDATE ON page_change
|
||||
FOR EACH ROW EXECUTE PROCEDURE update_modified_at();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue