From 90cec3e089ca402cb81a6b217f003d35e6a08044 Mon Sep 17 00:00:00 2001 From: Will Kelly Date: Wed, 6 Mar 2024 15:58:16 -0600 Subject: [PATCH 01/73] 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 02/73] 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 03/73] 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 04/73] 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, From 9d38750732dbb8bd0c975919ddf50a40bad040cb Mon Sep 17 00:00:00 2001 From: Will Kelly Date: Tue, 26 Mar 2024 14:31:10 -0500 Subject: [PATCH 05/73] add a view for getting source zips from wacs --- controller/drizzle/0021_first_ink.sql | 18 + controller/drizzle/meta/0021_snapshot.json | 943 +++++++++++++++++++++ controller/drizzle/meta/_journal.json | 7 + 3 files changed, 968 insertions(+) create mode 100644 controller/drizzle/0021_first_ink.sql create mode 100644 controller/drizzle/meta/0021_snapshot.json diff --git a/controller/drizzle/0021_first_ink.sql b/controller/drizzle/0021_first_ink.sql new file mode 100644 index 0000000..4752c4d --- /dev/null +++ b/controller/drizzle/0021_first_ink.sql @@ -0,0 +1,18 @@ +Custom SQL migration file, put you code below! + +CREATE OR REPLACE VIEW source_zips AS +SELECT c.*, CONCAT(g.repo_url, '/archive/master.zip') AS zip_url, COUNT(DISTINCT srm.book_slug) AS unique_book_slugs_count, +m.show_on_biel, m.status AS meta_status, l.national_name, l.english_name + +FROM content c +JOIN rendering r ON r.content_id = c.id +JOIN scriptural_rendering_metadata srm ON srm.rendering_id = r.id +JOIN git_repo g ON g.id = c.git_id +JOIN wa_content_meta m ON m.content_id = c.id +JOIN language l on c.language_id = l.ietf_code +WHERE c.domain = 'scripture' +AND m.show_on_biel = false +AND m.status = 'Active' +AND c.git_id IS NOT NULL +GROUP BY c.id, CONCAT(g.repo_url, '/archive/master.zip'), m.id, l.national_name, l.english_name +HAVING COUNT(DISTINCT srm.book_slug) > 26 \ No newline at end of file diff --git a/controller/drizzle/meta/0021_snapshot.json b/controller/drizzle/meta/0021_snapshot.json new file mode 100644 index 0000000..0aeac11 --- /dev/null +++ b/controller/drizzle/meta/0021_snapshot.json @@ -0,0 +1,943 @@ +{ + "id": "2de8e394-451c-45b3-8c67-b223d60334e9", + "prevId": "47a4dec0-8084-44bc-85dd-3faed4a1b877", + "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 + }, + "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": 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", + "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/_journal.json b/controller/drizzle/meta/_journal.json index 20781fe..c898e44 100644 --- a/controller/drizzle/meta/_journal.json +++ b/controller/drizzle/meta/_journal.json @@ -148,6 +148,13 @@ "when": 1709679629988, "tag": "0020_right_mojo", "breakpoints": true + }, + { + "idx": 21, + "version": "5", + "when": 1711058534781, + "tag": "0021_first_ink", + "breakpoints": true } ] } \ No newline at end of file From afea3a4b1556f3db8b0f4ccadd3d3547a845c8eb Mon Sep 17 00:00:00 2001 From: Will Kelly Date: Wed, 3 Apr 2024 16:52:51 -0500 Subject: [PATCH 06/73] add a localization table and cron trigger --- controller/drizzle/0021_first_ink.sql | 2 - controller/drizzle/0022_stiff_raider.sql | 12 + controller/drizzle/meta/0022_snapshot.json | 993 +++++++++++++++++++++ controller/drizzle/meta/_journal.json | 7 + controller/src/db/schema/schema.ts | 22 + controller/src/db/schema/validations.ts | 14 + controller/src/functions/localization.ts | 154 ++++ controller/src/localizations/en.ts | 6 + controller/src/localizations/es.ts | 7 + controller/src/localizations/index.ts | 6 + 10 files changed, 1221 insertions(+), 2 deletions(-) create mode 100644 controller/drizzle/0022_stiff_raider.sql create mode 100644 controller/drizzle/meta/0022_snapshot.json create mode 100644 controller/src/functions/localization.ts create mode 100644 controller/src/localizations/en.ts create mode 100644 controller/src/localizations/es.ts create mode 100644 controller/src/localizations/index.ts diff --git a/controller/drizzle/0021_first_ink.sql b/controller/drizzle/0021_first_ink.sql index 4752c4d..b38a174 100644 --- a/controller/drizzle/0021_first_ink.sql +++ b/controller/drizzle/0021_first_ink.sql @@ -1,5 +1,3 @@ -Custom SQL migration file, put you code below! - CREATE OR REPLACE VIEW source_zips AS SELECT c.*, CONCAT(g.repo_url, '/archive/master.zip') AS zip_url, COUNT(DISTINCT srm.book_slug) AS unique_book_slugs_count, m.show_on_biel, m.status AS meta_status, l.national_name, l.english_name diff --git a/controller/drizzle/0022_stiff_raider.sql b/controller/drizzle/0022_stiff_raider.sql new file mode 100644 index 0000000..dc707f8 --- /dev/null +++ b/controller/drizzle/0022_stiff_raider.sql @@ -0,0 +1,12 @@ +CREATE TABLE IF NOT EXISTS "localization" ( + "ietf_code" varchar NOT NULL, + "key" varchar NOT NULL, + "value" text NOT NULL, + CONSTRAINT "localization_pkey" PRIMARY KEY("ietf_code","key") +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "localization" ADD CONSTRAINT "localization_ietf_code_language_ietf_code_fk" FOREIGN KEY ("ietf_code") REFERENCES "language"("ietf_code") ON DELETE cascade ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/controller/drizzle/meta/0022_snapshot.json b/controller/drizzle/meta/0022_snapshot.json new file mode 100644 index 0000000..f1300c2 --- /dev/null +++ b/controller/drizzle/meta/0022_snapshot.json @@ -0,0 +1,993 @@ +{ + "id": "015a2339-2418-43d7-82ce-f01f8c72fba3", + "prevId": "2de8e394-451c-45b3-8c67-b223d60334e9", + "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": {} + }, + "localization": { + "name": "localization", + "schema": "", + "columns": { + "ietf_code": { + "name": "ietf_code", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "localization_ietf_code_language_ietf_code_fk": { + "name": "localization_ietf_code_language_ietf_code_fk", + "tableFrom": "localization", + "tableTo": "language", + "columnsFrom": [ + "ietf_code" + ], + "columnsTo": [ + "ietf_code" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "localization_pkey": { + "name": "localization_pkey", + "columns": [ + "ietf_code", + "key" + ] + } + }, + "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 c898e44..18197eb 100644 --- a/controller/drizzle/meta/_journal.json +++ b/controller/drizzle/meta/_journal.json @@ -155,6 +155,13 @@ "when": 1711058534781, "tag": "0021_first_ink", "breakpoints": true + }, + { + "idx": 22, + "version": "5", + "when": 1712163855137, + "tag": "0022_stiff_raider", + "breakpoints": true } ] } \ No newline at end of file diff --git a/controller/src/db/schema/schema.ts b/controller/src/db/schema/schema.ts index 827f784..88caece 100644 --- a/controller/src/db/schema/schema.ts +++ b/controller/src/db/schema/schema.ts @@ -317,3 +317,25 @@ export const countryToLanguage = pgTable( }; } ); + +export const localization = pgTable( + "localization", + { + ietfCode: varchar("ietf_code") + .references(() => language.ietfCode, { + onDelete: "cascade", + onUpdate: "cascade", + }) + .notNull(), + key: varchar("key").notNull(), + value: text("value").notNull(), + }, + (table) => { + return { + primaryKey: primaryKey({ + columns: [table.ietfCode, table.key], + name: "localization_pkey", + }), + }; + } +); diff --git a/controller/src/db/schema/validations.ts b/controller/src/db/schema/validations.ts index 7414c4b..264ea30 100644 --- a/controller/src/db/schema/validations.ts +++ b/controller/src/db/schema/validations.ts @@ -2,6 +2,7 @@ import {createInsertSchema, createSelectSchema} from "drizzle-zod"; import * as schema from "./schema"; import {InferInsertModel, InferSelectModel} from "drizzle-orm"; import {z} from "zod"; +import {localization} from "./schema"; // ZOD DOCS // https://zod.dev/ @@ -156,6 +157,14 @@ export type insertCountryToLanguage = InferInsertModel< typeof schema.countryToLanguage >; +// LOCALIZATION TABLE + +export const insertLocalizationSchema = createInsertSchema(schema.localization); +export type localizationType = InferSelectModel; +export type insertLocalizationType = InferInsertModel< + typeof schema.localization +>; + // This is consume as a conveneient grouping of some tables to schemas. Primarily consumed by the polymorphic handlers export const insertSchemas = { language: { @@ -228,6 +237,11 @@ export const insertSchemas = { update: insertCountryToLanguageSchema.partial(), table: schema.countryToLanguage, }, + localization: { + schema: insertLocalizationSchema, + update: insertLocalizationSchema.partial(), + table: schema.localization, + }, }; export type tableKeysType = keyof typeof schema; diff --git a/controller/src/functions/localization.ts b/controller/src/functions/localization.ts new file mode 100644 index 0000000..18df05a --- /dev/null +++ b/controller/src/functions/localization.ts @@ -0,0 +1,154 @@ +import {app, InvocationContext, Timer} from "@azure/functions"; +import {getDb as startDb} from "../db/config"; +import {localizations} from "../localizations"; +import type {insertLocalizationType} from "../db/schema/validations"; +import {insertSchemas} from "../db/schema/validations"; +import {polymorphicInsert} from "../db/handlers"; +import {onConflictSetAllFieldsToSqlExcluded} from "../utils"; +import * as dbSchema from "../db/schema/schema"; +import {eq, sql, and, ilike, isNotNull} from "drizzle-orm"; +import {z} from "zod"; +const db = startDb(); +const table = insertSchemas.localization.table; + +// you can run azrue crons manually by invoking +// http://localhost:7071/admin/functions/manageLocalizationTable. (or the function name below). You must use a post request, header of Content-Type application/json, and the body as follows { "input": "anything"}. The body doesn't actually matter +export async function populateLocalization( + myTimer: Timer, + context: InvocationContext +): Promise { + context.log("Timer function processed request."); + const bookNamesResult = await populateScripturalBookNames(); + context.log( + Array.isArray(bookNamesResult) + ? `inserted ${bookNamesResult.length} rows of book names` + : bookNamesResult.message + ); + const resourceTypesResult = await populationResourceTypes(); + context.log( + Array.isArray(resourceTypesResult) + ? `inserted ${resourceTypesResult.length} rows of resource types` + : resourceTypesResult.message + ); +} + +async function populationResourceTypes() { + const payload = localizations.reduce( + (acc: insertLocalizationType[], curr) => { + const rows = Object.entries(curr.dict).map(([key, value]) => { + return {ietfCode: curr.ietf, key, value}; + }); + acc.push(...rows); + return acc; + }, + [] + ); + // no need for a transaction since its just the one sql action + const res = await polymorphicInsert({ + tableKey: "localization", + content: payload, + onConflictDoUpdateArgs: { + target: [table.ietfCode, table.key], + // loops through every column in given table setting the column to be the value of the excluded (e.g. conflicting) row except for those given in the second argument. For localization though, it just updates the value. + set: onConflictSetAllFieldsToSqlExcluded(table, ["ietfCode", "key"]), + }, + }); + return res; +} + +async function populateScripturalBookNames() { + const {scripturalRenderingMetadata, rendering, content, language, gitRepo} = + dbSchema; + //@ this is the raw sql version of what the orm below is doing + // const query = sql.raw(`SELECT book_name, book_slug, ietf_code, id + // FROM (SELECT book_name, book_slug, l.ietf_code, c.id, + // ROW_NUMBER() OVER (PARTITION BY l.ietf_code, book_slug ORDER BY book_slug) AS rn + // FROM scriptural_rendering_metadata AS srm + // JOIN rendering AS r ON r.id = srm.rendering_id + // JOIN content AS c ON r.content_id = c.id + // JOIN language AS l ON l.ietf_code = c.language_id + // JOIN git_repo AS gr ON c.git_id = gr.id + // WHERE gr.username ILIKE '%wa-catalog%' + // AND c.domain = 'scripture' + // AND book_slug IS NOT NULL + // ) AS subquery + // WHERE rn = 1 + // ORDER BY ietf_code, book_slug;`); + + const subquery = db + .select({ + book_name: scripturalRenderingMetadata.bookName, + book_slug: scripturalRenderingMetadata.bookSlug, + ietf_code: language.ietfCode, + id: content.id, + rn: sql + .raw( + "ROW_NUMBER() OVER (PARTITION BY ietf_code, book_slug ORDER BY book_slug)" + ) + .as("rn"), + }) + .from(scripturalRenderingMetadata) + .leftJoin( + rendering, + eq(rendering.id, scripturalRenderingMetadata.renderingId) + ) + .leftJoin(content, eq(content.id, rendering.contentId)) + .leftJoin(language, eq(language.ietfCode, content.languageId)) + .leftJoin(gitRepo, eq(content.gitId, gitRepo.id)) + .where( + and( + ilike(gitRepo.username, "%wa-catalog%"), + eq(content.domain, "scripture"), + isNotNull(scripturalRenderingMetadata.bookSlug) + ) + ) + .as("sq"); + const result = await db + .select({ + book_name: subquery.book_name, + book_slug: subquery.book_slug, + ietf_code: subquery.ietf_code, + id: subquery.id, + }) + .from(subquery) + .where(eq(subquery.rn, 1)) + .orderBy(subquery.ietf_code, subquery.book_slug); + + // rowList should be book_name, book_slug, ietf_code, id (content id that is); + // zod validate this; + + const parsed = z + .array( + z.object({ + book_name: z.string(), + book_slug: z.string(), + ietf_code: z.string(), + id: z.string(), + }) + ) + .parse(result); + const payload: insertLocalizationType[] = parsed.map((row) => { + return { + ietfCode: row.ietf_code, + key: row.book_slug.toLowerCase(), + value: row.book_name, + }; + }); + const inserted = await polymorphicInsert({ + tableKey: "localization", + content: payload, + onConflictDoUpdateArgs: { + target: [table.ietfCode, table.key], + set: onConflictSetAllFieldsToSqlExcluded(table, ["ietfCode", "key"]), + }, + }); + return inserted; +} + +app.timer("manageLocalizationTable", { + schedule: "0 0 0 * * *", + handler: populateLocalization, + useMonitor: false, +}); + +// For resource types, diff --git a/controller/src/localizations/en.ts b/controller/src/localizations/en.ts new file mode 100644 index 0000000..bd39224 --- /dev/null +++ b/controller/src/localizations/en.ts @@ -0,0 +1,6 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes", +}; +export type keysType = keyof typeof en; +export default {dict: en, ietf: "en"}; diff --git a/controller/src/localizations/es.ts b/controller/src/localizations/es.ts new file mode 100644 index 0000000..a37205a --- /dev/null +++ b/controller/src/localizations/es.ts @@ -0,0 +1,7 @@ +import type {keysType} from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción", +}; + +export default {dict: es, ietf: "es-419"}; diff --git a/controller/src/localizations/index.ts b/controller/src/localizations/index.ts new file mode 100644 index 0000000..75374eb --- /dev/null +++ b/controller/src/localizations/index.ts @@ -0,0 +1,6 @@ +import en from "./en"; +import es from "./es"; + +export const localizations = [en, es]; + +// Obj From 17877f54062a8661c6ebf3791c43091cdffbc2ca Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:32 -0400 Subject: [PATCH 07/73] New translations en.ts (French) --- controller/src/localizations/fr.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/fr.ts diff --git a/controller/src/localizations/fr.ts b/controller/src/localizations/fr.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/fr.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 3f43a24729470e4b616da9d938c6e0b8488ca294 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:32 -0400 Subject: [PATCH 08/73] New translations en.ts (Arabic) --- controller/src/localizations/ar.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/ar.ts diff --git a/controller/src/localizations/ar.ts b/controller/src/localizations/ar.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/ar.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 7fd906113a40ebba7d38d1b13e562e37d8b45f9e Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:33 -0400 Subject: [PATCH 09/73] New translations en.ts (Russian) --- controller/src/localizations/ru.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/ru.ts diff --git a/controller/src/localizations/ru.ts b/controller/src/localizations/ru.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/ru.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From b29fe8643949b20fadf0ae395d9e43f993819f0a Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:34 -0400 Subject: [PATCH 10/73] New translations en.ts (Chinese Simplified) --- controller/src/localizations/zh.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/zh.ts diff --git a/controller/src/localizations/zh.ts b/controller/src/localizations/zh.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/zh.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 7f9498dab2b6c16fd8474413802c60c5bd8b488d Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:35 -0400 Subject: [PATCH 11/73] New translations en.ts (Urdu (Pakistan)) --- controller/src/localizations/ur.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/ur.ts diff --git a/controller/src/localizations/ur.ts b/controller/src/localizations/ur.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/ur.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From a6ea62b058b638796f24cb6661ad33ce7d6ef2f9 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:35 -0400 Subject: [PATCH 12/73] New translations en.ts (Vietnamese) --- controller/src/localizations/vi.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/vi.ts diff --git a/controller/src/localizations/vi.ts b/controller/src/localizations/vi.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/vi.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From aea6193f8b2655e9076dfa6831238d8a5779a496 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:36 -0400 Subject: [PATCH 13/73] New translations en.ts (Portuguese, Brazilian) --- controller/src/localizations/pt.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/pt.ts diff --git a/controller/src/localizations/pt.ts b/controller/src/localizations/pt.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/pt.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 1e3b8afadab101c771ccab6cc66ad7737d5a2e85 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:37 -0400 Subject: [PATCH 14/73] New translations en.ts (Indonesian) --- controller/src/localizations/id.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/id.ts diff --git a/controller/src/localizations/id.ts b/controller/src/localizations/id.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/id.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From b6cf9374a3671815a985caf3347c9ac7698eb2d7 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:38 -0400 Subject: [PATCH 15/73] New translations en.ts (Telugu) --- controller/src/localizations/te.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/te.ts diff --git a/controller/src/localizations/te.ts b/controller/src/localizations/te.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/te.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 4b5d9c43b90cf3a8da3e21f51527c568628ac90b Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:38 -0400 Subject: [PATCH 16/73] New translations en.ts (Burmese) --- controller/src/localizations/my.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/my.ts diff --git a/controller/src/localizations/my.ts b/controller/src/localizations/my.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/my.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 1e5e48f3f480eb64a3b3a9eec1bdcf6a05a343c5 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:39 -0400 Subject: [PATCH 17/73] New translations en.ts (Swahili) --- controller/src/localizations/sw.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/sw.ts diff --git a/controller/src/localizations/sw.ts b/controller/src/localizations/sw.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/sw.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 6678e85dcb2c088ca7b5493cbd43abfbec3d5e46 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:40 -0400 Subject: [PATCH 18/73] New translations en.ts (Cebuano) --- controller/src/localizations/ceb.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 controller/src/localizations/ceb.ts diff --git a/controller/src/localizations/ceb.ts b/controller/src/localizations/ceb.ts new file mode 100644 index 0000000..b63c1f9 --- /dev/null +++ b/controller/src/localizations/ceb.ts @@ -0,0 +1,9 @@ +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From ea6db59849b0d10f20679dbec1fc50d8a1149128 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:41 -0400 Subject: [PATCH 19/73] New translations en.ts (Spanish, Latin America) --- controller/src/localizations/es.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/es.ts b/controller/src/localizations/es.ts index a37205a..b63c1f9 100644 --- a/controller/src/localizations/es.ts +++ b/controller/src/localizations/es.ts @@ -1,7 +1,9 @@ -import type {keysType} from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción", +const en = { + tw: "Translations Words", + tn: "Translation Notes" }; - -export default {dict: es, ietf: "es-419"}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From dd815d219488e753ddb61367671094ef47c2a840 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:42 -0400 Subject: [PATCH 20/73] New translations es.ts (French) --- controller/src/localizations/fr.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/fr.ts b/controller/src/localizations/fr.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/fr.ts +++ b/controller/src/localizations/fr.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From cd815e2d363d4126b439d53aaa7171a0504659e6 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:43 -0400 Subject: [PATCH 21/73] New translations es.ts (Arabic) --- controller/src/localizations/ar.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/ar.ts b/controller/src/localizations/ar.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/ar.ts +++ b/controller/src/localizations/ar.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From 85d02f32325d27ab9e6b72298744e737b565b48f Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:44 -0400 Subject: [PATCH 22/73] New translations es.ts (Russian) --- controller/src/localizations/ru.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/ru.ts b/controller/src/localizations/ru.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/ru.ts +++ b/controller/src/localizations/ru.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From 8ea48dc8459878d2a0fe26e1f11758e4dbaa5ef3 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:45 -0400 Subject: [PATCH 23/73] New translations es.ts (Chinese Simplified) --- controller/src/localizations/zh.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/zh.ts b/controller/src/localizations/zh.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/zh.ts +++ b/controller/src/localizations/zh.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From ba01d210be8f914ef26a11447677b693d423b253 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:46 -0400 Subject: [PATCH 24/73] New translations es.ts (Urdu (Pakistan)) --- controller/src/localizations/ur.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/ur.ts b/controller/src/localizations/ur.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/ur.ts +++ b/controller/src/localizations/ur.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From 95e9d1d7beffae6ed1f4c02dcedca942dc42ca70 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:47 -0400 Subject: [PATCH 25/73] New translations es.ts (Vietnamese) --- controller/src/localizations/vi.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/vi.ts b/controller/src/localizations/vi.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/vi.ts +++ b/controller/src/localizations/vi.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From 3d3b849ae73a3f7a6658be2af4160e9f5a275c12 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:48 -0400 Subject: [PATCH 26/73] New translations es.ts (Portuguese, Brazilian) --- controller/src/localizations/pt.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/pt.ts b/controller/src/localizations/pt.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/pt.ts +++ b/controller/src/localizations/pt.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From a1bcd1ace75f0fbdca1a9f78edf1523bf223743d Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:49 -0400 Subject: [PATCH 27/73] New translations es.ts (Indonesian) --- controller/src/localizations/id.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/id.ts b/controller/src/localizations/id.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/id.ts +++ b/controller/src/localizations/id.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From ab2f3352639a305e35bfb0ef9240067930809756 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:50 -0400 Subject: [PATCH 28/73] New translations es.ts (Telugu) --- controller/src/localizations/te.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/te.ts b/controller/src/localizations/te.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/te.ts +++ b/controller/src/localizations/te.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From 95939ef643031410d30d8508c4535b727a675116 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:50 -0400 Subject: [PATCH 29/73] New translations es.ts (Burmese) --- controller/src/localizations/my.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/my.ts b/controller/src/localizations/my.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/my.ts +++ b/controller/src/localizations/my.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From f1a63d7fa2d76e4f5b7c2cd2107203bf807d1b0c Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:52 -0400 Subject: [PATCH 30/73] New translations es.ts (Swahili) --- controller/src/localizations/sw.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/sw.ts b/controller/src/localizations/sw.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/sw.ts +++ b/controller/src/localizations/sw.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From 30e64a1f86095362ccad823acaba64db596124d5 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:52 -0400 Subject: [PATCH 31/73] New translations es.ts (Cebuano) --- controller/src/localizations/ceb.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/ceb.ts b/controller/src/localizations/ceb.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/ceb.ts +++ b/controller/src/localizations/ceb.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From ddb1f113f71a070acd4a5686b1af10bea95988ed Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:53 -0400 Subject: [PATCH 32/73] New translations es.ts (Spanish, Latin America) --- controller/src/localizations/es.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/controller/src/localizations/es.ts b/controller/src/localizations/es.ts index b63c1f9..529ef16 100644 --- a/controller/src/localizations/es.ts +++ b/controller/src/localizations/es.ts @@ -1,9 +1,9 @@ -const en = { - tw: "Translations Words", - tn: "Translation Notes" +import type { keysType } from "./en"; +export const es: Record = { + tn: "Notas de traducción", + tw: "Palabras de traducción" }; -export type keysType = keyof typeof en; export default { - dict: en, - ietf: "en" + dict: es, + ietf: "es-419" }; \ No newline at end of file From 11d1dbf0c7cdf583d30c983511ed802897651068 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:54 -0400 Subject: [PATCH 33/73] New translations index.ts (French) --- controller/src/localizations/fr.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/fr.ts b/controller/src/localizations/fr.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/fr.ts +++ b/controller/src/localizations/fr.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From 75793fef01d0b3252a0255bc6591a43913c9340c Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:55 -0400 Subject: [PATCH 34/73] New translations index.ts (Arabic) --- controller/src/localizations/ar.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/ar.ts b/controller/src/localizations/ar.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/ar.ts +++ b/controller/src/localizations/ar.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From e9e6f25e73dc402982a21fe84560a92fa9019122 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:56 -0400 Subject: [PATCH 35/73] New translations index.ts (Russian) --- controller/src/localizations/ru.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/ru.ts b/controller/src/localizations/ru.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/ru.ts +++ b/controller/src/localizations/ru.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From 8abe3d2e82f16ada74a6314d8197c91962ae8582 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:57 -0400 Subject: [PATCH 36/73] New translations index.ts (Chinese Simplified) --- controller/src/localizations/zh.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/zh.ts b/controller/src/localizations/zh.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/zh.ts +++ b/controller/src/localizations/zh.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From 83951b5fbdb2d01c2de7b123dfca28bd577915e7 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:57 -0400 Subject: [PATCH 37/73] New translations index.ts (Urdu (Pakistan)) --- controller/src/localizations/ur.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/ur.ts b/controller/src/localizations/ur.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/ur.ts +++ b/controller/src/localizations/ur.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From 299d5366123bd6f87c85779f96c6fae22f8fc9f9 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:58 -0400 Subject: [PATCH 38/73] New translations index.ts (Vietnamese) --- controller/src/localizations/vi.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/vi.ts b/controller/src/localizations/vi.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/vi.ts +++ b/controller/src/localizations/vi.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From 7f595e873644e17448f883314b0b70f1322e911c Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:04:59 -0400 Subject: [PATCH 39/73] New translations index.ts (Portuguese, Brazilian) --- controller/src/localizations/pt.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/pt.ts b/controller/src/localizations/pt.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/pt.ts +++ b/controller/src/localizations/pt.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From e20e3aed3badccccae6b37bf75b5e30f83256475 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:05:00 -0400 Subject: [PATCH 40/73] New translations index.ts (Indonesian) --- controller/src/localizations/id.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/id.ts b/controller/src/localizations/id.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/id.ts +++ b/controller/src/localizations/id.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From a3ef6dd4af77960044e3e82f749b971e08a4bb36 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:05:01 -0400 Subject: [PATCH 41/73] New translations index.ts (Telugu) --- controller/src/localizations/te.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/te.ts b/controller/src/localizations/te.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/te.ts +++ b/controller/src/localizations/te.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From 861606dccbbacc0d096aca4d54fbc9fa9e9d7c46 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:05:02 -0400 Subject: [PATCH 42/73] New translations index.ts (Burmese) --- controller/src/localizations/my.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/my.ts b/controller/src/localizations/my.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/my.ts +++ b/controller/src/localizations/my.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From 37636d7eace2117380fda616ddadc753f97edda3 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:05:03 -0400 Subject: [PATCH 43/73] New translations index.ts (Swahili) --- controller/src/localizations/sw.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/sw.ts b/controller/src/localizations/sw.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/sw.ts +++ b/controller/src/localizations/sw.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From 577748db8dbe067197035f31f5da6375d310fa38 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:05:04 -0400 Subject: [PATCH 44/73] New translations index.ts (Cebuano) --- controller/src/localizations/ceb.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/ceb.ts b/controller/src/localizations/ceb.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/ceb.ts +++ b/controller/src/localizations/ceb.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From fc75b8cb65f69465d5c4de1235bec8c21829ad17 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:05:05 -0400 Subject: [PATCH 45/73] New translations index.ts (Spanish, Latin America) --- controller/src/localizations/es.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/controller/src/localizations/es.ts b/controller/src/localizations/es.ts index 529ef16..73a445a 100644 --- a/controller/src/localizations/es.ts +++ b/controller/src/localizations/es.ts @@ -1,9 +1,5 @@ -import type { keysType } from "./en"; -export const es: Record = { - tn: "Notas de traducción", - tw: "Palabras de traducción" -}; -export default { - dict: es, - ietf: "es-419" -}; \ No newline at end of file +import en from "./en"; +import es from "./es"; +export const localizations = [en, es]; + +// Obj \ No newline at end of file From 104a7773cb694e318b63515f9b90cd839f4e0af7 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:46 -0400 Subject: [PATCH 46/73] New translations en.ts (French) --- controller/src/localizations/fr.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/fr.ts b/controller/src/localizations/fr.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/fr.ts +++ b/controller/src/localizations/fr.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 0b991d20f118f3fee8dcba22bc32af6304de5e6f Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:47 -0400 Subject: [PATCH 47/73] New translations en.ts (Arabic) --- controller/src/localizations/ar.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/ar.ts b/controller/src/localizations/ar.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/ar.ts +++ b/controller/src/localizations/ar.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 12ff506e28b0adec606b9fd6621dabee42415a9d Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:47 -0400 Subject: [PATCH 48/73] New translations en.ts (Russian) --- controller/src/localizations/ru.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/ru.ts b/controller/src/localizations/ru.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/ru.ts +++ b/controller/src/localizations/ru.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 423d6c986da4051c1871c8f2015ad29a54b715d5 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:48 -0400 Subject: [PATCH 49/73] New translations en.ts (Chinese Simplified) --- controller/src/localizations/zh.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/zh.ts b/controller/src/localizations/zh.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/zh.ts +++ b/controller/src/localizations/zh.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 3cc07af6874e074e8994f0bed48a45f156d64360 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:49 -0400 Subject: [PATCH 50/73] New translations en.ts (Urdu (Pakistan)) --- controller/src/localizations/ur.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/ur.ts b/controller/src/localizations/ur.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/ur.ts +++ b/controller/src/localizations/ur.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From b9e97b71638c94ec2c937fe2f7f7d1d0fd3db0aa Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:50 -0400 Subject: [PATCH 51/73] New translations en.ts (Vietnamese) --- controller/src/localizations/vi.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/vi.ts b/controller/src/localizations/vi.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/vi.ts +++ b/controller/src/localizations/vi.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From dcf6354d65bb5d2652b47c3436a3a9f76ae62ce9 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:51 -0400 Subject: [PATCH 52/73] New translations en.ts (Portuguese, Brazilian) --- controller/src/localizations/pt.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/pt.ts b/controller/src/localizations/pt.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/pt.ts +++ b/controller/src/localizations/pt.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From ce211fdd50ecee5064042b9466a8804b830da312 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:51 -0400 Subject: [PATCH 53/73] New translations en.ts (Indonesian) --- controller/src/localizations/id.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/id.ts b/controller/src/localizations/id.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/id.ts +++ b/controller/src/localizations/id.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 7a9419d95d13d784ac518eb0d65db12e22b99928 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:52 -0400 Subject: [PATCH 54/73] New translations en.ts (Telugu) --- controller/src/localizations/te.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/te.ts b/controller/src/localizations/te.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/te.ts +++ b/controller/src/localizations/te.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 305e4932e1832bce74b278445da154809a171e1d Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:53 -0400 Subject: [PATCH 55/73] New translations en.ts (Burmese) --- controller/src/localizations/my.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/my.ts b/controller/src/localizations/my.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/my.ts +++ b/controller/src/localizations/my.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From c2ae60c597b37789696433285ae7cf520cd697b4 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:53 -0400 Subject: [PATCH 56/73] New translations en.ts (Swahili) --- controller/src/localizations/sw.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/sw.ts b/controller/src/localizations/sw.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/sw.ts +++ b/controller/src/localizations/sw.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From b4724a74c03260b94877c400ba523053a880850f Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:54 -0400 Subject: [PATCH 57/73] New translations en.ts (Cebuano) --- controller/src/localizations/ceb.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/ceb.ts b/controller/src/localizations/ceb.ts index 73a445a..b63c1f9 100644 --- a/controller/src/localizations/ceb.ts +++ b/controller/src/localizations/ceb.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "en" +}; \ No newline at end of file From 35e8da92a7d6e9a18039f8e0a2f55c66364f8c5a Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:00:55 -0400 Subject: [PATCH 58/73] New translations en.ts (Spanish, Latin America) --- controller/src/localizations/es.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/controller/src/localizations/es.ts b/controller/src/localizations/es.ts index 73a445a..862eb53 100644 --- a/controller/src/localizations/es.ts +++ b/controller/src/localizations/es.ts @@ -1,5 +1,9 @@ -import en from "./en"; -import es from "./es"; -export const localizations = [en, es]; - -// Obj \ No newline at end of file +const en = { + tw: "Translations Words", + tn: "Translation Notes" +}; +export type keysType = keyof typeof en; +export default { + dict: en, + ietf: "es-419" +}; \ No newline at end of file From 480d7446103f4baa2a20f5f4f5afea642e03ad83 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:04 -0400 Subject: [PATCH 59/73] New translations en.ts (French) --- controller/src/localizations/fr.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/fr.ts b/controller/src/localizations/fr.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/fr.ts +++ b/controller/src/localizations/fr.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From 38622070059b7049becacf55461b066f01ea7d06 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:05 -0400 Subject: [PATCH 60/73] New translations en.ts (Arabic) --- controller/src/localizations/ar.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/ar.ts b/controller/src/localizations/ar.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/ar.ts +++ b/controller/src/localizations/ar.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From a53e394f29343fe67622d16529b5475086ffb168 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:06 -0400 Subject: [PATCH 61/73] New translations en.ts (Russian) --- controller/src/localizations/ru.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/ru.ts b/controller/src/localizations/ru.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/ru.ts +++ b/controller/src/localizations/ru.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From 689bb435c5cf0ab42b00a54f681361d009809642 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:07 -0400 Subject: [PATCH 62/73] New translations en.ts (Chinese Simplified) --- controller/src/localizations/zh.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/zh.ts b/controller/src/localizations/zh.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/zh.ts +++ b/controller/src/localizations/zh.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From 369075a26b7adcb53a2501ca14b96083efa19a58 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:08 -0400 Subject: [PATCH 63/73] New translations en.ts (Urdu (Pakistan)) --- controller/src/localizations/ur.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/ur.ts b/controller/src/localizations/ur.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/ur.ts +++ b/controller/src/localizations/ur.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From 0163e799a02a00f51eb5eae43efaf0ad856a82e6 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:09 -0400 Subject: [PATCH 64/73] New translations en.ts (Vietnamese) --- controller/src/localizations/vi.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/vi.ts b/controller/src/localizations/vi.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/vi.ts +++ b/controller/src/localizations/vi.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From 508cf1497f9bc82468f735dd7596ddaa2953716d Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:10 -0400 Subject: [PATCH 65/73] New translations en.ts (Portuguese, Brazilian) --- controller/src/localizations/pt.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/pt.ts b/controller/src/localizations/pt.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/pt.ts +++ b/controller/src/localizations/pt.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From 723e3ca85cdf557b0b54f5f3db1e9cf181a17d9b Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:11 -0400 Subject: [PATCH 66/73] New translations en.ts (Indonesian) --- controller/src/localizations/id.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/id.ts b/controller/src/localizations/id.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/id.ts +++ b/controller/src/localizations/id.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From 09d519c47603e476c1225104e360089e3fd60fd5 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:11 -0400 Subject: [PATCH 67/73] New translations en.ts (Telugu) --- controller/src/localizations/te.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/te.ts b/controller/src/localizations/te.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/te.ts +++ b/controller/src/localizations/te.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From 479dfddf4166bc97529587aeb7e58e3a4d0b05e6 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:12 -0400 Subject: [PATCH 68/73] New translations en.ts (Burmese) --- controller/src/localizations/my.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/my.ts b/controller/src/localizations/my.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/my.ts +++ b/controller/src/localizations/my.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From 3eb3425f757fa88967ce08cd1d48499f6d803da5 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:13 -0400 Subject: [PATCH 69/73] New translations en.ts (Swahili) --- controller/src/localizations/sw.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/sw.ts b/controller/src/localizations/sw.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/sw.ts +++ b/controller/src/localizations/sw.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From fde0e4797a9c1c000fd6496b9953b92ae1edb0d0 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:14 -0400 Subject: [PATCH 70/73] New translations en.ts (Cebuano) --- controller/src/localizations/ceb.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/ceb.ts b/controller/src/localizations/ceb.ts index b63c1f9..dac08b4 100644 --- a/controller/src/localizations/ceb.ts +++ b/controller/src/localizations/ceb.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From 7edffdd0ea70f926e196bed55a01579bacbb8c40 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:56:15 -0400 Subject: [PATCH 71/73] New translations en.ts (Spanish, Latin America) --- controller/src/localizations/es.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controller/src/localizations/es.ts b/controller/src/localizations/es.ts index 862eb53..9e59a2a 100644 --- a/controller/src/localizations/es.ts +++ b/controller/src/localizations/es.ts @@ -1,6 +1,7 @@ const en = { tw: "Translations Words", - tn: "Translation Notes" + tn: "Translation Notes", + obs: "Open Bible Stories" }; export type keysType = keyof typeof en; export default { From 1ef57117e000f568adc121d176a6135ee3bd3d08 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:59:03 -0400 Subject: [PATCH 72/73] New translations en.ts (Spanish, Latin America) --- controller/src/localizations/es.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/controller/src/localizations/es.ts b/controller/src/localizations/es.ts index 9e59a2a..32f9fe5 100644 --- a/controller/src/localizations/es.ts +++ b/controller/src/localizations/es.ts @@ -1,7 +1,7 @@ const en = { - tw: "Translations Words", - tn: "Translation Notes", - obs: "Open Bible Stories" + tw: "Palabras de traducción", + tn: "Notas de traducción", + obs: "Historias bíblicas abiertas" }; export type keysType = keyof typeof en; export default { From 7f06e1d82bd8cfa108f029999cd6453f30155cb4 Mon Sep 17 00:00:00 2001 From: danparisd <43418833+danparisd@users.noreply.github.com> Date: Wed, 24 Apr 2024 15:17:30 -0400 Subject: [PATCH 73/73] New translations en.ts (Arabic) --- controller/src/localizations/ar.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/controller/src/localizations/ar.ts b/controller/src/localizations/ar.ts index dac08b4..c4bc4ab 100644 --- a/controller/src/localizations/ar.ts +++ b/controller/src/localizations/ar.ts @@ -1,6 +1,6 @@ const en = { - tw: "Translations Words", - tn: "Translation Notes", + tw: "كلمات الترجمات", + tn: "ملاحظات الترجمة", obs: "Open Bible Stories" }; export type keysType = keyof typeof en;