AppFlowy-Cloud/migrations/20240813040905_template.sql
Khor Shu Heng 9c8e718246
feat: Template CRUD Endpoint (#731)
* feat: template crud endpoint

* fix: clippy error

* fix: categories for related view

* fix: add created at and last updated at to template response

* feat: template api delete endpoint

* feat: include number of template count for template creator

* fix: use params instead of individual fields for template api

* fix: seach template creator by name query

* chore: simplify query

* feat: support template count limit for template homepage
2024-08-20 15:22:56 +08:00

85 lines
2.8 KiB
PL/PgSQL

-- Appflowy template is based on a published view. Template information should be preserved even if the
-- published view is deleted.
CREATE TABLE IF NOT EXISTS af_template_view (
view_id UUID NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
name TEXT NOT NULL,
description TEXT NOT NULL,
about TEXT NOT NULL,
view_url TEXT NOT NULL,
creator_id UUID NOT NULL REFERENCES af_template_creator(creator_id) ON DELETE CASCADE,
is_new_template BOOLEAN NOT NULL,
is_featured BOOLEAN NOT NULL,
PRIMARY KEY (view_id)
);
CREATE TABLE IF NOT EXISTS af_template_view_template_category (
view_id UUID NOT NULL REFERENCES af_template_view(view_id) ON DELETE CASCADE,
category_id UUID NOT NULL REFERENCES af_template_category(category_id) ON DELETE CASCADE,
PRIMARY KEY (view_id, category_id)
);
CREATE TABLE IF NOT EXISTS af_related_template_view (
view_id UUID NOT NULL REFERENCES af_template_view(view_id) ON DELETE CASCADE,
related_view_id UUID NOT NULL REFERENCES af_template_view(view_id) ON DELETE CASCADE,
PRIMARY KEY (view_id, related_view_id)
);
BEGIN;
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'account_link_type') THEN
CREATE TYPE account_link_type AS (
link_type TEXT,
url TEXT
);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'template_creator_type') THEN
CREATE TYPE template_creator_type AS (
creator_id UUID,
name TEXT,
avatar_url TEXT,
account_links account_link_type[],
number_of_templates INT
);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'template_creator_minimal_type') THEN
CREATE TYPE template_creator_minimal_type AS (
creator_id UUID,
name TEXT,
avatar_url TEXT
);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'template_category_minimal_type') THEN
CREATE TYPE template_category_minimal_type AS (
category_id UUID,
name TEXT,
icon TEXT,
bg_color TEXT
);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'template_minimal_type') THEN
CREATE TYPE template_minimal_type AS (
view_id UUID,
created_at TIMESTAMP WITH TIME ZONE,
updated_at TIMESTAMP WITH TIME ZONE,
name TEXT,
description TEXT,
view_url TEXT,
creator template_creator_minimal_type,
categories template_category_minimal_type[],
is_new_template BOOLEAN,
is_featured BOOLEAN
);
END IF;
END
$$;