chore(directus): add import schemas and key auto-generation sql
This commit is contained in:
80
docs/directus/directus_key_autogen.sql
Normal file
80
docs/directus/directus_key_autogen.sql
Normal file
@@ -0,0 +1,80 @@
|
||||
-- Directus key auto-generation triggers
|
||||
-- Target tables: companies, sites, users, systems, roles
|
||||
-- Key format: PREFIX + yyyymmdd + 'X' + 4 digits
|
||||
-- Example: CP20260404X1234
|
||||
|
||||
BEGIN;
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.directus_autogen_entity_key()
|
||||
RETURNS trigger
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_column_name text := TG_ARGV[0];
|
||||
v_prefix text := TG_ARGV[1];
|
||||
v_current_value text;
|
||||
v_candidate text;
|
||||
v_exists boolean;
|
||||
v_attempt int;
|
||||
v_day text;
|
||||
v_suffix text;
|
||||
BEGIN
|
||||
v_current_value := to_jsonb(NEW) ->> v_column_name;
|
||||
IF v_current_value IS NOT NULL AND btrim(v_current_value) <> '' THEN
|
||||
RETURN NEW;
|
||||
END IF;
|
||||
|
||||
v_day := to_char(clock_timestamp(), 'YYYYMMDD');
|
||||
|
||||
FOR v_attempt IN 0..9999 LOOP
|
||||
v_suffix := lpad((((extract(epoch FROM clock_timestamp()) * 1000)::bigint + v_attempt) % 10000)::text, 4, '0');
|
||||
v_candidate := v_prefix || v_day || 'X' || v_suffix;
|
||||
|
||||
EXECUTE format(
|
||||
'SELECT EXISTS (SELECT 1 FROM %I.%I WHERE %I = $1)',
|
||||
TG_TABLE_SCHEMA,
|
||||
TG_TABLE_NAME,
|
||||
v_column_name
|
||||
) INTO v_exists USING v_candidate;
|
||||
|
||||
IF NOT v_exists THEN
|
||||
NEW := jsonb_populate_record(NEW, jsonb_build_object(v_column_name, v_candidate));
|
||||
RETURN NEW;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
RAISE EXCEPTION 'Failed to generate unique key for %.% (column=%)', TG_TABLE_SCHEMA, TG_TABLE_NAME, v_column_name;
|
||||
END;
|
||||
$$;
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_companies_company_key_autogen ON public.companies;
|
||||
CREATE TRIGGER trg_companies_company_key_autogen
|
||||
BEFORE INSERT ON public.companies
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION public.directus_autogen_entity_key('company_key', 'CP');
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_sites_site_key_autogen ON public.sites;
|
||||
CREATE TRIGGER trg_sites_site_key_autogen
|
||||
BEFORE INSERT ON public.sites
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION public.directus_autogen_entity_key('site_key', 'ST');
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_users_user_key_autogen ON public.users;
|
||||
CREATE TRIGGER trg_users_user_key_autogen
|
||||
BEFORE INSERT ON public.users
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION public.directus_autogen_entity_key('user_key', 'UE');
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_systems_system_key_autogen ON public.systems;
|
||||
CREATE TRIGGER trg_systems_system_key_autogen
|
||||
BEFORE INSERT ON public.systems
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION public.directus_autogen_entity_key('system_key', 'SY');
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_roles_role_key_autogen ON public.roles;
|
||||
CREATE TRIGGER trg_roles_role_key_autogen
|
||||
BEFORE INSERT ON public.roles
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION public.directus_autogen_entity_key('role_key', 'RL');
|
||||
|
||||
COMMIT;
|
||||
3656
docs/directus/member-schema.directus.json
Normal file
3656
docs/directus/member-schema.directus.json
Normal file
File diff suppressed because it is too large
Load Diff
3656
docs/directus/member-schema.directus.uuid.json
Normal file
3656
docs/directus/member-schema.directus.uuid.json
Normal file
File diff suppressed because it is too large
Load Diff
3702
docs/directus/member-schema.directus.uuid.keys.json
Normal file
3702
docs/directus/member-schema.directus.uuid.keys.json
Normal file
File diff suppressed because it is too large
Load Diff
182
docs/directus/member-schema.snapshot.json
Normal file
182
docs/directus/member-schema.snapshot.json
Normal file
@@ -0,0 +1,182 @@
|
||||
{
|
||||
"version": 1,
|
||||
"directus": "11.0.0",
|
||||
"vendor": "postgres",
|
||||
"collections": [
|
||||
{ "collection": "users", "meta": null, "schema": { "name": "users" } },
|
||||
{ "collection": "companies", "meta": null, "schema": { "name": "companies" } },
|
||||
{ "collection": "sites", "meta": null, "schema": { "name": "sites" } },
|
||||
{ "collection": "systems", "meta": null, "schema": { "name": "systems" } },
|
||||
{ "collection": "roles", "meta": null, "schema": { "name": "roles" } },
|
||||
{ "collection": "site_roles", "meta": null, "schema": { "name": "site_roles" } },
|
||||
{ "collection": "user_sites", "meta": null, "schema": { "name": "user_sites" } },
|
||||
{ "collection": "auth_sync_state", "meta": null, "schema": { "name": "auth_sync_state" } },
|
||||
{ "collection": "api_clients", "meta": null, "schema": { "name": "api_clients" } }
|
||||
],
|
||||
"fields": [
|
||||
{ "collection": "users", "field": "id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "is_primary_key": true, "has_auto_increment": false, "default_value": "gen_random_uuid()" } },
|
||||
{ "collection": "users", "field": "user_sub", "type": "string", "meta": null, "schema": { "is_nullable": false, "is_unique": true } },
|
||||
{ "collection": "users", "field": "provider_user_id", "type": "string", "meta": null, "schema": { "is_nullable": true, "is_unique": true } },
|
||||
{ "collection": "users", "field": "username", "type": "string", "meta": null, "schema": { "is_nullable": true, "is_unique": true } },
|
||||
{ "collection": "users", "field": "email", "type": "string", "meta": null, "schema": { "is_nullable": true, "is_unique": true } },
|
||||
{ "collection": "users", "field": "display_name", "type": "string", "meta": null, "schema": { "is_nullable": true } },
|
||||
{ "collection": "users", "field": "status", "type": "string", "meta": null, "schema": { "is_nullable": false, "default_value": "active" } },
|
||||
{ "collection": "users", "field": "is_active", "type": "boolean", "meta": null, "schema": { "is_nullable": false, "default_value": true } },
|
||||
{ "collection": "users", "field": "created_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
{ "collection": "users", "field": "updated_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
|
||||
{ "collection": "companies", "field": "id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "is_primary_key": true, "default_value": "gen_random_uuid()" } },
|
||||
{ "collection": "companies", "field": "company_key", "type": "string", "meta": null, "schema": { "is_nullable": false, "is_unique": true } },
|
||||
{ "collection": "companies", "field": "name", "type": "string", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "companies", "field": "provider_group_id", "type": "string", "meta": null, "schema": { "is_nullable": true } },
|
||||
{ "collection": "companies", "field": "status", "type": "string", "meta": null, "schema": { "is_nullable": false, "default_value": "active" } },
|
||||
{ "collection": "companies", "field": "created_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
{ "collection": "companies", "field": "updated_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
|
||||
{ "collection": "sites", "field": "id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "is_primary_key": true, "default_value": "gen_random_uuid()" } },
|
||||
{ "collection": "sites", "field": "site_key", "type": "string", "meta": null, "schema": { "is_nullable": false, "is_unique": true } },
|
||||
{ "collection": "sites", "field": "company_id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "foreign_key_table": "companies", "foreign_key_column": "id" } },
|
||||
{ "collection": "sites", "field": "display_name", "type": "string", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "sites", "field": "domain", "type": "string", "meta": null, "schema": { "is_nullable": true } },
|
||||
{ "collection": "sites", "field": "provider_group_id", "type": "string", "meta": null, "schema": { "is_nullable": true } },
|
||||
{ "collection": "sites", "field": "status", "type": "string", "meta": null, "schema": { "is_nullable": false, "default_value": "active" } },
|
||||
{ "collection": "sites", "field": "created_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
{ "collection": "sites", "field": "updated_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
|
||||
{ "collection": "systems", "field": "id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "is_primary_key": true, "default_value": "gen_random_uuid()" } },
|
||||
{ "collection": "systems", "field": "system_key", "type": "string", "meta": null, "schema": { "is_nullable": false, "is_unique": true } },
|
||||
{ "collection": "systems", "field": "name", "type": "string", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "systems", "field": "status", "type": "string", "meta": null, "schema": { "is_nullable": false, "default_value": "active" } },
|
||||
{ "collection": "systems", "field": "created_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
{ "collection": "systems", "field": "updated_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
|
||||
{ "collection": "roles", "field": "id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "is_primary_key": true, "default_value": "gen_random_uuid()" } },
|
||||
{ "collection": "roles", "field": "role_key", "type": "string", "meta": null, "schema": { "is_nullable": false, "is_unique": true } },
|
||||
{ "collection": "roles", "field": "role_code", "type": "string", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "roles", "field": "system_id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "foreign_key_table": "systems", "foreign_key_column": "id" } },
|
||||
{ "collection": "roles", "field": "name", "type": "string", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "roles", "field": "description", "type": "text", "meta": null, "schema": { "is_nullable": true } },
|
||||
{ "collection": "roles", "field": "status", "type": "string", "meta": null, "schema": { "is_nullable": false, "default_value": "active" } },
|
||||
{ "collection": "roles", "field": "created_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
{ "collection": "roles", "field": "updated_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
|
||||
{ "collection": "site_roles", "field": "id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "is_primary_key": true, "default_value": "gen_random_uuid()" } },
|
||||
{ "collection": "site_roles", "field": "site_id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "foreign_key_table": "sites", "foreign_key_column": "id" } },
|
||||
{ "collection": "site_roles", "field": "role_id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "foreign_key_table": "roles", "foreign_key_column": "id" } },
|
||||
{ "collection": "site_roles", "field": "created_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
|
||||
{ "collection": "user_sites", "field": "id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "is_primary_key": true, "default_value": "gen_random_uuid()" } },
|
||||
{ "collection": "user_sites", "field": "user_id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "foreign_key_table": "users", "foreign_key_column": "id" } },
|
||||
{ "collection": "user_sites", "field": "site_id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "foreign_key_table": "sites", "foreign_key_column": "id" } },
|
||||
{ "collection": "user_sites", "field": "created_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
{ "collection": "user_sites", "field": "updated_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
|
||||
{ "collection": "auth_sync_state", "field": "id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "is_primary_key": true, "default_value": "gen_random_uuid()" } },
|
||||
{ "collection": "auth_sync_state", "field": "entity_type", "type": "string", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "auth_sync_state", "field": "entity_id", "type": "uuid", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "auth_sync_state", "field": "last_synced_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": true } },
|
||||
{ "collection": "auth_sync_state", "field": "source_version", "type": "string", "meta": null, "schema": { "is_nullable": true } },
|
||||
{ "collection": "auth_sync_state", "field": "last_error", "type": "text", "meta": null, "schema": { "is_nullable": true } },
|
||||
{ "collection": "auth_sync_state", "field": "updated_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
|
||||
{ "collection": "api_clients", "field": "id", "type": "uuid", "meta": null, "schema": { "is_nullable": false, "is_primary_key": true, "default_value": "gen_random_uuid()" } },
|
||||
{ "collection": "api_clients", "field": "client_key", "type": "string", "meta": null, "schema": { "is_nullable": false, "is_unique": true } },
|
||||
{ "collection": "api_clients", "field": "name", "type": "string", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "api_clients", "field": "status", "type": "string", "meta": null, "schema": { "is_nullable": false, "default_value": "active" } },
|
||||
{ "collection": "api_clients", "field": "api_key_hash", "type": "text", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "api_clients", "field": "allowed_origins", "type": "json", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "api_clients", "field": "allowed_ips", "type": "json", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "api_clients", "field": "allowed_paths", "type": "json", "meta": null, "schema": { "is_nullable": false } },
|
||||
{ "collection": "api_clients", "field": "rate_limit_per_min", "type": "integer", "meta": null, "schema": { "is_nullable": true } },
|
||||
{ "collection": "api_clients", "field": "expires_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": true } },
|
||||
{ "collection": "api_clients", "field": "last_used_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": true } },
|
||||
{ "collection": "api_clients", "field": "created_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } },
|
||||
{ "collection": "api_clients", "field": "updated_at", "type": "timestamp", "meta": null, "schema": { "is_nullable": false, "default_value": "now()" } }
|
||||
],
|
||||
"relations": [
|
||||
{
|
||||
"collection": "sites",
|
||||
"field": "company_id",
|
||||
"related_collection": "companies",
|
||||
"schema": {
|
||||
"table": "sites",
|
||||
"column": "company_id",
|
||||
"foreign_key_table": "companies",
|
||||
"foreign_key_column": "id",
|
||||
"on_update": "NO ACTION",
|
||||
"on_delete": "CASCADE"
|
||||
},
|
||||
"meta": null
|
||||
},
|
||||
{
|
||||
"collection": "roles",
|
||||
"field": "system_id",
|
||||
"related_collection": "systems",
|
||||
"schema": {
|
||||
"table": "roles",
|
||||
"column": "system_id",
|
||||
"foreign_key_table": "systems",
|
||||
"foreign_key_column": "id",
|
||||
"on_update": "NO ACTION",
|
||||
"on_delete": "CASCADE"
|
||||
},
|
||||
"meta": null
|
||||
},
|
||||
{
|
||||
"collection": "site_roles",
|
||||
"field": "site_id",
|
||||
"related_collection": "sites",
|
||||
"schema": {
|
||||
"table": "site_roles",
|
||||
"column": "site_id",
|
||||
"foreign_key_table": "sites",
|
||||
"foreign_key_column": "id",
|
||||
"on_update": "NO ACTION",
|
||||
"on_delete": "CASCADE"
|
||||
},
|
||||
"meta": null
|
||||
},
|
||||
{
|
||||
"collection": "site_roles",
|
||||
"field": "role_id",
|
||||
"related_collection": "roles",
|
||||
"schema": {
|
||||
"table": "site_roles",
|
||||
"column": "role_id",
|
||||
"foreign_key_table": "roles",
|
||||
"foreign_key_column": "id",
|
||||
"on_update": "NO ACTION",
|
||||
"on_delete": "CASCADE"
|
||||
},
|
||||
"meta": null
|
||||
},
|
||||
{
|
||||
"collection": "user_sites",
|
||||
"field": "user_id",
|
||||
"related_collection": "users",
|
||||
"schema": {
|
||||
"table": "user_sites",
|
||||
"column": "user_id",
|
||||
"foreign_key_table": "users",
|
||||
"foreign_key_column": "id",
|
||||
"on_update": "NO ACTION",
|
||||
"on_delete": "CASCADE"
|
||||
},
|
||||
"meta": null
|
||||
},
|
||||
{
|
||||
"collection": "user_sites",
|
||||
"field": "site_id",
|
||||
"related_collection": "sites",
|
||||
"schema": {
|
||||
"table": "user_sites",
|
||||
"column": "site_id",
|
||||
"foreign_key_table": "sites",
|
||||
"foreign_key_column": "id",
|
||||
"on_update": "NO ACTION",
|
||||
"on_delete": "CASCADE"
|
||||
},
|
||||
"meta": null
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user