From 90cec3e089ca402cb81a6b217f003d35e6a08044 Mon Sep 17 00:00:00 2001 From: Will Kelly Date: Wed, 6 Mar 2024 15:58:16 -0600 Subject: [PATCH 1/4] add renderings table. Move gateway to walangmeta. Rename some properties --- .gitignore | 3 +- controller/Dockerfile | 6 + .../drizzle/0015_outgoing_the_anarchist.sql | 49 + controller/drizzle/0016_sudden_jocasta.sql | 5 + controller/drizzle/0017_fat_loa.sql | 2 + .../drizzle/0018_dry_professor_monster.sql | 31 + controller/drizzle/0019_square_jubilee.sql | 2 + controller/drizzle/0020_right_mojo.sql | 1 + controller/drizzle/meta/0015_snapshot.json | 925 +++++++++++++++++ controller/drizzle/meta/0016_snapshot.json | 943 +++++++++++++++++ controller/drizzle/meta/0017_snapshot.json | 955 ++++++++++++++++++ controller/drizzle/meta/0018_snapshot.json | 955 ++++++++++++++++++ controller/drizzle/meta/0019_snapshot.json | 943 +++++++++++++++++ controller/drizzle/meta/0020_snapshot.json | 943 +++++++++++++++++ controller/drizzle/meta/_journal.json | 42 + controller/package.json | 18 +- controller/pnpm-lock.yaml | 491 ++++----- controller/src/db/handlers/index.ts | 2 +- controller/src/db/schema/schema.ts | 33 +- controller/src/db/utils/getMocks.ts | 11 +- .../src/functions/{bus.ts => git-bus.ts} | 0 controller/src/functions/renderings-bus.ts | 130 +++ controller/src/routes/content.ts | 2 +- controller/src/routes/language.ts | 1 + controller/src/routes/rendering.ts | 78 +- controller/src/routes/validation/index.ts | 31 +- controller/src/utils.ts | 2 +- docker-compose.yml | 43 +- .../languageapi/tables/public_language.yaml | 24 +- .../tables/public_languages_to_languages.yaml | 10 +- .../languageapi/tables/public_rendering.yaml | 2 - makefile | 4 +- 32 files changed, 6360 insertions(+), 327 deletions(-) create mode 100644 controller/drizzle/0015_outgoing_the_anarchist.sql create mode 100644 controller/drizzle/0016_sudden_jocasta.sql create mode 100644 controller/drizzle/0017_fat_loa.sql create mode 100644 controller/drizzle/0018_dry_professor_monster.sql create mode 100644 controller/drizzle/0019_square_jubilee.sql create mode 100644 controller/drizzle/0020_right_mojo.sql create mode 100644 controller/drizzle/meta/0015_snapshot.json create mode 100644 controller/drizzle/meta/0016_snapshot.json create mode 100644 controller/drizzle/meta/0017_snapshot.json create mode 100644 controller/drizzle/meta/0018_snapshot.json create mode 100644 controller/drizzle/meta/0019_snapshot.json create mode 100644 controller/drizzle/meta/0020_snapshot.json rename controller/src/functions/{bus.ts => git-bus.ts} (100%) create mode 100644 controller/src/functions/renderings-bus.ts diff --git a/.gitignore b/.gitignore index 85ad588..4e16e73 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ hasura/seeds/languageapi/data_dump.sql data_dump.sql proj_notes.md mise.toml -.tool-versions \ No newline at end of file +.tool-versions +launch.json \ No newline at end of file diff --git a/controller/Dockerfile b/controller/Dockerfile index ded734e..f0237a0 100644 --- a/controller/Dockerfile +++ b/controller/Dockerfile @@ -13,6 +13,12 @@ ENV AzureWebJobsScriptRoot=/home/site/wwwroot \ WORKDIR /home/site/wwwroot COPY . . + +RUN apt-get update && \ + apt-get install -y postgresql-client && \ + rm -rf /var/lib/apt/lists/* + + ARG DATABASE_URL # I have no clue why, but when I included azure core tools as part of the controller dependencies using the core tools node package, the func command reliably broke, but not when installed globally # Enable `pnpm add --global` on Alpine Linux by setting diff --git a/controller/drizzle/0015_outgoing_the_anarchist.sql b/controller/drizzle/0015_outgoing_the_anarchist.sql new file mode 100644 index 0000000..6df333d --- /dev/null +++ b/controller/drizzle/0015_outgoing_the_anarchist.sql @@ -0,0 +1,49 @@ + +-- REMOVE OLD CONSTRAINTS +ALTER TABLE "languages_to_languages" DROP CONSTRAINT "languages_to_languages_gateway_language_ietf_language_ietf_code"; +--> statement-breakpoint + +ALTER TABLE "languages_to_languages" DROP CONSTRAINT "languages_to_languages_gateway_language_to_ietf_language_ietf_c"; +--> statement-breakpoint + +ALTER TABLE "languages_to_languages" DROP CONSTRAINT "languages_to_languages_gateway_language_ietf_gateway_language_t"; +--> statement-breakpoint + +ALTER TABLE "connected_content" DROP CONSTRAINT "connected_content_content_id_1_content_id_2";--> statement-breakpoint +ALTER TABLE "country_to_language" DROP CONSTRAINT "country_to_language_language_ietf_code_country_alpha_2";--> statement-breakpoint +ALTER TABLE "connected_content" ADD CONSTRAINT "connected_content_pkey" PRIMARY KEY("content_id_1","content_id_2");--> statement-breakpoint +ALTER TABLE "country_to_language" ADD CONSTRAINT "country_to_language_pkey" PRIMARY KEY("language_ietf_code","country_alpha_2");--> statement-breakpoint + + +-- RENAME TABLE +ALTER TABLE IF EXISTS "languages_to_languages" RENAME TO "gateway_language_to_dependent_language"; +--> statement-breakpoint + +-- RENAME COLUMN +ALTER TABLE "gateway_language_to_dependent_language" RENAME COLUMN "gateway_language_to_ietf" TO "dependent_language_ietf"; +--> statement-breakpoint + + + + + +-- ADD NEW CONSTRAINTS +-- primary +ALTER TABLE "gateway_language_to_dependent_language" ADD CONSTRAINT "gateway_dependent_pkey" PRIMARY KEY("gateway_language_ietf","dependent_language_ietf"); +--> statement-breakpoint + +-- foreign +DO $$ BEGIN + ALTER TABLE "gateway_language_to_dependent_language" ADD CONSTRAINT "gl_glietf_language_ietf_code_fk" FOREIGN KEY ("gateway_language_ietf") REFERENCES "language"("ietf_code") ON DELETE cascade ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint + +-- foreign +DO $$ BEGIN + ALTER TABLE "gateway_language_to_dependent_language" ADD CONSTRAINT "gl_dependent_ietf_language_ietf_code_fk" FOREIGN KEY ("dependent_language_ietf") REFERENCES "language"("ietf_code") ON DELETE cascade ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint diff --git a/controller/drizzle/0016_sudden_jocasta.sql b/controller/drizzle/0016_sudden_jocasta.sql new file mode 100644 index 0000000..973f0b1 --- /dev/null +++ b/controller/drizzle/0016_sudden_jocasta.sql @@ -0,0 +1,5 @@ +ALTER TABLE "scriptural_rendering_metadata" ALTER COLUMN "book_name" DROP NOT NULL;--> statement-breakpoint +ALTER TABLE "scriptural_rendering_metadata" ALTER COLUMN "chapter" DROP NOT NULL;--> statement-breakpoint +ALTER TABLE "scriptural_rendering_metadata" ADD COLUMN "is_whole_chapter" boolean NOT NULL;--> statement-breakpoint +ALTER TABLE "scriptural_rendering_metadata" ADD COLUMN "is_whole_book" boolean NOT NULL;--> statement-breakpoint +ALTER TABLE "scriptural_rendering_metadata" ADD COLUMN "is_whole_project" boolean NOT NULL; \ No newline at end of file diff --git a/controller/drizzle/0017_fat_loa.sql b/controller/drizzle/0017_fat_loa.sql new file mode 100644 index 0000000..5238c6c --- /dev/null +++ b/controller/drizzle/0017_fat_loa.sql @@ -0,0 +1,2 @@ +ALTER TABLE "wa_language_meta" ADD COLUMN "is_gateway" boolean NOT NULL;--> statement-breakpoint +ALTER TABLE "rendering" ADD COLUMN "hash" varchar; \ No newline at end of file diff --git a/controller/drizzle/0018_dry_professor_monster.sql b/controller/drizzle/0018_dry_professor_monster.sql new file mode 100644 index 0000000..4b1d311 --- /dev/null +++ b/controller/drizzle/0018_dry_professor_monster.sql @@ -0,0 +1,31 @@ +-- Custom SQL migration file, put you code below! -- +-- Custom SQL migration file, put your code below! -- +-- View: public.vw_langnames + +CREATE OR REPLACE VIEW public.vw_langnames + AS +SELECT language.ietf_code AS lc, + language.national_name AS ln, + language.english_name AS ang, + language.direction AS ld, + CASE + WHEN ( + EXISTS ( + SELECT 1 FROM wa_language_meta WHERE wa_language_meta.ietf_code = language.ietf_code AND wa_language_meta.is_gateway + ) + ) THEN true + ELSE false + END AS gw, + array_agg(DISTINCT country_cc.alpha_2) AS cc, + array_remove(array_agg(DISTINCT language_alternate_name.name), NULL::text) AS alt, + language.home_country_alpha2 AS hc, + world_region.region AS lr, + 1 AS pk +FROM language + LEFT JOIN country_to_language ON language.ietf_code::text = country_to_language.language_ietf_code::text + LEFT JOIN country AS country_cc ON country_to_language.country_alpha_2::text = country_cc.alpha_2::text + LEFT JOIN country AS country_hc ON language.home_country_alpha2::text = country_hc.alpha_2::text + LEFT JOIN language_alternate_name ON language.ietf_code::text = language_alternate_name.ietf_code::text + LEFT JOIN world_region ON country_hc.world_region_id = world_region.id + LEFT JOIN wa_language_meta on language.ietf_code::text = wa_language_meta.ietf_code::text +GROUP BY language.ietf_code, language.national_name, language.english_name, language.direction, world_region.region; diff --git a/controller/drizzle/0019_square_jubilee.sql b/controller/drizzle/0019_square_jubilee.sql new file mode 100644 index 0000000..b18f2ce --- /dev/null +++ b/controller/drizzle/0019_square_jubilee.sql @@ -0,0 +1,2 @@ +ALTER TABLE "rendering" DROP COLUMN IF EXISTS "does_cover_all_content";--> statement-breakpoint +ALTER TABLE "scriptural_rendering_metadata" DROP COLUMN IF EXISTS "is_whole_chapter"; \ No newline at end of file diff --git a/controller/drizzle/0020_right_mojo.sql b/controller/drizzle/0020_right_mojo.sql new file mode 100644 index 0000000..d491089 --- /dev/null +++ b/controller/drizzle/0020_right_mojo.sql @@ -0,0 +1 @@ +ALTER TABLE "scriptural_rendering_metadata" ALTER COLUMN "book_slug" DROP NOT NULL; \ No newline at end of file diff --git a/controller/drizzle/meta/0015_snapshot.json b/controller/drizzle/meta/0015_snapshot.json new file mode 100644 index 0000000..75f605b --- /dev/null +++ b/controller/drizzle/meta/0015_snapshot.json @@ -0,0 +1,925 @@ +{ + "id": "d35863e1-4dca-4820-946d-e7163956ad3d", + "prevId": "362ef18d-86fa-4bae-b430-30ac77200e9c", + "version": "5", + "dialect": "pg", + "tables": { + "language": { + "name": "language", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "national_name": { + "name": "national_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "english_name": { + "name": "english_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "direction": { + "name": "direction", + "type": "direction", + "primaryKey": false, + "notNull": true + }, + "iso6393": { + "name": "iso6393", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp(0)", + "primaryKey": false, + "notNull": false + }, + "is_oral_language": { + "name": "is_oral_language", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "home_country_alpha2": { + "name": "home_country_alpha2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "ietf_idx": { + "name": "ietf_idx", + "columns": [ + "ietf_code" + ], + "isUnique": true + }, + "id_idx": { + "name": "id_idx", + "columns": [ + "id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_home_country_alpha2_country_alpha_2_fk": { + "name": "language_home_country_alpha2_country_alpha_2_fk", + "tableFrom": "language", + "tableTo": "country", + "columnsFrom": [ + "home_country_alpha2" + ], + "columnsTo": [ + "alpha_2" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_language_meta": { + "name": "wa_language_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "wa_language_meta_ietf_code_language_ietf_code_fk": { + "name": "wa_language_meta_ietf_code_language_ietf_code_fk", + "tableFrom": "wa_language_meta", + "tableTo": "language", + "columnsFrom": [ + "ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "language_alternate_name": { + "name": "language_alternate_name", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "name_ietf_idx": { + "name": "name_ietf_idx", + "columns": [ + "name", + "ietf_code" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_alternate_name_ietf_code_language_ietf_code_fk": { + "name": "language_alternate_name_ietf_code_language_ietf_code_fk", + "tableFrom": "language_alternate_name", + "tableTo": "language", + "columnsFrom": [ + "ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gateway_language_to_dependent_language": { + "name": "gateway_language_to_dependent_language", + "schema": "", + "columns": { + "gateway_language_ietf": { + "name": "gateway_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "dependent_language_ietf": { + "name": "dependent_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "tableTo": "language", + "columnsFrom": [ + "gateway_language_ietf" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "tableTo": "language", + "columnsFrom": [ + "dependent_language_ietf" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "gateway_dependent_pkey": { + "name": "gateway_dependent_pkey", + "columns": [ + "gateway_language_ietf", + "dependent_language_ietf" + ] + } + }, + "uniqueConstraints": {} + }, + "content": { + "name": "content", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(256)", + "primaryKey": true, + "notNull": true + }, + "language_id": { + "name": "language_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "type_id", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "domain", + "primaryKey": false, + "notNull": false + }, + "resource_type": { + "name": "resource_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "git_id": { + "name": "git_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "level": { + "name": "level", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "content_language_id_language_ietf_code_fk": { + "name": "content_language_id_language_ietf_code_fk", + "tableFrom": "content", + "tableTo": "language", + "columnsFrom": [ + "language_id" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_content_meta": { + "name": "wa_content_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "content_idx": { + "name": "content_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "wa_content_meta_content_id_content_id_fk": { + "name": "wa_content_meta_content_id_content_id_fk", + "tableFrom": "wa_content_meta", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "connected_content": { + "name": "connected_content", + "schema": "", + "columns": { + "content_id_1": { + "name": "content_id_1", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "content_id_2": { + "name": "content_id_2", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "connected_content_content_id_1_content_id_fk": { + "name": "connected_content_content_id_1_content_id_fk", + "tableFrom": "connected_content", + "tableTo": "content", + "columnsFrom": [ + "content_id_1" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "connected_content_content_id_2_content_id_fk": { + "name": "connected_content_content_id_2_content_id_fk", + "tableFrom": "connected_content", + "tableTo": "content", + "columnsFrom": [ + "content_id_2" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "connected_content_pkey": { + "name": "connected_content_pkey", + "columns": [ + "content_id_1", + "content_id_2" + ] + } + }, + "uniqueConstraints": {} + }, + "git_repo": { + "name": "git_repo", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_name": { + "name": "repo_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_url": { + "name": "repo_url", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "username_reponame_idx": { + "name": "username_reponame_idx", + "columns": [ + "username", + "repo_name" + ], + "isUnique": true + }, + "content_id_idx": { + "name": "content_id_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "git_repo_content_id_content_id_fk": { + "name": "git_repo_content_id_content_id_fk", + "tableFrom": "git_repo", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "rendering": { + "name": "rendering", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_type": { + "name": "file_type", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_size_bytes": { + "name": "file_size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "does_cover_all_content": { + "name": "does_cover_all_content", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "rendering_unique_idx": { + "name": "rendering_unique_idx", + "columns": [ + "url" + ], + "isUnique": true + } + }, + "foreignKeys": { + "rendering_content_id_content_id_fk": { + "name": "rendering_content_id_content_id_fk", + "tableFrom": "rendering", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "scriptural_rendering_metadata": { + "name": "scriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "book_slug": { + "name": "book_slug", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true + }, + "book_name": { + "name": "book_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "chapter": { + "name": "chapter", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "sort": { + "name": "sort", + "type": "smallint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "scriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "scriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "scriptural_rendering_metadata", + "tableTo": "rendering", + "columnsFrom": [ + "rendering_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "nonscriptural_rendering_metadata": { + "name": "nonscriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "additional_data": { + "name": "additional_data", + "type": "json", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "nonscriptural_rendering_metadata", + "tableTo": "rendering", + "columnsFrom": [ + "rendering_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "world_region": { + "name": "world_region", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "region_name_idx": { + "name": "region_name_idx", + "columns": [ + "region" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country": { + "name": "country", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "world_region_id": { + "name": "world_region_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "alpha_2": { + "name": "alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "alpha_3": { + "name": "alpha_3", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "population": { + "name": "population", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "alpha_2_idx": { + "name": "alpha_2_idx", + "columns": [ + "alpha_2" + ], + "isUnique": true + } + }, + "foreignKeys": { + "country_world_region_id_world_region_id_fk": { + "name": "country_world_region_id_world_region_id_fk", + "tableFrom": "country", + "tableTo": "world_region", + "columnsFrom": [ + "world_region_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country_to_language": { + "name": "country_to_language", + "schema": "", + "columns": { + "language_ietf_code": { + "name": "language_ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "country_alpha_2": { + "name": "country_alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "country_to_language_language_ietf_code_language_ietf_code_fk": { + "name": "country_to_language_language_ietf_code_language_ietf_code_fk", + "tableFrom": "country_to_language", + "tableTo": "language", + "columnsFrom": [ + "language_ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "country_to_language_country_alpha_2_country_alpha_2_fk": { + "name": "country_to_language_country_alpha_2_country_alpha_2_fk", + "tableFrom": "country_to_language", + "tableTo": "country", + "columnsFrom": [ + "country_alpha_2" + ], + "columnsTo": [ + "alpha_2" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "country_to_language_pkey": { + "name": "country_to_language_pkey", + "columns": [ + "language_ietf_code", + "country_alpha_2" + ] + } + }, + "uniqueConstraints": {} + } + }, + "enums": { + "direction": { + "name": "direction", + "values": { + "ltr": "ltr", + "rtl": "rtl" + } + }, + "type_id": { + "name": "type_id", + "values": { + "text": "text", + "audio": "audio", + "video": "video", + "braille": "braille" + } + }, + "domain": { + "name": "domain", + "values": { + "scripture": "scripture", + "gloss": "gloss", + "parascriptural": "parascriptural", + "peripheral": "peripheral" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/controller/drizzle/meta/0016_snapshot.json b/controller/drizzle/meta/0016_snapshot.json new file mode 100644 index 0000000..5c00a42 --- /dev/null +++ b/controller/drizzle/meta/0016_snapshot.json @@ -0,0 +1,943 @@ +{ + "id": "f9516fb9-5202-4f0d-afd8-cbd2a488df57", + "prevId": "d35863e1-4dca-4820-946d-e7163956ad3d", + "version": "5", + "dialect": "pg", + "tables": { + "language": { + "name": "language", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "national_name": { + "name": "national_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "english_name": { + "name": "english_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "direction": { + "name": "direction", + "type": "direction", + "primaryKey": false, + "notNull": true + }, + "iso6393": { + "name": "iso6393", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp(0)", + "primaryKey": false, + "notNull": false + }, + "is_oral_language": { + "name": "is_oral_language", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "home_country_alpha2": { + "name": "home_country_alpha2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "ietf_idx": { + "name": "ietf_idx", + "columns": [ + "ietf_code" + ], + "isUnique": true + }, + "id_idx": { + "name": "id_idx", + "columns": [ + "id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_home_country_alpha2_country_alpha_2_fk": { + "name": "language_home_country_alpha2_country_alpha_2_fk", + "tableFrom": "language", + "tableTo": "country", + "columnsFrom": [ + "home_country_alpha2" + ], + "columnsTo": [ + "alpha_2" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_language_meta": { + "name": "wa_language_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "wa_language_meta_ietf_code_language_ietf_code_fk": { + "name": "wa_language_meta_ietf_code_language_ietf_code_fk", + "tableFrom": "wa_language_meta", + "tableTo": "language", + "columnsFrom": [ + "ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "language_alternate_name": { + "name": "language_alternate_name", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "name_ietf_idx": { + "name": "name_ietf_idx", + "columns": [ + "name", + "ietf_code" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_alternate_name_ietf_code_language_ietf_code_fk": { + "name": "language_alternate_name_ietf_code_language_ietf_code_fk", + "tableFrom": "language_alternate_name", + "tableTo": "language", + "columnsFrom": [ + "ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gateway_language_to_dependent_language": { + "name": "gateway_language_to_dependent_language", + "schema": "", + "columns": { + "gateway_language_ietf": { + "name": "gateway_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "dependent_language_ietf": { + "name": "dependent_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "tableTo": "language", + "columnsFrom": [ + "gateway_language_ietf" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "tableTo": "language", + "columnsFrom": [ + "dependent_language_ietf" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "gateway_dependent_pkey": { + "name": "gateway_dependent_pkey", + "columns": [ + "gateway_language_ietf", + "dependent_language_ietf" + ] + } + }, + "uniqueConstraints": {} + }, + "content": { + "name": "content", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(256)", + "primaryKey": true, + "notNull": true + }, + "language_id": { + "name": "language_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "type_id", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "domain", + "primaryKey": false, + "notNull": false + }, + "resource_type": { + "name": "resource_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "git_id": { + "name": "git_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "level": { + "name": "level", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "content_language_id_language_ietf_code_fk": { + "name": "content_language_id_language_ietf_code_fk", + "tableFrom": "content", + "tableTo": "language", + "columnsFrom": [ + "language_id" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_content_meta": { + "name": "wa_content_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "content_idx": { + "name": "content_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "wa_content_meta_content_id_content_id_fk": { + "name": "wa_content_meta_content_id_content_id_fk", + "tableFrom": "wa_content_meta", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "connected_content": { + "name": "connected_content", + "schema": "", + "columns": { + "content_id_1": { + "name": "content_id_1", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "content_id_2": { + "name": "content_id_2", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "connected_content_content_id_1_content_id_fk": { + "name": "connected_content_content_id_1_content_id_fk", + "tableFrom": "connected_content", + "tableTo": "content", + "columnsFrom": [ + "content_id_1" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "connected_content_content_id_2_content_id_fk": { + "name": "connected_content_content_id_2_content_id_fk", + "tableFrom": "connected_content", + "tableTo": "content", + "columnsFrom": [ + "content_id_2" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "connected_content_pkey": { + "name": "connected_content_pkey", + "columns": [ + "content_id_1", + "content_id_2" + ] + } + }, + "uniqueConstraints": {} + }, + "git_repo": { + "name": "git_repo", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_name": { + "name": "repo_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_url": { + "name": "repo_url", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "username_reponame_idx": { + "name": "username_reponame_idx", + "columns": [ + "username", + "repo_name" + ], + "isUnique": true + }, + "content_id_idx": { + "name": "content_id_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "git_repo_content_id_content_id_fk": { + "name": "git_repo_content_id_content_id_fk", + "tableFrom": "git_repo", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "rendering": { + "name": "rendering", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_type": { + "name": "file_type", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_size_bytes": { + "name": "file_size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "does_cover_all_content": { + "name": "does_cover_all_content", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "rendering_unique_idx": { + "name": "rendering_unique_idx", + "columns": [ + "url" + ], + "isUnique": true + } + }, + "foreignKeys": { + "rendering_content_id_content_id_fk": { + "name": "rendering_content_id_content_id_fk", + "tableFrom": "rendering", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "scriptural_rendering_metadata": { + "name": "scriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "book_slug": { + "name": "book_slug", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true + }, + "book_name": { + "name": "book_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "chapter": { + "name": "chapter", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_whole_chapter": { + "name": "is_whole_chapter", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "is_whole_book": { + "name": "is_whole_book", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "is_whole_project": { + "name": "is_whole_project", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "sort": { + "name": "sort", + "type": "smallint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "scriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "scriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "scriptural_rendering_metadata", + "tableTo": "rendering", + "columnsFrom": [ + "rendering_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "nonscriptural_rendering_metadata": { + "name": "nonscriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "additional_data": { + "name": "additional_data", + "type": "json", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "nonscriptural_rendering_metadata", + "tableTo": "rendering", + "columnsFrom": [ + "rendering_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "world_region": { + "name": "world_region", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "region_name_idx": { + "name": "region_name_idx", + "columns": [ + "region" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country": { + "name": "country", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "world_region_id": { + "name": "world_region_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "alpha_2": { + "name": "alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "alpha_3": { + "name": "alpha_3", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "population": { + "name": "population", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "alpha_2_idx": { + "name": "alpha_2_idx", + "columns": [ + "alpha_2" + ], + "isUnique": true + } + }, + "foreignKeys": { + "country_world_region_id_world_region_id_fk": { + "name": "country_world_region_id_world_region_id_fk", + "tableFrom": "country", + "tableTo": "world_region", + "columnsFrom": [ + "world_region_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country_to_language": { + "name": "country_to_language", + "schema": "", + "columns": { + "language_ietf_code": { + "name": "language_ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "country_alpha_2": { + "name": "country_alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "country_to_language_language_ietf_code_language_ietf_code_fk": { + "name": "country_to_language_language_ietf_code_language_ietf_code_fk", + "tableFrom": "country_to_language", + "tableTo": "language", + "columnsFrom": [ + "language_ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "country_to_language_country_alpha_2_country_alpha_2_fk": { + "name": "country_to_language_country_alpha_2_country_alpha_2_fk", + "tableFrom": "country_to_language", + "tableTo": "country", + "columnsFrom": [ + "country_alpha_2" + ], + "columnsTo": [ + "alpha_2" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "country_to_language_pkey": { + "name": "country_to_language_pkey", + "columns": [ + "language_ietf_code", + "country_alpha_2" + ] + } + }, + "uniqueConstraints": {} + } + }, + "enums": { + "direction": { + "name": "direction", + "values": { + "ltr": "ltr", + "rtl": "rtl" + } + }, + "type_id": { + "name": "type_id", + "values": { + "text": "text", + "audio": "audio", + "video": "video", + "braille": "braille" + } + }, + "domain": { + "name": "domain", + "values": { + "scripture": "scripture", + "gloss": "gloss", + "parascriptural": "parascriptural", + "peripheral": "peripheral" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/controller/drizzle/meta/0017_snapshot.json b/controller/drizzle/meta/0017_snapshot.json new file mode 100644 index 0000000..83e6421 --- /dev/null +++ b/controller/drizzle/meta/0017_snapshot.json @@ -0,0 +1,955 @@ +{ + "id": "58ca0b3d-0eb2-44e2-88e4-a87891841424", + "prevId": "f9516fb9-5202-4f0d-afd8-cbd2a488df57", + "version": "5", + "dialect": "pg", + "tables": { + "language": { + "name": "language", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "national_name": { + "name": "national_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "english_name": { + "name": "english_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "direction": { + "name": "direction", + "type": "direction", + "primaryKey": false, + "notNull": true + }, + "iso6393": { + "name": "iso6393", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp(0)", + "primaryKey": false, + "notNull": false + }, + "is_oral_language": { + "name": "is_oral_language", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "home_country_alpha2": { + "name": "home_country_alpha2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "ietf_idx": { + "name": "ietf_idx", + "columns": [ + "ietf_code" + ], + "isUnique": true + }, + "id_idx": { + "name": "id_idx", + "columns": [ + "id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_home_country_alpha2_country_alpha_2_fk": { + "name": "language_home_country_alpha2_country_alpha_2_fk", + "tableFrom": "language", + "tableTo": "country", + "columnsFrom": [ + "home_country_alpha2" + ], + "columnsTo": [ + "alpha_2" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_language_meta": { + "name": "wa_language_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "is_gateway": { + "name": "is_gateway", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "wa_language_meta_ietf_code_language_ietf_code_fk": { + "name": "wa_language_meta_ietf_code_language_ietf_code_fk", + "tableFrom": "wa_language_meta", + "tableTo": "language", + "columnsFrom": [ + "ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "language_alternate_name": { + "name": "language_alternate_name", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "name_ietf_idx": { + "name": "name_ietf_idx", + "columns": [ + "name", + "ietf_code" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_alternate_name_ietf_code_language_ietf_code_fk": { + "name": "language_alternate_name_ietf_code_language_ietf_code_fk", + "tableFrom": "language_alternate_name", + "tableTo": "language", + "columnsFrom": [ + "ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gateway_language_to_dependent_language": { + "name": "gateway_language_to_dependent_language", + "schema": "", + "columns": { + "gateway_language_ietf": { + "name": "gateway_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "dependent_language_ietf": { + "name": "dependent_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "tableTo": "language", + "columnsFrom": [ + "gateway_language_ietf" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "tableTo": "language", + "columnsFrom": [ + "dependent_language_ietf" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "gateway_dependent_pkey": { + "name": "gateway_dependent_pkey", + "columns": [ + "gateway_language_ietf", + "dependent_language_ietf" + ] + } + }, + "uniqueConstraints": {} + }, + "content": { + "name": "content", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(256)", + "primaryKey": true, + "notNull": true + }, + "language_id": { + "name": "language_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "type_id", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "domain", + "primaryKey": false, + "notNull": false + }, + "resource_type": { + "name": "resource_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "git_id": { + "name": "git_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "level": { + "name": "level", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "content_language_id_language_ietf_code_fk": { + "name": "content_language_id_language_ietf_code_fk", + "tableFrom": "content", + "tableTo": "language", + "columnsFrom": [ + "language_id" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_content_meta": { + "name": "wa_content_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "content_idx": { + "name": "content_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "wa_content_meta_content_id_content_id_fk": { + "name": "wa_content_meta_content_id_content_id_fk", + "tableFrom": "wa_content_meta", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "connected_content": { + "name": "connected_content", + "schema": "", + "columns": { + "content_id_1": { + "name": "content_id_1", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "content_id_2": { + "name": "content_id_2", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "connected_content_content_id_1_content_id_fk": { + "name": "connected_content_content_id_1_content_id_fk", + "tableFrom": "connected_content", + "tableTo": "content", + "columnsFrom": [ + "content_id_1" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "connected_content_content_id_2_content_id_fk": { + "name": "connected_content_content_id_2_content_id_fk", + "tableFrom": "connected_content", + "tableTo": "content", + "columnsFrom": [ + "content_id_2" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "connected_content_pkey": { + "name": "connected_content_pkey", + "columns": [ + "content_id_1", + "content_id_2" + ] + } + }, + "uniqueConstraints": {} + }, + "git_repo": { + "name": "git_repo", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_name": { + "name": "repo_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_url": { + "name": "repo_url", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "username_reponame_idx": { + "name": "username_reponame_idx", + "columns": [ + "username", + "repo_name" + ], + "isUnique": true + }, + "content_id_idx": { + "name": "content_id_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "git_repo_content_id_content_id_fk": { + "name": "git_repo_content_id_content_id_fk", + "tableFrom": "git_repo", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "rendering": { + "name": "rendering", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_type": { + "name": "file_type", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_size_bytes": { + "name": "file_size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "does_cover_all_content": { + "name": "does_cover_all_content", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "hash": { + "name": "hash", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "rendering_unique_idx": { + "name": "rendering_unique_idx", + "columns": [ + "url" + ], + "isUnique": true + } + }, + "foreignKeys": { + "rendering_content_id_content_id_fk": { + "name": "rendering_content_id_content_id_fk", + "tableFrom": "rendering", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "scriptural_rendering_metadata": { + "name": "scriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "book_slug": { + "name": "book_slug", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true + }, + "book_name": { + "name": "book_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "chapter": { + "name": "chapter", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_whole_chapter": { + "name": "is_whole_chapter", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "is_whole_book": { + "name": "is_whole_book", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "is_whole_project": { + "name": "is_whole_project", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "sort": { + "name": "sort", + "type": "smallint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "scriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "scriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "scriptural_rendering_metadata", + "tableTo": "rendering", + "columnsFrom": [ + "rendering_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "nonscriptural_rendering_metadata": { + "name": "nonscriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "additional_data": { + "name": "additional_data", + "type": "json", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "nonscriptural_rendering_metadata", + "tableTo": "rendering", + "columnsFrom": [ + "rendering_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "world_region": { + "name": "world_region", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "region_name_idx": { + "name": "region_name_idx", + "columns": [ + "region" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country": { + "name": "country", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "world_region_id": { + "name": "world_region_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "alpha_2": { + "name": "alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "alpha_3": { + "name": "alpha_3", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "population": { + "name": "population", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "alpha_2_idx": { + "name": "alpha_2_idx", + "columns": [ + "alpha_2" + ], + "isUnique": true + } + }, + "foreignKeys": { + "country_world_region_id_world_region_id_fk": { + "name": "country_world_region_id_world_region_id_fk", + "tableFrom": "country", + "tableTo": "world_region", + "columnsFrom": [ + "world_region_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country_to_language": { + "name": "country_to_language", + "schema": "", + "columns": { + "language_ietf_code": { + "name": "language_ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "country_alpha_2": { + "name": "country_alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "country_to_language_language_ietf_code_language_ietf_code_fk": { + "name": "country_to_language_language_ietf_code_language_ietf_code_fk", + "tableFrom": "country_to_language", + "tableTo": "language", + "columnsFrom": [ + "language_ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "country_to_language_country_alpha_2_country_alpha_2_fk": { + "name": "country_to_language_country_alpha_2_country_alpha_2_fk", + "tableFrom": "country_to_language", + "tableTo": "country", + "columnsFrom": [ + "country_alpha_2" + ], + "columnsTo": [ + "alpha_2" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "country_to_language_pkey": { + "name": "country_to_language_pkey", + "columns": [ + "language_ietf_code", + "country_alpha_2" + ] + } + }, + "uniqueConstraints": {} + } + }, + "enums": { + "direction": { + "name": "direction", + "values": { + "ltr": "ltr", + "rtl": "rtl" + } + }, + "type_id": { + "name": "type_id", + "values": { + "text": "text", + "audio": "audio", + "video": "video", + "braille": "braille" + } + }, + "domain": { + "name": "domain", + "values": { + "scripture": "scripture", + "gloss": "gloss", + "parascriptural": "parascriptural", + "peripheral": "peripheral" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/controller/drizzle/meta/0018_snapshot.json b/controller/drizzle/meta/0018_snapshot.json new file mode 100644 index 0000000..a8b7c17 --- /dev/null +++ b/controller/drizzle/meta/0018_snapshot.json @@ -0,0 +1,955 @@ +{ + "id": "28546805-6ca1-4ff5-8ad3-566c02476f4d", + "prevId": "58ca0b3d-0eb2-44e2-88e4-a87891841424", + "version": "5", + "dialect": "pg", + "tables": { + "language": { + "name": "language", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "national_name": { + "name": "national_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "english_name": { + "name": "english_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "direction": { + "name": "direction", + "type": "direction", + "primaryKey": false, + "notNull": true + }, + "iso6393": { + "name": "iso6393", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp(0)", + "primaryKey": false, + "notNull": false + }, + "is_oral_language": { + "name": "is_oral_language", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "home_country_alpha2": { + "name": "home_country_alpha2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "ietf_idx": { + "name": "ietf_idx", + "columns": [ + "ietf_code" + ], + "isUnique": true + }, + "id_idx": { + "name": "id_idx", + "columns": [ + "id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_home_country_alpha2_country_alpha_2_fk": { + "name": "language_home_country_alpha2_country_alpha_2_fk", + "tableFrom": "language", + "columnsFrom": [ + "home_country_alpha2" + ], + "tableTo": "country", + "columnsTo": [ + "alpha_2" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_language_meta": { + "name": "wa_language_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "is_gateway": { + "name": "is_gateway", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "wa_language_meta_ietf_code_language_ietf_code_fk": { + "name": "wa_language_meta_ietf_code_language_ietf_code_fk", + "tableFrom": "wa_language_meta", + "columnsFrom": [ + "ietf_code" + ], + "tableTo": "language", + "columnsTo": [ + "ietf_code" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "language_alternate_name": { + "name": "language_alternate_name", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "name_ietf_idx": { + "name": "name_ietf_idx", + "columns": [ + "name", + "ietf_code" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_alternate_name_ietf_code_language_ietf_code_fk": { + "name": "language_alternate_name_ietf_code_language_ietf_code_fk", + "tableFrom": "language_alternate_name", + "columnsFrom": [ + "ietf_code" + ], + "tableTo": "language", + "columnsTo": [ + "ietf_code" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gateway_language_to_dependent_language": { + "name": "gateway_language_to_dependent_language", + "schema": "", + "columns": { + "gateway_language_ietf": { + "name": "gateway_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "dependent_language_ietf": { + "name": "dependent_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "columnsFrom": [ + "gateway_language_ietf" + ], + "tableTo": "language", + "columnsTo": [ + "ietf_code" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + }, + "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "columnsFrom": [ + "dependent_language_ietf" + ], + "tableTo": "language", + "columnsTo": [ + "ietf_code" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": { + "gateway_dependent_pkey": { + "name": "gateway_dependent_pkey", + "columns": [ + "gateway_language_ietf", + "dependent_language_ietf" + ] + } + }, + "uniqueConstraints": {} + }, + "content": { + "name": "content", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(256)", + "primaryKey": true, + "notNull": true + }, + "language_id": { + "name": "language_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "type_id", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "domain", + "primaryKey": false, + "notNull": false + }, + "resource_type": { + "name": "resource_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "git_id": { + "name": "git_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "level": { + "name": "level", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "content_language_id_language_ietf_code_fk": { + "name": "content_language_id_language_ietf_code_fk", + "tableFrom": "content", + "columnsFrom": [ + "language_id" + ], + "tableTo": "language", + "columnsTo": [ + "ietf_code" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_content_meta": { + "name": "wa_content_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "content_idx": { + "name": "content_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "wa_content_meta_content_id_content_id_fk": { + "name": "wa_content_meta_content_id_content_id_fk", + "tableFrom": "wa_content_meta", + "columnsFrom": [ + "content_id" + ], + "tableTo": "content", + "columnsTo": [ + "id" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "connected_content": { + "name": "connected_content", + "schema": "", + "columns": { + "content_id_1": { + "name": "content_id_1", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "content_id_2": { + "name": "content_id_2", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "connected_content_content_id_1_content_id_fk": { + "name": "connected_content_content_id_1_content_id_fk", + "tableFrom": "connected_content", + "columnsFrom": [ + "content_id_1" + ], + "tableTo": "content", + "columnsTo": [ + "id" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + }, + "connected_content_content_id_2_content_id_fk": { + "name": "connected_content_content_id_2_content_id_fk", + "tableFrom": "connected_content", + "columnsFrom": [ + "content_id_2" + ], + "tableTo": "content", + "columnsTo": [ + "id" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": { + "connected_content_pkey": { + "name": "connected_content_pkey", + "columns": [ + "content_id_1", + "content_id_2" + ] + } + }, + "uniqueConstraints": {} + }, + "git_repo": { + "name": "git_repo", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_name": { + "name": "repo_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_url": { + "name": "repo_url", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "username_reponame_idx": { + "name": "username_reponame_idx", + "columns": [ + "username", + "repo_name" + ], + "isUnique": true + }, + "content_id_idx": { + "name": "content_id_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "git_repo_content_id_content_id_fk": { + "name": "git_repo_content_id_content_id_fk", + "tableFrom": "git_repo", + "columnsFrom": [ + "content_id" + ], + "tableTo": "content", + "columnsTo": [ + "id" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "rendering": { + "name": "rendering", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_type": { + "name": "file_type", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_size_bytes": { + "name": "file_size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "does_cover_all_content": { + "name": "does_cover_all_content", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "hash": { + "name": "hash", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "rendering_unique_idx": { + "name": "rendering_unique_idx", + "columns": [ + "url" + ], + "isUnique": true + } + }, + "foreignKeys": { + "rendering_content_id_content_id_fk": { + "name": "rendering_content_id_content_id_fk", + "tableFrom": "rendering", + "columnsFrom": [ + "content_id" + ], + "tableTo": "content", + "columnsTo": [ + "id" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "scriptural_rendering_metadata": { + "name": "scriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "book_slug": { + "name": "book_slug", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true + }, + "book_name": { + "name": "book_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "chapter": { + "name": "chapter", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_whole_chapter": { + "name": "is_whole_chapter", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "is_whole_book": { + "name": "is_whole_book", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "is_whole_project": { + "name": "is_whole_project", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "sort": { + "name": "sort", + "type": "smallint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "scriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "scriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "scriptural_rendering_metadata", + "columnsFrom": [ + "rendering_id" + ], + "tableTo": "rendering", + "columnsTo": [ + "id" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "nonscriptural_rendering_metadata": { + "name": "nonscriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "additional_data": { + "name": "additional_data", + "type": "json", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "nonscriptural_rendering_metadata", + "columnsFrom": [ + "rendering_id" + ], + "tableTo": "rendering", + "columnsTo": [ + "id" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "world_region": { + "name": "world_region", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "region_name_idx": { + "name": "region_name_idx", + "columns": [ + "region" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country": { + "name": "country", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "world_region_id": { + "name": "world_region_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "alpha_2": { + "name": "alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "alpha_3": { + "name": "alpha_3", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "population": { + "name": "population", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "alpha_2_idx": { + "name": "alpha_2_idx", + "columns": [ + "alpha_2" + ], + "isUnique": true + } + }, + "foreignKeys": { + "country_world_region_id_world_region_id_fk": { + "name": "country_world_region_id_world_region_id_fk", + "tableFrom": "country", + "columnsFrom": [ + "world_region_id" + ], + "tableTo": "world_region", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country_to_language": { + "name": "country_to_language", + "schema": "", + "columns": { + "language_ietf_code": { + "name": "language_ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "country_alpha_2": { + "name": "country_alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "country_to_language_language_ietf_code_language_ietf_code_fk": { + "name": "country_to_language_language_ietf_code_language_ietf_code_fk", + "tableFrom": "country_to_language", + "columnsFrom": [ + "language_ietf_code" + ], + "tableTo": "language", + "columnsTo": [ + "ietf_code" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + }, + "country_to_language_country_alpha_2_country_alpha_2_fk": { + "name": "country_to_language_country_alpha_2_country_alpha_2_fk", + "tableFrom": "country_to_language", + "columnsFrom": [ + "country_alpha_2" + ], + "tableTo": "country", + "columnsTo": [ + "alpha_2" + ], + "onUpdate": "cascade", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": { + "country_to_language_pkey": { + "name": "country_to_language_pkey", + "columns": [ + "language_ietf_code", + "country_alpha_2" + ] + } + }, + "uniqueConstraints": {} + } + }, + "enums": { + "direction": { + "name": "direction", + "values": { + "ltr": "ltr", + "rtl": "rtl" + } + }, + "type_id": { + "name": "type_id", + "values": { + "text": "text", + "audio": "audio", + "video": "video", + "braille": "braille" + } + }, + "domain": { + "name": "domain", + "values": { + "scripture": "scripture", + "gloss": "gloss", + "parascriptural": "parascriptural", + "peripheral": "peripheral" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/controller/drizzle/meta/0019_snapshot.json b/controller/drizzle/meta/0019_snapshot.json new file mode 100644 index 0000000..b2bdfc7 --- /dev/null +++ b/controller/drizzle/meta/0019_snapshot.json @@ -0,0 +1,943 @@ +{ + "id": "f802afa7-d666-4364-8af4-987a6c567fed", + "prevId": "28546805-6ca1-4ff5-8ad3-566c02476f4d", + "version": "5", + "dialect": "pg", + "tables": { + "language": { + "name": "language", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "national_name": { + "name": "national_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "english_name": { + "name": "english_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "direction": { + "name": "direction", + "type": "direction", + "primaryKey": false, + "notNull": true + }, + "iso6393": { + "name": "iso6393", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp(0)", + "primaryKey": false, + "notNull": false + }, + "is_oral_language": { + "name": "is_oral_language", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "home_country_alpha2": { + "name": "home_country_alpha2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "ietf_idx": { + "name": "ietf_idx", + "columns": [ + "ietf_code" + ], + "isUnique": true + }, + "id_idx": { + "name": "id_idx", + "columns": [ + "id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_home_country_alpha2_country_alpha_2_fk": { + "name": "language_home_country_alpha2_country_alpha_2_fk", + "tableFrom": "language", + "tableTo": "country", + "columnsFrom": [ + "home_country_alpha2" + ], + "columnsTo": [ + "alpha_2" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_language_meta": { + "name": "wa_language_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "is_gateway": { + "name": "is_gateway", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "wa_language_meta_ietf_code_language_ietf_code_fk": { + "name": "wa_language_meta_ietf_code_language_ietf_code_fk", + "tableFrom": "wa_language_meta", + "tableTo": "language", + "columnsFrom": [ + "ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "language_alternate_name": { + "name": "language_alternate_name", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "name_ietf_idx": { + "name": "name_ietf_idx", + "columns": [ + "name", + "ietf_code" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_alternate_name_ietf_code_language_ietf_code_fk": { + "name": "language_alternate_name_ietf_code_language_ietf_code_fk", + "tableFrom": "language_alternate_name", + "tableTo": "language", + "columnsFrom": [ + "ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gateway_language_to_dependent_language": { + "name": "gateway_language_to_dependent_language", + "schema": "", + "columns": { + "gateway_language_ietf": { + "name": "gateway_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "dependent_language_ietf": { + "name": "dependent_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "tableTo": "language", + "columnsFrom": [ + "gateway_language_ietf" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "tableTo": "language", + "columnsFrom": [ + "dependent_language_ietf" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "gateway_dependent_pkey": { + "name": "gateway_dependent_pkey", + "columns": [ + "gateway_language_ietf", + "dependent_language_ietf" + ] + } + }, + "uniqueConstraints": {} + }, + "content": { + "name": "content", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(256)", + "primaryKey": true, + "notNull": true + }, + "language_id": { + "name": "language_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "type_id", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "domain", + "primaryKey": false, + "notNull": false + }, + "resource_type": { + "name": "resource_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "git_id": { + "name": "git_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "level": { + "name": "level", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "content_language_id_language_ietf_code_fk": { + "name": "content_language_id_language_ietf_code_fk", + "tableFrom": "content", + "tableTo": "language", + "columnsFrom": [ + "language_id" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_content_meta": { + "name": "wa_content_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "content_idx": { + "name": "content_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "wa_content_meta_content_id_content_id_fk": { + "name": "wa_content_meta_content_id_content_id_fk", + "tableFrom": "wa_content_meta", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "connected_content": { + "name": "connected_content", + "schema": "", + "columns": { + "content_id_1": { + "name": "content_id_1", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "content_id_2": { + "name": "content_id_2", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "connected_content_content_id_1_content_id_fk": { + "name": "connected_content_content_id_1_content_id_fk", + "tableFrom": "connected_content", + "tableTo": "content", + "columnsFrom": [ + "content_id_1" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "connected_content_content_id_2_content_id_fk": { + "name": "connected_content_content_id_2_content_id_fk", + "tableFrom": "connected_content", + "tableTo": "content", + "columnsFrom": [ + "content_id_2" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "connected_content_pkey": { + "name": "connected_content_pkey", + "columns": [ + "content_id_1", + "content_id_2" + ] + } + }, + "uniqueConstraints": {} + }, + "git_repo": { + "name": "git_repo", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_name": { + "name": "repo_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_url": { + "name": "repo_url", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "username_reponame_idx": { + "name": "username_reponame_idx", + "columns": [ + "username", + "repo_name" + ], + "isUnique": true + }, + "content_id_idx": { + "name": "content_id_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "git_repo_content_id_content_id_fk": { + "name": "git_repo_content_id_content_id_fk", + "tableFrom": "git_repo", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "rendering": { + "name": "rendering", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_type": { + "name": "file_type", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_size_bytes": { + "name": "file_size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "hash": { + "name": "hash", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "rendering_unique_idx": { + "name": "rendering_unique_idx", + "columns": [ + "url" + ], + "isUnique": true + } + }, + "foreignKeys": { + "rendering_content_id_content_id_fk": { + "name": "rendering_content_id_content_id_fk", + "tableFrom": "rendering", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "scriptural_rendering_metadata": { + "name": "scriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "book_slug": { + "name": "book_slug", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true + }, + "book_name": { + "name": "book_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "chapter": { + "name": "chapter", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_whole_book": { + "name": "is_whole_book", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "is_whole_project": { + "name": "is_whole_project", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "sort": { + "name": "sort", + "type": "smallint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "scriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "scriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "scriptural_rendering_metadata", + "tableTo": "rendering", + "columnsFrom": [ + "rendering_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "nonscriptural_rendering_metadata": { + "name": "nonscriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "additional_data": { + "name": "additional_data", + "type": "json", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "nonscriptural_rendering_metadata", + "tableTo": "rendering", + "columnsFrom": [ + "rendering_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "world_region": { + "name": "world_region", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "region_name_idx": { + "name": "region_name_idx", + "columns": [ + "region" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country": { + "name": "country", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "world_region_id": { + "name": "world_region_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "alpha_2": { + "name": "alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "alpha_3": { + "name": "alpha_3", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "population": { + "name": "population", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "alpha_2_idx": { + "name": "alpha_2_idx", + "columns": [ + "alpha_2" + ], + "isUnique": true + } + }, + "foreignKeys": { + "country_world_region_id_world_region_id_fk": { + "name": "country_world_region_id_world_region_id_fk", + "tableFrom": "country", + "tableTo": "world_region", + "columnsFrom": [ + "world_region_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country_to_language": { + "name": "country_to_language", + "schema": "", + "columns": { + "language_ietf_code": { + "name": "language_ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "country_alpha_2": { + "name": "country_alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "country_to_language_language_ietf_code_language_ietf_code_fk": { + "name": "country_to_language_language_ietf_code_language_ietf_code_fk", + "tableFrom": "country_to_language", + "tableTo": "language", + "columnsFrom": [ + "language_ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "country_to_language_country_alpha_2_country_alpha_2_fk": { + "name": "country_to_language_country_alpha_2_country_alpha_2_fk", + "tableFrom": "country_to_language", + "tableTo": "country", + "columnsFrom": [ + "country_alpha_2" + ], + "columnsTo": [ + "alpha_2" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "country_to_language_pkey": { + "name": "country_to_language_pkey", + "columns": [ + "language_ietf_code", + "country_alpha_2" + ] + } + }, + "uniqueConstraints": {} + } + }, + "enums": { + "direction": { + "name": "direction", + "values": { + "ltr": "ltr", + "rtl": "rtl" + } + }, + "type_id": { + "name": "type_id", + "values": { + "text": "text", + "audio": "audio", + "video": "video", + "braille": "braille" + } + }, + "domain": { + "name": "domain", + "values": { + "scripture": "scripture", + "gloss": "gloss", + "parascriptural": "parascriptural", + "peripheral": "peripheral" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/controller/drizzle/meta/0020_snapshot.json b/controller/drizzle/meta/0020_snapshot.json new file mode 100644 index 0000000..a1265f4 --- /dev/null +++ b/controller/drizzle/meta/0020_snapshot.json @@ -0,0 +1,943 @@ +{ + "id": "47a4dec0-8084-44bc-85dd-3faed4a1b877", + "prevId": "f802afa7-d666-4364-8af4-987a6c567fed", + "version": "5", + "dialect": "pg", + "tables": { + "language": { + "name": "language", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "national_name": { + "name": "national_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "english_name": { + "name": "english_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "direction": { + "name": "direction", + "type": "direction", + "primaryKey": false, + "notNull": true + }, + "iso6393": { + "name": "iso6393", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp(0)", + "primaryKey": false, + "notNull": false + }, + "is_oral_language": { + "name": "is_oral_language", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "home_country_alpha2": { + "name": "home_country_alpha2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "ietf_idx": { + "name": "ietf_idx", + "columns": [ + "ietf_code" + ], + "isUnique": true + }, + "id_idx": { + "name": "id_idx", + "columns": [ + "id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_home_country_alpha2_country_alpha_2_fk": { + "name": "language_home_country_alpha2_country_alpha_2_fk", + "tableFrom": "language", + "tableTo": "country", + "columnsFrom": [ + "home_country_alpha2" + ], + "columnsTo": [ + "alpha_2" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_language_meta": { + "name": "wa_language_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "is_gateway": { + "name": "is_gateway", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "wa_language_meta_ietf_code_language_ietf_code_fk": { + "name": "wa_language_meta_ietf_code_language_ietf_code_fk", + "tableFrom": "wa_language_meta", + "tableTo": "language", + "columnsFrom": [ + "ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "language_alternate_name": { + "name": "language_alternate_name", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "name_ietf_idx": { + "name": "name_ietf_idx", + "columns": [ + "name", + "ietf_code" + ], + "isUnique": true + } + }, + "foreignKeys": { + "language_alternate_name_ietf_code_language_ietf_code_fk": { + "name": "language_alternate_name_ietf_code_language_ietf_code_fk", + "tableFrom": "language_alternate_name", + "tableTo": "language", + "columnsFrom": [ + "ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gateway_language_to_dependent_language": { + "name": "gateway_language_to_dependent_language", + "schema": "", + "columns": { + "gateway_language_ietf": { + "name": "gateway_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "dependent_language_ietf": { + "name": "dependent_language_ietf", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_gateway_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "tableTo": "language", + "columnsFrom": [ + "gateway_language_ietf" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk": { + "name": "gateway_language_to_dependent_language_dependent_language_ietf_language_ietf_code_fk", + "tableFrom": "gateway_language_to_dependent_language", + "tableTo": "language", + "columnsFrom": [ + "dependent_language_ietf" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "gateway_dependent_pkey": { + "name": "gateway_dependent_pkey", + "columns": [ + "gateway_language_ietf", + "dependent_language_ietf" + ] + } + }, + "uniqueConstraints": {} + }, + "content": { + "name": "content", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(256)", + "primaryKey": true, + "notNull": true + }, + "language_id": { + "name": "language_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "type_id", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "domain", + "primaryKey": false, + "notNull": false + }, + "resource_type": { + "name": "resource_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "git_id": { + "name": "git_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "level": { + "name": "level", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "content_language_id_language_ietf_code_fk": { + "name": "content_language_id_language_ietf_code_fk", + "tableFrom": "content", + "tableTo": "language", + "columnsFrom": [ + "language_id" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wa_content_meta": { + "name": "wa_content_meta", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "show_on_biel": { + "name": "show_on_biel", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "content_idx": { + "name": "content_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "wa_content_meta_content_id_content_id_fk": { + "name": "wa_content_meta_content_id_content_id_fk", + "tableFrom": "wa_content_meta", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "connected_content": { + "name": "connected_content", + "schema": "", + "columns": { + "content_id_1": { + "name": "content_id_1", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + }, + "content_id_2": { + "name": "content_id_2", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "connected_content_content_id_1_content_id_fk": { + "name": "connected_content_content_id_1_content_id_fk", + "tableFrom": "connected_content", + "tableTo": "content", + "columnsFrom": [ + "content_id_1" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "connected_content_content_id_2_content_id_fk": { + "name": "connected_content_content_id_2_content_id_fk", + "tableFrom": "connected_content", + "tableTo": "content", + "columnsFrom": [ + "content_id_2" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "connected_content_pkey": { + "name": "connected_content_pkey", + "columns": [ + "content_id_1", + "content_id_2" + ] + } + }, + "uniqueConstraints": {} + }, + "git_repo": { + "name": "git_repo", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_name": { + "name": "repo_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "repo_url": { + "name": "repo_url", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "username_reponame_idx": { + "name": "username_reponame_idx", + "columns": [ + "username", + "repo_name" + ], + "isUnique": true + }, + "content_id_idx": { + "name": "content_id_idx", + "columns": [ + "content_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "git_repo_content_id_content_id_fk": { + "name": "git_repo_content_id_content_id_fk", + "tableFrom": "git_repo", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "rendering": { + "name": "rendering", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "content_id": { + "name": "content_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_type": { + "name": "file_type", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "file_size_bytes": { + "name": "file_size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "hash": { + "name": "hash", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "rendering_unique_idx": { + "name": "rendering_unique_idx", + "columns": [ + "url" + ], + "isUnique": true + } + }, + "foreignKeys": { + "rendering_content_id_content_id_fk": { + "name": "rendering_content_id_content_id_fk", + "tableFrom": "rendering", + "tableTo": "content", + "columnsFrom": [ + "content_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "scriptural_rendering_metadata": { + "name": "scriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "book_slug": { + "name": "book_slug", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false + }, + "book_name": { + "name": "book_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "chapter": { + "name": "chapter", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_whole_book": { + "name": "is_whole_book", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "is_whole_project": { + "name": "is_whole_project", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "sort": { + "name": "sort", + "type": "smallint", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "scriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "scriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "scriptural_rendering_metadata", + "tableTo": "rendering", + "columnsFrom": [ + "rendering_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "nonscriptural_rendering_metadata": { + "name": "nonscriptural_rendering_metadata", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "rendering_id": { + "name": "rendering_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": false + }, + "additional_data": { + "name": "additional_data", + "type": "json", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk": { + "name": "nonscriptural_rendering_metadata_rendering_id_rendering_id_fk", + "tableFrom": "nonscriptural_rendering_metadata", + "tableTo": "rendering", + "columnsFrom": [ + "rendering_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "world_region": { + "name": "world_region", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "region_name_idx": { + "name": "region_name_idx", + "columns": [ + "region" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country": { + "name": "country", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "world_region_id": { + "name": "world_region_id", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "created_on": { + "name": "created_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "modified_on": { + "name": "modified_on", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "alpha_2": { + "name": "alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "alpha_3": { + "name": "alpha_3", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "population": { + "name": "population", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "alpha_2_idx": { + "name": "alpha_2_idx", + "columns": [ + "alpha_2" + ], + "isUnique": true + } + }, + "foreignKeys": { + "country_world_region_id_world_region_id_fk": { + "name": "country_world_region_id_world_region_id_fk", + "tableFrom": "country", + "tableTo": "world_region", + "columnsFrom": [ + "world_region_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "country_to_language": { + "name": "country_to_language", + "schema": "", + "columns": { + "language_ietf_code": { + "name": "language_ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "country_alpha_2": { + "name": "country_alpha_2", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "country_to_language_language_ietf_code_language_ietf_code_fk": { + "name": "country_to_language_language_ietf_code_language_ietf_code_fk", + "tableFrom": "country_to_language", + "tableTo": "language", + "columnsFrom": [ + "language_ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "country_to_language_country_alpha_2_country_alpha_2_fk": { + "name": "country_to_language_country_alpha_2_country_alpha_2_fk", + "tableFrom": "country_to_language", + "tableTo": "country", + "columnsFrom": [ + "country_alpha_2" + ], + "columnsTo": [ + "alpha_2" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "country_to_language_pkey": { + "name": "country_to_language_pkey", + "columns": [ + "language_ietf_code", + "country_alpha_2" + ] + } + }, + "uniqueConstraints": {} + } + }, + "enums": { + "direction": { + "name": "direction", + "values": { + "ltr": "ltr", + "rtl": "rtl" + } + }, + "type_id": { + "name": "type_id", + "values": { + "text": "text", + "audio": "audio", + "video": "video", + "braille": "braille" + } + }, + "domain": { + "name": "domain", + "values": { + "scripture": "scripture", + "gloss": "gloss", + "parascriptural": "parascriptural", + "peripheral": "peripheral" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/controller/drizzle/meta/_journal.json b/controller/drizzle/meta/_journal.json index 1728fae..20781fe 100644 --- a/controller/drizzle/meta/_journal.json +++ b/controller/drizzle/meta/_journal.json @@ -106,6 +106,48 @@ "when": 1703022066549, "tag": "0014_elite_mathemanic", "breakpoints": true + }, + { + "idx": 15, + "version": "5", + "when": 1709575895094, + "tag": "0015_outgoing_the_anarchist", + "breakpoints": true + }, + { + "idx": 16, + "version": "5", + "when": 1709673533337, + "tag": "0016_sudden_jocasta", + "breakpoints": true + }, + { + "idx": 17, + "version": "5", + "when": 1709676368514, + "tag": "0017_fat_loa", + "breakpoints": true + }, + { + "idx": 18, + "version": "5", + "when": 1709676390436, + "tag": "0018_dry_professor_monster", + "breakpoints": true + }, + { + "idx": 19, + "version": "5", + "when": 1709679360817, + "tag": "0019_square_jubilee", + "breakpoints": true + }, + { + "idx": 20, + "version": "5", + "when": 1709679629988, + "tag": "0020_right_mojo", + "breakpoints": true } ] } \ No newline at end of file diff --git a/controller/package.json b/controller/package.json index 2ec796f..33c6709 100644 --- a/controller/package.json +++ b/controller/package.json @@ -17,25 +17,25 @@ "migrate": "pnpm exec ts-node ./src/migrate.ts" }, "dependencies": { - "@asteasolutions/zod-to-openapi": "^6.3.1", - "@azure/functions": "^4.1.0", + "@asteasolutions/zod-to-openapi": "^6.4.0", + "@azure/functions": "^4.3.0", "api-spec-converter": "^2.12.0", - "dotenv": "^16.3.1", + "dotenv": "^16.4.5", + "drizzle-orm": "^0.29.4", "drizzle-zod": "^0.5.1", "postgres": "^3.4.3", - "yaml": "^2.3.4", + "yaml": "^2.4.0", "zod": "^3.22.4" }, "devDependencies": { "@anatine/zod-mock": "^3.13.3", - "@faker-js/faker": "^8.3.1", - "@types/node": "^20.10.6", - "drizzle-kit": "^0.20.9", - "drizzle-orm": "^0.29.3", + "@faker-js/faker": "^8.4.1", + "@types/node": "^20.11.24", + "drizzle-kit": "^0.20.14", "pg": "^8.11.3", "rimraf": "^5.0.5", "ts-node": "^10.9.2", - "type-fest": "^4.9.0", + "type-fest": "^4.10.3", "typescript": "^5.3.3" }, "main": "dist/src/functions/*.js", diff --git a/controller/pnpm-lock.yaml b/controller/pnpm-lock.yaml index e768d0e..713f94c 100644 --- a/controller/pnpm-lock.yaml +++ b/controller/pnpm-lock.yaml @@ -6,26 +6,29 @@ settings: dependencies: '@asteasolutions/zod-to-openapi': - specifier: ^6.3.1 - version: 6.3.1(zod@3.22.4) + specifier: ^6.4.0 + version: 6.4.0(zod@3.22.4) '@azure/functions': - specifier: ^4.1.0 - version: 4.1.0 + specifier: ^4.3.0 + version: 4.3.0 api-spec-converter: specifier: ^2.12.0 version: 2.12.0 dotenv: - specifier: ^16.3.1 - version: 16.3.1 + specifier: ^16.4.5 + version: 16.4.5 + drizzle-orm: + specifier: ^0.29.4 + version: 0.29.4(pg@8.11.3)(postgres@3.4.3) drizzle-zod: specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) + version: 0.5.1(drizzle-orm@0.29.4)(zod@3.22.4) postgres: specifier: ^3.4.3 version: 3.4.3 yaml: - specifier: ^2.3.4 - version: 2.3.4 + specifier: ^2.4.0 + version: 2.4.0 zod: specifier: ^3.22.4 version: 3.22.4 @@ -33,19 +36,16 @@ dependencies: devDependencies: '@anatine/zod-mock': specifier: ^3.13.3 - version: 3.13.3(@faker-js/faker@8.3.1)(zod@3.22.4) + version: 3.13.3(@faker-js/faker@8.4.1)(zod@3.22.4) '@faker-js/faker': - specifier: ^8.3.1 - version: 8.3.1 + specifier: ^8.4.1 + version: 8.4.1 '@types/node': - specifier: ^20.10.6 - version: 20.10.6 + specifier: ^20.11.24 + version: 20.11.24 drizzle-kit: - specifier: ^0.20.9 - version: 0.20.9 - drizzle-orm: - specifier: ^0.29.3 - version: 0.29.3(pg@8.11.3)(postgres@3.4.3) + specifier: ^0.20.14 + version: 0.20.14 pg: specifier: ^8.11.3 version: 8.11.3 @@ -54,42 +54,43 @@ devDependencies: version: 5.0.5 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.10.6)(typescript@5.3.3) + version: 10.9.2(@types/node@20.11.24)(typescript@5.3.3) type-fest: - specifier: ^4.9.0 - version: 4.9.0 + specifier: ^4.10.3 + version: 4.10.3 typescript: specifier: ^5.3.3 version: 5.3.3 packages: - /@anatine/zod-mock@3.13.3(@faker-js/faker@8.3.1)(zod@3.22.4): + /@anatine/zod-mock@3.13.3(@faker-js/faker@8.4.1)(zod@3.22.4): resolution: {integrity: sha512-AN+0YEFE7s6BpuALQHhEoVmJmD+0gPnf4Fehc6oE5NHbM3X2ZD5fW5M6vvot29NWUB6nxvj0gu+BPQ9cVnxALw==} peerDependencies: '@faker-js/faker': ^7.0.0 || ^8.0.0 zod: ^3.21.4 dependencies: - '@faker-js/faker': 8.3.1 + '@faker-js/faker': 8.4.1 randexp: 0.5.3 zod: 3.22.4 dev: true - /@asteasolutions/zod-to-openapi@6.3.1(zod@3.22.4): - resolution: {integrity: sha512-1CRWBqslgdBpZeJnxxksGirAQ39Iztxk+LzTkYwoP0mNzuaULa604s8Xc5V9yzmYccwJ89O9fPQgxCkbNN398g==} + /@asteasolutions/zod-to-openapi@6.4.0(zod@3.22.4): + resolution: {integrity: sha512-8cxfF7AHHx2PqnN4Cd8/O8CBu/nVYJP9DpnfVLW3BFb66VJDnqI/CczZnkqMc3SNh6J9GiX7JbJ5T4BSP4HZ2Q==} peerDependencies: zod: ^3.20.2 dependencies: - openapi3-ts: 4.2.1 + openapi3-ts: 4.2.2 zod: 3.22.4 dev: false - /@azure/functions@4.1.0: - resolution: {integrity: sha512-45WDaJZiTmvaIOPSdWWKL5NgzgUWsNzXDNlF7oCMLS43lE602qG7XE6Hdg9ewPWBj55URHRU7UWTHk4uDVqBGg==} + /@azure/functions@4.3.0: + resolution: {integrity: sha512-l7iAuSyyBCOgwkDZmV6UUagwkFoqMOVfq01oJ+rJlFhN7Mb8/kkUAZLffCPUxBy2Wwah741BhJGizwaCP9G2/A==} engines: {node: '>=18.0'} dependencies: + cookie: 0.6.0 long: 4.0.0 - undici: 5.28.2 + undici: 5.28.3 dev: false /@cloudflare/json-schema-walker@0.1.1: @@ -105,8 +106,8 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@drizzle-team/studio@0.0.37: - resolution: {integrity: sha512-LZyAPGJBX43jsrVZh7+w1Jig/BC6PJx63ReHUYK+GRQYNY9UJNlPXmn1uC/LMRX+A7JwYM4Sr4Fg/hnJSqlfgA==} + /@drizzle-team/studio@0.0.39: + resolution: {integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==} dependencies: superjson: 2.2.1 dev: true @@ -125,8 +126,8 @@ packages: get-tsconfig: 4.7.2 dev: true - /@esbuild/aix-ppc64@0.19.11: - resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -143,8 +144,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.11: - resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -161,8 +162,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.11: - resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -179,8 +180,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.11: - resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -197,8 +198,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.11: - resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -215,8 +216,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.11: - resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -233,8 +234,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.11: - resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -251,8 +252,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.11: - resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -269,8 +270,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.11: - resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -287,8 +288,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.11: - resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -305,8 +306,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.11: - resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -323,8 +324,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.11: - resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -341,8 +342,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.11: - resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -359,8 +360,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.11: - resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -377,8 +378,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.11: - resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -395,8 +396,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.11: - resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -413,8 +414,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.11: - resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -431,8 +432,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.11: - resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -449,8 +450,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.11: - resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -467,8 +468,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.11: - resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -485,8 +486,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.11: - resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -503,8 +504,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.11: - resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -521,8 +522,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.11: - resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -530,13 +531,13 @@ packages: dev: true optional: true - /@faker-js/faker@8.3.1: - resolution: {integrity: sha512-FdgpFxY6V6rLZE9mmIBb9hM0xpfvQOSNOLnzolzKwsE1DH+gC7lEKV1p1IbR0lAYyvYd5a4u3qWJzowUkw1bIw==} + /@faker-js/faker@8.4.1: + resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} dev: true - /@fastify/busboy@2.1.0: - resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} dev: false @@ -552,8 +553,8 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: true - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} dev: true @@ -564,7 +565,7 @@ packages: /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 dev: true @@ -595,12 +596,12 @@ packages: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} requiresBuild: true dependencies: - '@types/node': 20.10.6 + '@types/node': 20.11.24 dev: false optional: true - /@types/node@20.10.6: - resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} + /@types/node@20.11.24: + resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} dependencies: undici-types: 5.26.5 @@ -608,7 +609,7 @@ packages: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} requiresBuild: true dependencies: - '@types/node': 20.10.6 + '@types/node': 20.11.24 dev: false optional: true @@ -625,8 +626,8 @@ packages: dev: false optional: true - /acorn-walk@8.3.1: - resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} dev: true @@ -815,12 +816,15 @@ packages: resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} engines: {node: '>=4'} - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 + get-intrinsic: 1.2.4 + set-function-length: 1.2.1 dev: false /call-me-maybe@1.0.2: @@ -855,12 +859,12 @@ packages: dev: false optional: true - /cli-color@2.0.3: - resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} + /cli-color@2.0.4: + resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} engines: {node: '>=0.10'} dependencies: - d: 1.0.1 - es5-ext: 0.10.62 + d: 1.0.2 + es5-ext: 0.10.64 es6-iterator: 2.0.3 memoizee: 0.4.15 timers-ext: 0.1.7 @@ -943,6 +947,11 @@ packages: resolution: {integrity: sha512-uKfFK2AO3V4YrzwnWYs0zO6jhfLScr30RoQ6iqG62iWXkp0G5w/Fx8W3y9ax5nwrlKzvTQzk1K6ODvChkwhCFA==} dev: false + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: false + /cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} dev: false @@ -993,11 +1002,12 @@ packages: which: 2.0.2 dev: true - /d@1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + /d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} dependencies: - es5-ext: 0.10.62 - type: 1.2.0 + es5-ext: 0.10.64 + type: 2.7.2 dev: true /dashdash@1.14.1: @@ -1048,13 +1058,13 @@ packages: is-plain-object: 2.0.4 dev: false - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 + es-define-property: 1.0.0 + es-errors: 1.3.0 gopd: 1.0.1 - has-property-descriptors: 1.0.1 dev: false /delayed-stream@1.0.0: @@ -1080,8 +1090,8 @@ packages: heap: 0.2.7 dev: true - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} dev: false @@ -1104,30 +1114,30 @@ packages: wordwrap: 1.0.0 dev: true - /drizzle-kit@0.20.9: - resolution: {integrity: sha512-5oIbPFdfEEfzVSOB3MWGt70VSHv6W7qMAWCJ5xc6W1BxgGASipxuAuyXD59fx9S6QYTNNnuSuQFoIdnNTRWY2A==} + /drizzle-kit@0.20.14: + resolution: {integrity: sha512-0fHv3YIEaUcSVPSGyaaBfOi9bmpajjhbJNdPsRMIUvYdLVxBu9eGjH8mRc3Qk7HVmEidFc/lhG1YyJhoXrn5yA==} hasBin: true dependencies: - '@drizzle-team/studio': 0.0.37 + '@drizzle-team/studio': 0.0.39 '@esbuild-kit/esm-loader': 2.6.5 camelcase: 7.0.1 chalk: 5.3.0 commander: 9.5.0 env-paths: 3.0.0 - esbuild: 0.19.11 - esbuild-register: 3.5.0(esbuild@0.19.11) + esbuild: 0.19.12 + esbuild-register: 3.5.0(esbuild@0.19.12) glob: 8.1.0 hanji: 0.0.5 json-diff: 0.9.0 minimatch: 7.4.6 - semver: 7.5.4 + semver: 7.6.0 zod: 3.22.4 transitivePeerDependencies: - supports-color dev: true - /drizzle-orm@0.29.3(pg@8.11.3)(postgres@3.4.3): - resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} + /drizzle-orm@0.29.4(pg@8.11.3)(postgres@3.4.3): + resolution: {integrity: sha512-ZnSM8TAxFhzH7p1s3+w3pRE/eKaOeNkH9SKitm717pubDVVcV2I0BCDBPGKV+pe02+wMfw37ntlTcCyo2rA3IA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -1199,14 +1209,15 @@ packages: dependencies: pg: 8.11.3 postgres: 3.4.3 + dev: false - /drizzle-zod@0.5.1(drizzle-orm@0.29.3)(zod@3.22.4): + /drizzle-zod@0.5.1(drizzle-orm@0.29.4)(zod@3.22.4): resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} peerDependencies: drizzle-orm: '>=0.23.13' zod: '*' dependencies: - drizzle-orm: 0.29.3(pg@8.11.3)(postgres@3.4.3) + drizzle-orm: 0.29.4(pg@8.11.3)(postgres@3.4.3) zod: 3.22.4 dev: false @@ -1217,7 +1228,7 @@ packages: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 2.3.8 - stream-shift: 1.0.1 + stream-shift: 1.0.3 dev: false optional: true @@ -1275,22 +1286,35 @@ packages: dev: false optional: true - /es5-ext@0.10.62: - resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: false + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: false + + /es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} engines: {node: '>=0.10'} requiresBuild: true dependencies: es6-iterator: 2.0.3 - es6-symbol: 3.1.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 next-tick: 1.1.0 dev: true /es6-iterator@2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-symbol: 3.1.3 + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 dev: true /es6-promise@3.3.1: @@ -1305,29 +1329,30 @@ packages: dev: false optional: true - /es6-symbol@3.1.3: - resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + /es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} dependencies: - d: 1.0.1 + d: 1.0.2 ext: 1.7.0 dev: true /es6-weak-map@2.0.3: resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} dependencies: - d: 1.0.1 - es5-ext: 0.10.62 + d: 1.0.2 + es5-ext: 0.10.64 es6-iterator: 2.0.3 - es6-symbol: 3.1.3 + es6-symbol: 3.1.4 dev: true - /esbuild-register@3.5.0(esbuild@0.19.11): + /esbuild-register@3.5.0(esbuild@0.19.12): resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} peerDependencies: esbuild: '>=0.12 <1' dependencies: debug: 4.3.4 - esbuild: 0.19.11 + esbuild: 0.19.12 transitivePeerDependencies: - supports-color dev: true @@ -1362,35 +1387,35 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: true - /esbuild@0.19.11: - resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.19.11 - '@esbuild/android-arm': 0.19.11 - '@esbuild/android-arm64': 0.19.11 - '@esbuild/android-x64': 0.19.11 - '@esbuild/darwin-arm64': 0.19.11 - '@esbuild/darwin-x64': 0.19.11 - '@esbuild/freebsd-arm64': 0.19.11 - '@esbuild/freebsd-x64': 0.19.11 - '@esbuild/linux-arm': 0.19.11 - '@esbuild/linux-arm64': 0.19.11 - '@esbuild/linux-ia32': 0.19.11 - '@esbuild/linux-loong64': 0.19.11 - '@esbuild/linux-mips64el': 0.19.11 - '@esbuild/linux-ppc64': 0.19.11 - '@esbuild/linux-riscv64': 0.19.11 - '@esbuild/linux-s390x': 0.19.11 - '@esbuild/linux-x64': 0.19.11 - '@esbuild/netbsd-x64': 0.19.11 - '@esbuild/openbsd-x64': 0.19.11 - '@esbuild/sunos-x64': 0.19.11 - '@esbuild/win32-arm64': 0.19.11 - '@esbuild/win32-ia32': 0.19.11 - '@esbuild/win32-x64': 0.19.11 + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 dev: true /escodegen@0.0.21: @@ -1402,7 +1427,7 @@ packages: esprima: 1.0.4 estraverse: 0.0.4 optionalDependencies: - source-map: 0.6.1 + source-map: 0.6.0 dev: false optional: true @@ -1415,7 +1440,7 @@ packages: esprima: 1.0.4 estraverse: 1.3.2 optionalDependencies: - source-map: 0.6.1 + source-map: 0.6.0 dev: false optional: true @@ -1434,6 +1459,16 @@ packages: dev: false optional: true + /esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.2 + dev: true + /esprima@1.0.4: resolution: {integrity: sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==} engines: {node: '>=0.4.0'} @@ -1487,8 +1522,8 @@ packages: /event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} dependencies: - d: 1.0.1 - es5-ext: 0.10.62 + d: 1.0.2 + es5-ext: 0.10.64 dev: true /execa@0.7.0: @@ -1626,13 +1661,15 @@ packages: dev: false optional: true - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: + es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.0 + hasown: 2.0.1 dev: false /get-stream@3.0.0: @@ -1694,7 +1731,7 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 dev: false /got@2.4.0: @@ -1749,14 +1786,14 @@ packages: har-schema: 2.0.0 dev: false - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: - get-intrinsic: 1.2.2 + es-define-property: 1.0.0 dev: false - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} dev: false @@ -1765,8 +1802,8 @@ packages: engines: {node: '>= 0.4'} dev: false - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + /hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -1844,7 +1881,7 @@ packages: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} requiresBuild: true dependencies: - hasown: 2.0.0 + hasown: 2.0.1 dev: false optional: true @@ -1996,7 +2033,7 @@ packages: resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} hasBin: true dependencies: - cli-color: 2.0.3 + cli-color: 2.0.4 difflib: 0.2.4 dreamopt: 0.8.0 dev: true @@ -2025,8 +2062,8 @@ packages: dev: false optional: true - /json-schema-faker@0.5.4: - resolution: {integrity: sha512-DdRRnRNSxkQVXEsUUXzAtvBpsROZHvM59/LQcV6+3gQVMvaeMsqfNKN3ivRwaiahTW7pvxa+LJfOaPP+nhFo4g==} + /json-schema-faker@0.5.6: + resolution: {integrity: sha512-u/cFC26/GDxh2vPiAC8B8xVvpXAW+QYtG2mijEbKrimCk8IHtiwQBjCE8TwvowdhALWq9IcdIWZ+/8ocXvdL3Q==} hasBin: true dependencies: json-schema-ref-parser: 6.1.0 @@ -2199,8 +2236,8 @@ packages: dev: false optional: true - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} dev: true @@ -2222,7 +2259,7 @@ packages: /lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.64 dev: true /make-error@1.3.6: @@ -2241,8 +2278,8 @@ packages: /memoizee@0.4.15: resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} dependencies: - d: 1.0.1 - es5-ext: 0.10.62 + d: 1.0.2 + es5-ext: 0.10.64 es6-weak-map: 2.0.3 event-emitter: 0.3.5 is-promise: 2.2.2 @@ -2424,10 +2461,10 @@ packages: format-util: 1.0.5 dev: false - /openapi3-ts@4.2.1: - resolution: {integrity: sha512-KL1mKwkZii5ce+tb24KCUmQHyWB/oanG5fzUY35UB+wenWJv4Kr/IWBntpn5R8ODiJcxx13ZDophcpHnLGeIOw==} + /openapi3-ts@4.2.2: + resolution: {integrity: sha512-+9g4actZKeb3czfi9gVQ4Br2Ju3KwhCAQJBNaKgye5KggqcBLIhFHH+nIkcm0BUX00TrAJl6dH4JWgM4G4JWrw==} dependencies: - yaml: 2.3.4 + yaml: 2.4.0 dev: false /optionator@0.8.3: @@ -2537,7 +2574,7 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.1.0 + lru-cache: 10.2.0 minipass: 7.0.4 dev: true @@ -2650,6 +2687,7 @@ packages: /postgres@3.4.3: resolution: {integrity: sha512-iHJn4+M9vbTdHSdDzNkC0crHq+1CUdFhx+YqCE+SqWxPjm+Zu63jq7yZborOBF64c8pc58O5uMudyL1FQcHacA==} engines: {node: '>=12'} + dev: false /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} @@ -2697,7 +2735,7 @@ packages: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.4 + side-channel: 1.0.6 dev: false /qs@6.5.3: @@ -2887,8 +2925,8 @@ packages: dev: false optional: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} hasBin: true dependencies: @@ -2900,14 +2938,16 @@ packages: dev: false optional: true - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + /set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 gopd: 1.0.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 dev: false /shebang-command@1.2.0: @@ -2988,11 +3028,13 @@ packages: dev: false optional: true - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 object-inspect: 1.13.1 dev: false @@ -3037,12 +3079,12 @@ packages: requiresBuild: true dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 + spdx-license-ids: 3.0.17 dev: false optional: true - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} requiresBuild: true dev: false optional: true @@ -3051,13 +3093,13 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} requiresBuild: true dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 dev: false optional: true - /spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} requiresBuild: true dev: false optional: true @@ -3109,8 +3151,8 @@ packages: dev: false optional: true - /stream-shift@1.0.1: - resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + /stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} requiresBuild: true dev: false optional: true @@ -3229,7 +3271,7 @@ packages: mime: 2.6.0 qs: 6.11.2 readable-stream: 3.6.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: false @@ -3291,7 +3333,7 @@ packages: js-base64: 2.6.4 js-yaml: 3.14.1 json-refs: 3.0.15 - json-schema-faker: 0.5.4 + json-schema-faker: 0.5.6 lodash: 4.17.21 native-promise-only: 0.8.1 path-to-regexp: 1.8.0 @@ -3312,7 +3354,7 @@ packages: /timers-ext@0.1.7: resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.64 next-tick: 1.1.0 dev: true @@ -3329,7 +3371,7 @@ packages: engines: {node: '>= 0.4'} dev: false - /ts-node@10.9.2(@types/node@20.10.6)(typescript@5.3.3): + /ts-node@10.9.2(@types/node@20.11.24)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -3348,9 +3390,9 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.10.6 + '@types/node': 20.11.24 acorn: 8.11.3 - acorn-walk: 8.3.1 + acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -3379,8 +3421,8 @@ packages: dev: false optional: true - /type-fest@4.9.0: - resolution: {integrity: sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==} + /type-fest@4.10.3: + resolution: {integrity: sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==} engines: {node: '>=16'} dev: true @@ -3391,10 +3433,6 @@ packages: dev: false optional: true - /type@1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - dev: true - /type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} dev: true @@ -3426,11 +3464,11 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - /undici@5.28.2: - resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} + /undici@5.28.3: + resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} engines: {node: '>=14.0'} dependencies: - '@fastify/busboy': 2.1.0 + '@fastify/busboy': 2.1.1 dev: false /uri-js@4.4.1: @@ -3583,9 +3621,10 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + /yaml@2.4.0: + resolution: {integrity: sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==} engines: {node: '>= 14'} + hasBin: true dev: false /yargs-parser@7.0.0: diff --git a/controller/src/db/handlers/index.ts b/controller/src/db/handlers/index.ts index 5d753b2..64d99f6 100644 --- a/controller/src/db/handlers/index.ts +++ b/controller/src/db/handlers/index.ts @@ -24,7 +24,7 @@ export async function polymorphicInsert({ onConflictDoNothingArgs, }: polymorphicInsertArgs): Promise[] | handlerReturnError> { const handle = transactionHandle ? transactionHandle : db; - // db will thorw if this isn't the proper content, but all the api routes have zod validations in them at their call sites + // db will thorw if this isn't the proper content, but all the api routes have zod validations in them at their call sites. So this is just an extra layer of protection on data integrity for getting an array; const validator = z.array(z.unknown()); const dbTable = validations.insertSchemas[tableKey].table; try { diff --git a/controller/src/db/schema/schema.ts b/controller/src/db/schema/schema.ts index 7d30245..827f784 100644 --- a/controller/src/db/schema/schema.ts +++ b/controller/src/db/schema/schema.ts @@ -57,6 +57,7 @@ export const waLangMetadata = pgTable("wa_language_meta", { onUpdate: "cascade", }) .notNull(), + isGateway: boolean("is_gateway").notNull(), showOnBiel: boolean("show_on_biel").notNull(), }); @@ -84,7 +85,7 @@ export const languageAlternateName = pgTable( ); //@=============== LANG TO LANG PIVOT ============= export const languagesToLanguages = pgTable( - "languages_to_languages", + "gateway_language_to_dependent_language", { gatewayLanguageId: varchar("gateway_language_ietf") .references(() => language.ietfCode, { @@ -92,7 +93,7 @@ export const languagesToLanguages = pgTable( onUpdate: "cascade", }) .notNull(), - gatewayLanguageToId: varchar("gateway_language_to_ietf") + gatewayLanguageToId: varchar("dependent_language_ietf") .references(() => language.ietfCode, { onDelete: "cascade", onUpdate: "cascade", @@ -101,10 +102,10 @@ export const languagesToLanguages = pgTable( }, (table) => { return { - primaryKey: primaryKey( - table.gatewayLanguageId, - table.gatewayLanguageToId - ), + primaryKey: primaryKey({ + columns: [table.gatewayLanguageId, table.gatewayLanguageToId], + name: "gateway_dependent_pkey", + }), }; } ); @@ -168,7 +169,10 @@ export const connectedContent = pgTable( .notNull(), }, (table) => ({ - primaryKey: primaryKey(table.contentId1, table.contentId2), + primaryKey: primaryKey({ + columns: [table.contentId1, table.contentId2], + name: "connected_content_pkey", + }), }) ); //@=============== GIT REPO ============= @@ -208,7 +212,7 @@ export const rendering = pgTable( fileType: varchar("file_type").notNull(), fileSizeBytes: bigint("file_size_bytes", {mode: "number"}), url: text("url").notNull(), - doesCoverAllContent: boolean("does_cover_all_content").notNull(), + hash: varchar("hash"), createdAt: timestamp("created_at", {mode: "string"}), modifiedOn: timestamp("modified_on", {mode: "string"}).defaultNow(), }, @@ -229,9 +233,11 @@ export const scripturalRenderingMetadata = pgTable( onUpdate: "cascade", }) .notNull(), - bookSlug: varchar("book_slug", {length: 64}).notNull(), //zod stores these as exclusively uppercase - bookName: varchar("book_name").notNull(), - chapter: integer("chapter").notNull(), //-1 = all chapters. + bookSlug: varchar("book_slug", {length: 64}), //zod stores these as exclusively uppercase + bookName: varchar("book_name"), + chapter: integer("chapter"), + isWholeBook: boolean("is_whole_book").notNull(), + isWholeProject: boolean("is_whole_project").notNull(), sort: smallint("sort"), } ); @@ -304,7 +310,10 @@ export const countryToLanguage = pgTable( }, (table) => { return { - primaryKey: primaryKey(table.languageIetf, table.countryAlpha), + primaryKey: primaryKey({ + columns: [table.languageIetf, table.countryAlpha], + name: "country_to_language_pkey", + }), }; } ); diff --git a/controller/src/db/utils/getMocks.ts b/controller/src/db/utils/getMocks.ts index 5081d4c..fb2345f 100644 --- a/controller/src/db/utils/getMocks.ts +++ b/controller/src/db/utils/getMocks.ts @@ -64,6 +64,7 @@ export function getMockedLang() { }), isOralLanguage: faker.datatype.boolean(), waLangMeta: { + isGateway: faker.datatype.boolean(), showOnBiel: faker.datatype.boolean(), }, }; @@ -190,11 +191,12 @@ export function getMockedRendering( type: "scripture" | "nonscripture" = "scripture" ) { type apiKeys = z.infer; + const randomUUid = crypto.randomUUID(); const mockedRender: apiKeys = { + tempId: randomUUid, contentId: "user-repo", namespace: "wacs", - doesCoverAllContent: faker.datatype.boolean(), fileType: faker.helpers.arrayElement([ "html", "pdf", @@ -204,6 +206,9 @@ export function getMockedRendering( "mp4", ]), scripturalMeta: { + tempId: randomUUid, + isWholeBook: faker.datatype.boolean(), + isWholeProject: faker.datatype.boolean(), bookName: "1 Jean", bookSlug: "1JN", chapter: faker.number.int({max: 5}), @@ -216,12 +221,16 @@ export function getMockedRendering( }; if (type == "scripture") { mockedRender.scripturalMeta = { + tempId: randomUUid, + isWholeBook: faker.datatype.boolean(), + isWholeProject: faker.datatype.boolean(), bookName: "1 Jean", bookSlug: "1JN", chapter: faker.number.int({max: 5}), }; } else { mockedRender.nonScripturalMeta = { + tempId: randomUUid, name: "nonScripturalName", additionalData: "A json field", }; diff --git a/controller/src/functions/bus.ts b/controller/src/functions/git-bus.ts similarity index 100% rename from controller/src/functions/bus.ts rename to controller/src/functions/git-bus.ts diff --git a/controller/src/functions/renderings-bus.ts b/controller/src/functions/renderings-bus.ts new file mode 100644 index 0000000..4296904 --- /dev/null +++ b/controller/src/functions/renderings-bus.ts @@ -0,0 +1,130 @@ +import {app, InvocationContext} from "@azure/functions"; +import {getDb as startDb} from "../db/config"; +import {z} from "zod"; +import { + handlePost as handleRenderingPost, + handleDel, +} from "../routes/rendering"; +import * as validators from "../routes/validation"; + +const db = startDb(); + +const renderedFileSchema = z.object({ + Path: z.string(), + Size: z.number(), + FileType: z.string(), + Hash: z.string(), + Chapter: z.number().nullable(), + Book: z.string().nullable(), + Slug: z.string().nullable(), +}); + +const titlesSchema = z.record(z.string()); + +const renderingsSchema = z.object({ + Successful: z.boolean(), + Message: z.string().nullable(), + User: z.string(), + Repo: z.string(), + RepoUrl: z.string().nullable(), + LanguageCode: z.string().nullable(), + LanguageName: z.string().nullable(), + ResourceType: z.string(), + RenderedAt: z.string(), + RepoId: z.number(), + RenderedFiles: z.array(renderedFileSchema), + Titles: titlesSchema, +}); + +export async function wacsSbRenderingsApi( + message: unknown, + context: InvocationContext +) { + // If zod or the db action below throws here, the message will end up in the dead letter queue. + try { + const parsed = renderingsSchema.parse(message); + context.log( + `received a message for ${parsed.User} for ${parsed.Repo} for ${parsed.ResourceType} type` + ); + + // Delete all renderings connected to this repo/project/content row: When we transact this delete, it should cascade to meta tables as long as cascade is set in schema. + const deletePayload: z.infer = { + contentIds: [{namespace: "wacs", id: `${parsed.User}/${parsed.Repo}`}], + }; + + const dbPayload: z.infer = + parsed.RenderedFiles.map((payload) => { + const randomUUid = crypto.randomUUID(); + let baseLoad: z.infer = { + tempId: randomUUid, + namespace: "wacs", + contentId: `${parsed.User}/${parsed.Repo}`, + fileType: payload.FileType, + url: payload.Path, + fileSizeBytes: payload.Size || 0, + hash: payload.Hash, + }; + if ( + ["bible", "tn", "tq", "bc"].includes( + parsed.ResourceType.toLowerCase() + ) + ) { + const bookName = parsed.Titles[payload.Book || ""]; + const isWholeBook = !payload.Chapter && !!payload.Book; + let isWholeProject = + !payload.Chapter && + !payload.Book && + ["download", "index", "whole"].includes(payload.Path); + + baseLoad.scripturalMeta = { + tempId: randomUUid, + bookName: bookName, + chapter: payload.Chapter, + isWholeBook, + isWholeProject, + }; + payload.Book && (baseLoad.scripturalMeta.bookSlug = payload.Book); + bookName && (baseLoad.scripturalMeta.bookName = bookName); + } else { + baseLoad.nonScripturalMeta = { + tempId: randomUUid, + name: payload.Slug, + }; + // noop for now. + // but baseLoad.nonScripturalMeta would go here + } + return baseLoad; + }); + // todo: becuase these are rendered over and over, we want to delete everything from the renderings and renderings meta tables for the given content id, and new meta (since blobs are replaced and not versioned out). Then we can post to the renderings and meta tables + + await db.transaction(async (tx) => { + // Clear out all renderings and meta (cascade) for this wacs repo first since the pipeline recreates all blobs on a path on render. + const delResult = await handleDel(deletePayload); + if (delResult.status != 200) { + tx.rollback(); + if (delResult.jsonBody) { + throw new Error(delResult.jsonBody.message || "failed to delete"); + } + } else { + // Insert new renderings and meta + const postResult = await handleRenderingPost(dbPayload); + if (postResult.status != 200) { + tx.rollback(); + if (postResult.jsonBody) { + throw new Error(postResult.jsonBody.message || "failed to delete"); + } + } + } + }); + } catch (error) { + context.error(error); + } +} + +console.log("booting up the renderings bus listener"); +app.serviceBusTopic("waLangApiRenderings", { + connection: "BUS_CONN", + topicName: "reporendered", + subscriptionName: "reporendered-languageapi", + handler: wacsSbRenderingsApi, +}); diff --git a/controller/src/routes/content.ts b/controller/src/routes/content.ts index 2f19782..961485e 100644 --- a/controller/src/routes/content.ts +++ b/controller/src/routes/content.ts @@ -94,7 +94,7 @@ async function handlePost({ const {namespace, ...contentPayload} = payload; return { ...contentPayload, - id: `${namespace.toLowerCase()}-${contentPayload.id}`, + id: `${namespace}-${contentPayload.id}`.toLowerCase(), }; }); type accType = { diff --git a/controller/src/routes/language.ts b/controller/src/routes/language.ts index 5aae09f..68cf828 100644 --- a/controller/src/routes/language.ts +++ b/controller/src/routes/language.ts @@ -294,6 +294,7 @@ function parseLangPayload(langPost: z.infer) { if (waLangMeta) { acc.waLangMeta.push({ ietfCode: langPayload.ietfCode, + isGateway: waLangMeta.isGateway, showOnBiel: waLangMeta.showOnBiel, }); } diff --git a/controller/src/routes/rendering.ts b/controller/src/routes/rendering.ts index d2e3fd3..0c4fa99 100644 --- a/controller/src/routes/rendering.ts +++ b/controller/src/routes/rendering.ts @@ -56,9 +56,9 @@ async function handle( try { switch (request.method) { case "POST": - return handlePost({request, table}); + return handlePostRequest({request, table}); case "DELETE": - return handleDel({request, table}); + return handleDelRequest({request, table}); case "GET": return handleGet({request, table}); default: @@ -79,21 +79,25 @@ async function handle( }); } } -async function handlePost({ +async function handlePostRequest({ request, }: apiRouteHandlerArgs): Promise { + const payload = await request.json(); + const result = await handlePost(payload); + return result; +} +export async function handlePost(payload: unknown): Promise { const thisMethod = "post"; let addlErrs: genericErrShape[] = []; let status = 200; try { - const payload = await request.json(); const validationSchema = validators.renderingsPost; const payloadParsed = validationSchema.parse(payload); const payloadsWithNamespacedId = payloadParsed.map((payload) => { const {namespace, ...renderPayload} = payload; // port making content ids that are like user-repo. It should provide a contentId that matches (e.g. user-repo) and a namesapce (dcs). We prefix it here and make that that its contentId so 'dcs-user-repo'. Another, non-git-system might just use 'ab-en_ulb' for its content id if en_ulb is all it needs as its content identifier. So this is just normalizing and consolidating the namespace plus provided contentId - const contentId = `${namespace.toLowerCase()}-${renderPayload.contentId}`; + const contentId = `${namespace}-${renderPayload.contentId}`.toLowerCase(); if (renderPayload.nonScripturalMeta) { // I'm intentionally adding string of wrong type here. and below for expect error. These will not be inserted. I'm adding this property as a way to ensure that in the transaction, once the renderigns are inserted, I can pluck the ids off the inserts ids and map it back to the metadata via this common obj. property // @ts-expect-error @@ -105,14 +109,18 @@ async function handlePost({ } return { ...renderPayload, - contentId: `${namespace.toLowerCase()}-${renderPayload.contentId}`, + contentId: `${namespace}-${renderPayload.contentId}`.toLowerCase(), }; }); type accType = { - renderPayloads: dbTableValidators.insertRendering[]; - scripturalMetaPayloads: dbTableValidators.insertScripturalRenderingMetadata[]; - nonScripturalMetaPayloads: dbTableValidators.insertNonScripturalRenderingMetadata[]; + renderPayloads: ({tempId: string} & dbTableValidators.insertRendering)[]; + scripturalMetaPayloads: ({ + tempId: string; + } & dbTableValidators.insertScripturalRenderingMetadata)[]; + nonScripturalMetaPayloads: ({ + tempId: string; + } & dbTableValidators.insertNonScripturalRenderingMetadata)[]; }; const reduced = payloadsWithNamespacedId.reduce( @@ -133,7 +141,7 @@ async function handlePost({ const transacted = await db.transaction(async (tx) => { const renderingInserted = await polymorphicInsert({ - tableKey: "rendering", //extra string for type completion instead of tablename + tableKey: "rendering", //extra string for type completion instead of tablename variable above content: reduced.renderPayloads, transactionHandle: tx, onConflictDoUpdateArgs: { @@ -143,21 +151,38 @@ async function handlePost({ }); if (Array.isArray(renderingInserted)) { reduced.scripturalMetaPayloads.forEach((payload) => { - const matching = renderingInserted.find((inserted) => { + const matchingWithTmpId = reduced.renderPayloads.find((inserted) => { // map back from expected error above - return inserted.contentId == String(payload.renderingId); + return inserted.tempId == payload.tempId; }); - if (matching) { - // adjust to number id instead of string - payload.renderingId = matching.id; + + if (matchingWithTmpId) { + const matchingFromInserted = renderingInserted.find((inserted) => { + return ( + inserted.hash == matchingWithTmpId.hash && + inserted.url == matchingWithTmpId.url + ); + }); + if (matchingFromInserted) { + // adjust to number id instead of string + payload.renderingId = matchingFromInserted.id; + } } }); reduced.nonScripturalMetaPayloads.forEach((payload) => { - const matching = renderingInserted.find((inserted) => { - return inserted.contentId == String(payload.renderingId); + const matchingWithTmpId = reduced.renderPayloads.find((inserted) => { + return inserted.tempId == payload.tempId; }); - if (matching) { - payload.renderingId = matching.id; + if (matchingWithTmpId) { + const matchingFromInserted = renderingInserted.find((inserted) => { + return ( + inserted.hash == matchingWithTmpId.hash && + inserted.url == matchingWithTmpId.url + ); + }); + if (matchingFromInserted) { + payload.renderingId = matchingFromInserted.id; + } } }); } @@ -229,17 +254,20 @@ async function handlePost({ } } -async function handleDel({ +async function handleDelRequest({ request, - table, }: apiRouteHandlerArgs): Promise { + const payload = await request.json(); + const result = await handleDel(payload); + return result; +} +export async function handleDel(payload: unknown): Promise { const thisMethod = "delete"; try { - const deletedPayloads = await request.json(); const deleteSchema = validators.renderingDelete; - const deletePayloadsParsed = deleteSchema.parse(deletedPayloads); - const rowsToDeleteByContentId = deletePayloadsParsed.contentIds.map( - (row) => `${row.namespace}-${row.id}` + const deletePayloadsParsed = deleteSchema.parse(payload); + const rowsToDeleteByContentId = deletePayloadsParsed.contentIds.map((row) => + `${row.namespace}-${row.id}`.toLowerCase() ); const deleteOnField = schema.rendering.contentId; diff --git a/controller/src/routes/validation/index.ts b/controller/src/routes/validation/index.ts index bedf64e..48b355a 100644 --- a/controller/src/routes/validation/index.ts +++ b/controller/src/routes/validation/index.ts @@ -8,9 +8,10 @@ export const langPost = z.array( dbValidators.insertLanguageSchema.extend({ allCountryAlpha2: z.array(z.string()).optional(), alternateNames: z.array(z.string()).optional(), - waLangMeta: z - .object({ - showOnBiel: z.boolean(), + waLangMeta: dbValidators.insertWaLangMetaSchema + .omit({ + id: true, + ietfCode: true, }) .optional(), gatewayIetf: z.string().trim().optional(), @@ -82,14 +83,22 @@ export const contentDelete = z.object({ }); /* //@=========== Renderings =========== */ -const contentRenderingWithMeta = dbValidators.insertRenderingSchema.extend({ - fileType: z.string().trim().toLowerCase(), - namespace: z.string().trim().toLowerCase(), - scripturalMeta: - dbValidators.insertScripturalRenderingMetadataSchema.optional(), - nonScripturalMeta: - dbValidators.insertNonScripturalRenderingMetadataSchema.optional(), -}); +export const contentRenderingWithMeta = + dbValidators.insertRenderingSchema.extend({ + tempId: z.string(), + fileType: z.string().trim().toLowerCase(), + namespace: z.string().trim().toLowerCase(), + scripturalMeta: dbValidators.insertScripturalRenderingMetadataSchema + .extend({ + tempId: z.string(), + }) + .optional(), + nonScripturalMeta: dbValidators.insertNonScripturalRenderingMetadataSchema + .extend({ + tempId: z.string(), + }) + .optional(), + }); export const renderingsPost = z.array(contentRenderingWithMeta); export type typeOfContentRenderingWithMeta = z.infer< typeof contentRenderingWithMeta diff --git a/controller/src/utils.ts b/controller/src/utils.ts index 0b4ee8d..85f99d0 100644 --- a/controller/src/utils.ts +++ b/controller/src/utils.ts @@ -214,7 +214,7 @@ export function onConflictSetAllFieldsToSqlExcluded< table[key].name && !omitConflictUpdateKeys.includes(table[key]?.name as UTableCols) ) { - // NOTE: WITHOUT SQL RAW, the string interpolations will be escaped and won't be interpreted properly. In postgres world, excluded refers to the tow that wasn't inserted due to conflicts + // NOTE: WITHOUT SQL RAW, the string interpolations will be escaped and won't be interpreted properly. In postgres world, excluded refers to the row that wasn't inserted due to conflicts const sqlval = sql.raw(`excluded.${table[key]?.name}`); setVal[key] = sqlval; } diff --git a/docker-compose.yml b/docker-compose.yml index 9fc5306..9285b17 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,23 +2,23 @@ version: "3.8" services: - # controller: - # build: - # context: ./controller - # dockerfile: Dockerfile - # environment: - # - AzureWebJobsStorage= - # - DATABASE_URL=postgres://docker:docker@postgres:5432/docker - # - WEBSITE_CONTENTAZUREFILECONNECTIONSTRING= - # - WEBSITE_CONTENTSHARE= - # platform: linux/amd64 - # ports: - # - 8081:80 - # depends_on: - # postgres: - # condition: service_healthy - # db-migrate: - # condition: service_completed_successfully + controller: + build: + context: ./controller + dockerfile: Dockerfile + environment: + - AzureWebJobsStorage= + - DATABASE_URL=postgres://docker:docker@postgres:5432/docker + - WEBSITE_CONTENTAZUREFILECONNECTIONSTRING= + - WEBSITE_CONTENTSHARE= + platform: linux/amd64 + ports: + - 8081:80 + depends_on: + postgres: + condition: service_healthy + db-migrate: + condition: service_completed_successfully db-migrate: build: context: ./controller @@ -26,7 +26,12 @@ services: # IF you want to run the functions in the container and migrate # entrypoint: ["sh", "-c", "pnpm run migrate && pnpm run start"] # IF you only want to migrate so hasura is up to date on migrations done locally - entrypoint: ["pnpm", "run", "migrate"] + entrypoint: + [ + "/bin/sh", + "-c", + "psql postgres://docker:docker@postgres:5432/docker -f data_dump.sql && pnpm run migrate", + ] expose: - 7071 - 3000 @@ -47,7 +52,7 @@ services: - POSTGRES_DB=docker volumes: - pgdata:/var/lib/postgresql/data - - ./data_dump.sql:/docker-entrypoint-initdb.d/data_dump.sql + # - ./data_only.sql:/docker-entrypoint-initdb.d/data_dump.sql expose: - 5432 ports: diff --git a/hasura/metadata/databases/languageapi/tables/public_language.yaml b/hasura/metadata/databases/languageapi/tables/public_language.yaml index 4042478..03395c3 100644 --- a/hasura/metadata/databases/languageapi/tables/public_language.yaml +++ b/hasura/metadata/databases/languageapi/tables/public_language.yaml @@ -5,6 +5,13 @@ object_relationships: - name: country using: foreign_key_constraint_on: home_country_alpha2 + - name: wa_language_meta + using: + foreign_key_constraint_on: + column: ietf_code + table: + name: wa_language_meta + schema: public array_relationships: - name: contents using: @@ -27,26 +34,19 @@ array_relationships: table: name: language_alternate_name schema: public - - name: languagesToLanguagesByGatewayLanguageToIetf + - name: gateway_languages using: foreign_key_constraint_on: - column: gateway_language_to_ietf + column: dependent_language_ietf table: - name: languages_to_languages + name: gateway_language_to_dependent_language schema: public - - name: languages_to_languages + - name: dependent_languages using: foreign_key_constraint_on: column: gateway_language_ietf table: - name: languages_to_languages - schema: public - - name: wa_language_meta - using: - foreign_key_constraint_on: - column: ietf_code - table: - name: wa_language_meta + name: gateway_language_to_dependent_language schema: public select_permissions: - role: anonymous diff --git a/hasura/metadata/databases/languageapi/tables/public_languages_to_languages.yaml b/hasura/metadata/databases/languageapi/tables/public_languages_to_languages.yaml index 507a4e9..33c8f5e 100644 --- a/hasura/metadata/databases/languageapi/tables/public_languages_to_languages.yaml +++ b/hasura/metadata/databases/languageapi/tables/public_languages_to_languages.yaml @@ -1,18 +1,18 @@ table: - name: languages_to_languages + name: gateway_language_to_dependent_language schema: public object_relationships: - - name: language + - name: gateway_language using: foreign_key_constraint_on: gateway_language_ietf - - name: languageByGatewayLanguageToIetf + - name: dependent_language using: - foreign_key_constraint_on: gateway_language_to_ietf + foreign_key_constraint_on: dependent_language_ietf select_permissions: - role: anonymous permission: columns: - gateway_language_ietf - - gateway_language_to_ietf + - dependent_language_ietf filter: {} allow_aggregations: true diff --git a/hasura/metadata/databases/languageapi/tables/public_rendering.yaml b/hasura/metadata/databases/languageapi/tables/public_rendering.yaml index 39bdc72..b50f663 100644 --- a/hasura/metadata/databases/languageapi/tables/public_rendering.yaml +++ b/hasura/metadata/databases/languageapi/tables/public_rendering.yaml @@ -5,7 +5,6 @@ object_relationships: - name: content using: foreign_key_constraint_on: content_id -array_relationships: - name: nonscriptural_rendering_metadata using: foreign_key_constraint_on: @@ -25,7 +24,6 @@ select_permissions: permission: columns: - file_size_bytes - - does_cover_all_content - content_id - file_type - id diff --git a/makefile b/makefile index 18de6ec..f494d93 100644 --- a/makefile +++ b/makefile @@ -4,10 +4,12 @@ console: --admin-secret $(op read "op://AppDev Scripture Accessibility/languageapi-hasura-dev-container-secrets/hasura-graphql-admin-secret") \ --endpoint $(op read "op://AppDev Scripture Accessibility/languageapi-hasura-dev-container-secrets/url") +# -n drizzle schema is for to get the same migrations that have been applied to the dev database applied. .PHONY: datadump datadump: - pg_dump $(op read "op://AppDev Scripture Accessibility/languageapi-dev/connection string") -n public > data_dump.sql + pg_dump $(op read "op://AppDev Scripture Accessibility/languageapi-dev/connection string") -n public -n drizzle --data-only > data_dump.sql +# Note, this will conflict if you're running postgres on own machine on default port too. .PHONY: localdataingest localdataingest: psql postgres://docker:docker@localhost:5432/docker -f data_dump.sql From fe8ab5d25f1f8ead87e1aecb774de208146152e3 Mon Sep 17 00:00:00 2001 From: Will Kelly Date: Wed, 6 Mar 2024 16:16:42 -0600 Subject: [PATCH 2/4] adjust makefile dump back to what it should be --- controller/readme.md | 3 ++- makefile | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/controller/readme.md b/controller/readme.md index 09f24c5..c8479a1 100644 --- a/controller/readme.md +++ b/controller/readme.md @@ -32,4 +32,5 @@ src/migrate - migration script for ci or to run as needed ## Running the project: -- While the azure function can be run inside the container if you just docker compose up, current reccomendation is pnpm i the deps, and then run pnpm run watch in one terminal and pnpm run start in another. Changes are compiled with watch, adn code in dist is update during dev, avoiding having to mount in src code as volume in docker for fast refresh. Running it locally as an azure fxn does require the local.settings.json for the appropriate env vars since they aren't set through the docker container. \ No newline at end of file +- While the azure function can be run inside the container if you just docker compose up, current reccomendation is pnpm i the deps, and then run pnpm run watch in one terminal and pnpm run start in another. Changes are compiled with watch, adn code in dist is update during dev, avoiding having to mount in src code as volume in docker for fast refresh. Running it locally as an azure fxn does require the local.settings.json for the appropriate env vars since they aren't set through the docker container. +- Get a fresh copy of dev db by using the makefile \ No newline at end of file diff --git a/makefile b/makefile index f494d93..d01940a 100644 --- a/makefile +++ b/makefile @@ -7,7 +7,7 @@ console: # -n drizzle schema is for to get the same migrations that have been applied to the dev database applied. .PHONY: datadump datadump: - pg_dump $(op read "op://AppDev Scripture Accessibility/languageapi-dev/connection string") -n public -n drizzle --data-only > data_dump.sql + pg_dump $(op read "op://AppDev Scripture Accessibility/languageapi-dev/connection string") -n public -n drizzle > data_dump.sql # Note, this will conflict if you're running postgres on own machine on default port too. .PHONY: localdataingest From a67b308bc3390957d29125acb3ea58900aeb8d1c Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 20 Mar 2024 17:15:07 -0400 Subject: [PATCH 3/4] make runnable locally, add dev bus string --- .github/workflows/controller-deploy-dev.yml | 1 + docker-compose.yml | 7 ++++--- run-dev.sh | 7 +++++++ 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100755 run-dev.sh diff --git a/.github/workflows/controller-deploy-dev.yml b/.github/workflows/controller-deploy-dev.yml index b3558d5..597d450 100644 --- a/.github/workflows/controller-deploy-dev.yml +++ b/.github/workflows/controller-deploy-dev.yml @@ -34,6 +34,7 @@ jobs: env: OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }} DATABASE_URL: "op://AppDev Scripture Accessibility/languageapi-dev/connection string" + BUS_CONN: "op://AppDev Scripture Accessibility/languageapi-bus-con/dev/conn_string" - name: "Load PNPM" uses: pnpm/action-setup@v2 with: diff --git a/docker-compose.yml b/docker-compose.yml index 9285b17..6f3db64 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,10 +7,9 @@ services: context: ./controller dockerfile: Dockerfile environment: - - AzureWebJobsStorage= + - AzureWebJobsStorage='' - DATABASE_URL=postgres://docker:docker@postgres:5432/docker - - WEBSITE_CONTENTAZUREFILECONNECTIONSTRING= - - WEBSITE_CONTENTSHARE= + - BUS_CONN=${BUS_CONN} platform: linux/amd64 ports: - 8081:80 @@ -35,6 +34,8 @@ services: expose: - 7071 - 3000 + volumes: + - ./data_dump.sql:/home/site/wwwroot/data_dump.sql ports: - 7071:7071 - 3000:3000 diff --git a/run-dev.sh b/run-dev.sh new file mode 100755 index 0000000..9623286 --- /dev/null +++ b/run-dev.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +pg_dump $(op read "op://AppDev Scripture Accessibility/languageapi-dev/connection string") -n public -n drizzle > data_dump.sql + +export BUS_CONN=$(op read "op://AppDev Scripture Accessibility/languageapi-dev/connection string") + +docker compose up -d \ No newline at end of file From 8f7c4f5875c460c0950bf6eed24cd81a1527e48b Mon Sep 17 00:00:00 2001 From: Will Kelly Date: Tue, 26 Mar 2024 14:15:03 -0500 Subject: [PATCH 4/4] adjusted the logic for creating content row if not present while updating renderings table --- controller/host.json | 9 +++- controller/src/functions/git-bus.ts | 28 +++++++++- controller/src/functions/renderings-bus.ts | 61 ++++++++++++++++++++-- controller/src/routes/content.ts | 12 +++-- 4 files changed, 101 insertions(+), 9 deletions(-) diff --git a/controller/host.json b/controller/host.json index 9df9136..751e742 100644 --- a/controller/host.json +++ b/controller/host.json @@ -11,5 +11,12 @@ "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[4.*, 5.0.0)" + }, + "extensions": { + "serviceBus": { + "messageHandlerOptions": { + "maxConcurrentCalls": 10 + } + } } -} \ No newline at end of file +} diff --git a/controller/src/functions/git-bus.ts b/controller/src/functions/git-bus.ts index e528da6..09a15f8 100644 --- a/controller/src/functions/git-bus.ts +++ b/controller/src/functions/git-bus.ts @@ -2,7 +2,9 @@ import {app, InvocationContext} from "@azure/functions"; import {getDb as startDb} from "../db/config"; import {z} from "zod"; import {handlePost as handleGitPost} from "../routes/git"; +import {handlePost as handleContentPost} from "../routes/content"; import * as validators from "../routes/validation"; +import {checkContentExists} from "../functions/renderings-bus"; startDb(); const latestCommitSchema = z.object({ @@ -35,8 +37,32 @@ export async function wacsSbLangApi( context.log(message); const parsed = eventSchema.parse(message); context.log( - `received a message for ${parsed.Repo} of event type ${parsed.EventType}` + `GIT BUS RECEIVED: received a message for ${parsed.Repo} of event type ${parsed.EventType}` ); + const thatContentRowExists = await checkContentExists( + `wac-${parsed.User}/${parsed.Repo}`.toLowerCase() + ); + if (!thatContentRowExists) { + context.log( + `wac-${parsed.User}/${parsed.Repo} is not already in api. Creating new row in table` + ); + const newContentRow: z.infer = [ + { + namespace: "wacs", + id: `${parsed.User}/${parsed.Repo}`.toLowerCase(), + type: "text", + }, + ]; + const newRowRes = await handleContentPost(newContentRow); + if (newRowRes.status !== 200) { + context.log( + `Failed to create new content row for ${`${parsed.User}/${parsed.Repo}`.toLowerCase()}` + ); + throw new Error( + `Failed to create new content row for ${`${parsed.User}/${parsed.Repo}`.toLowerCase()}` + ); + } + } // api built with bulk ops in mind, so arrays are passed, even for single op, versus having insertSingle vs insertMany type routes const shapedForDb: z.infer = [ diff --git a/controller/src/functions/renderings-bus.ts b/controller/src/functions/renderings-bus.ts index 4296904..ad2a58d 100644 --- a/controller/src/functions/renderings-bus.ts +++ b/controller/src/functions/renderings-bus.ts @@ -5,7 +5,10 @@ import { handlePost as handleRenderingPost, handleDel, } from "../routes/rendering"; +import {handlePost as handleContentPost} from "../routes/content"; import * as validators from "../routes/validation"; +import * as schema from "../db/schema/schema"; +import {eq} from "drizzle-orm"; const db = startDb(); @@ -19,7 +22,7 @@ const renderedFileSchema = z.object({ Slug: z.string().nullable(), }); -const titlesSchema = z.record(z.string()); +const titlesSchema = z.record(z.string().nullable()); const renderingsSchema = z.object({ Successful: z.boolean(), @@ -42,14 +45,50 @@ export async function wacsSbRenderingsApi( ) { // If zod or the db action below throws here, the message will end up in the dead letter queue. try { + const successStatus = z.object({Successful: z.boolean()}).parse(message); + const wasSuccessful = !!successStatus.Successful; + if (!wasSuccessful) { + context.warn( + `RENDERINGS BUS RECEIVED: received message from bus that was not a successful render. NOOP. ${JSON.stringify( + message + )}` + // noop at this point. can't do anything. + ); + return; + } const parsed = renderingsSchema.parse(message); + const namespace = "wacs"; + const id = `${parsed.User}/${parsed.Repo}`.toLowerCase(); context.log( - `received a message for ${parsed.User} for ${parsed.Repo} for ${parsed.ResourceType} type` + `RENDERINGS BUS RECEIVED: received a message for ${parsed.User} for ${parsed.Repo} for ${parsed.ResourceType} type` ); + const doesExist = await checkContentExists(`${namespace}-${id}`); + if (!doesExist) { + context.log( + `${namespace}-${id} is not already in api. Creating new row in table` + ); + const newContentRow: z.infer = [ + { + namespace: "wacs", + id: `${parsed.User}/${parsed.Repo}`.toLowerCase(), + type: "text", + }, + ]; + const newRowRes = await handleContentPost(newContentRow); + if (newRowRes.status !== 200) { + context.log( + `Failed to create new content row for ${`${parsed.User}/${parsed.Repo}`.toLowerCase()}` + ); + throw new Error( + `Failed to create new content row for ${`${parsed.User}/${parsed.Repo}`.toLowerCase()}` + ); + } + } + // Delete all renderings connected to this repo/project/content row: When we transact this delete, it should cascade to meta tables as long as cascade is set in schema. const deletePayload: z.infer = { - contentIds: [{namespace: "wacs", id: `${parsed.User}/${parsed.Repo}`}], + contentIds: [{namespace, id}], }; const dbPayload: z.infer = @@ -96,9 +135,9 @@ export async function wacsSbRenderingsApi( return baseLoad; }); // todo: becuase these are rendered over and over, we want to delete everything from the renderings and renderings meta tables for the given content id, and new meta (since blobs are replaced and not versioned out). Then we can post to the renderings and meta tables - await db.transaction(async (tx) => { // Clear out all renderings and meta (cascade) for this wacs repo first since the pipeline recreates all blobs on a path on render. + context.log(`Clearing prev renderings for ${parsed.User}/${parsed.Repo}`); const delResult = await handleDel(deletePayload); if (delResult.status != 200) { tx.rollback(); @@ -107,6 +146,7 @@ export async function wacsSbRenderingsApi( } } else { // Insert new renderings and meta + context.log(`Posting new renderings for ${parsed.User}/${parsed.Repo}`); const postResult = await handleRenderingPost(dbPayload); if (postResult.status != 200) { tx.rollback(); @@ -117,10 +157,23 @@ export async function wacsSbRenderingsApi( } }); } catch (error) { + context.error(`Error processing ${JSON.stringify(message)}`); context.error(error); + if (error instanceof z.ZodError) { + error.issues.forEach((issue) => { + context.error(JSON.stringify(issue)); + }); + } } } +export async function checkContentExists(id: string) { + const doesExist = await db + .select({id: schema.content.id}) + .from(schema.content) + .where(eq(schema.content.id, id)); + return doesExist.length > 0; +} console.log("booting up the renderings bus listener"); app.serviceBusTopic("waLangApiRenderings", { connection: "BUS_CONN", diff --git a/controller/src/routes/content.ts b/controller/src/routes/content.ts index 961485e..dafbe76 100644 --- a/controller/src/routes/content.ts +++ b/controller/src/routes/content.ts @@ -55,7 +55,7 @@ async function handle( try { switch (request.method) { case "POST": - return handlePost({request, table}); + return handlePostRequest({request, table}); case "DELETE": return handleDel({request, table}); case "GET": @@ -79,14 +79,19 @@ async function handle( } } -async function handlePost({ +async function handlePostRequest({ request, }: apiRouteHandlerArgs): Promise { + const payload = await request.json(); + const result = await handlePost(payload); + return result; +} + +export async function handlePost(payload: unknown): Promise { const thisMethod = "post"; let addlErrs: genericErrShape[] = []; let status = 200; try { - const payload = await request.json(); // Parse here cause countries come with additional ietf from port const validationSchema = validators.contentPost; const payloadParsed = validationSchema.parse(payload); @@ -234,6 +239,7 @@ async function handlePost({ }); } } + async function handleDel({ request, table,