- add deck_terms to schema imports - add addTermsToDeck — diffs source term IDs against existing deck_terms, inserts only new ones, returns count of inserted terms - add updateValidatedLanguages — recalculates and persists validated_languages on every run so coverage stays accurate as translation data grows - wire both functions into main with isNewDeck guard to avoid redundant validated_languages update on deck creation - add final summary report - fix possible undefined on result[0] in createDeck - tick off remaining roadmap items
82 lines
No EOL
4.4 KiB
SQL
82 lines
No EOL
4.4 KiB
SQL
CREATE TABLE "deck_terms" (
|
|
"deck_id" uuid NOT NULL,
|
|
"term_id" uuid NOT NULL,
|
|
"added_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "deck_terms_deck_id_term_id_pk" PRIMARY KEY("deck_id","term_id")
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "decks" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"name" text NOT NULL,
|
|
"description" text,
|
|
"source_language" varchar(10) NOT NULL,
|
|
"validated_languages" varchar(10)[] DEFAULT '{}' NOT NULL,
|
|
"is_public" boolean DEFAULT false NOT NULL,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "unique_deck_name" UNIQUE("name","source_language"),
|
|
CONSTRAINT "source_language_check" CHECK ("decks"."source_language" IN ('en', 'it')),
|
|
CONSTRAINT "validated_languages_check" CHECK (validated_languages <@ ARRAY['en', 'it']::varchar[]),
|
|
CONSTRAINT "validated_languages_excludes_source" CHECK (NOT ("decks"."source_language" = ANY("decks"."validated_languages")))
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "language_pairs" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"source_language" varchar(10) NOT NULL,
|
|
"target_language" varchar(10) NOT NULL,
|
|
"label" text,
|
|
"active" boolean DEFAULT true NOT NULL,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "unique_source_target" UNIQUE("source_language","target_language"),
|
|
CONSTRAINT "source_language_check" CHECK ("language_pairs"."source_language" IN ('en', 'it')),
|
|
CONSTRAINT "target_language_check" CHECK ("language_pairs"."target_language" IN ('en', 'it')),
|
|
CONSTRAINT "no_self_pair" CHECK ("language_pairs"."source_language" != "language_pairs"."target_language")
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "term_glosses" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"term_id" uuid NOT NULL,
|
|
"language_code" varchar(10) NOT NULL,
|
|
"text" text NOT NULL,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "unique_term_gloss" UNIQUE("term_id","language_code","text")
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "terms" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"synset_id" text NOT NULL,
|
|
"pos" varchar(20) NOT NULL,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "terms_synset_id_unique" UNIQUE("synset_id"),
|
|
CONSTRAINT "pos_check" CHECK ("terms"."pos" IN ('noun'))
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "translations" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"term_id" uuid NOT NULL,
|
|
"language_code" varchar(10) NOT NULL,
|
|
"text" text NOT NULL,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "unique_translations" UNIQUE("term_id","language_code","text")
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "users" (
|
|
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
"openauth_sub" text NOT NULL,
|
|
"email" varchar(255),
|
|
"display_name" varchar(100),
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
"last_login_at" timestamp with time zone,
|
|
CONSTRAINT "users_openauth_sub_unique" UNIQUE("openauth_sub"),
|
|
CONSTRAINT "users_email_unique" UNIQUE("email"),
|
|
CONSTRAINT "users_display_name_unique" UNIQUE("display_name")
|
|
);
|
|
--> statement-breakpoint
|
|
ALTER TABLE "deck_terms" ADD CONSTRAINT "deck_terms_deck_id_decks_id_fk" FOREIGN KEY ("deck_id") REFERENCES "public"."decks"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "deck_terms" ADD CONSTRAINT "deck_terms_term_id_terms_id_fk" FOREIGN KEY ("term_id") REFERENCES "public"."terms"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "term_glosses" ADD CONSTRAINT "term_glosses_term_id_terms_id_fk" FOREIGN KEY ("term_id") REFERENCES "public"."terms"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "translations" ADD CONSTRAINT "translations_term_id_terms_id_fk" FOREIGN KEY ("term_id") REFERENCES "public"."terms"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
CREATE INDEX "idx_deck_terms_term" ON "deck_terms" USING btree ("term_id");--> statement-breakpoint
|
|
CREATE INDEX "idx_pairs_active" ON "language_pairs" USING btree ("active","source_language","target_language");--> statement-breakpoint
|
|
CREATE INDEX "idx_term_glosses_term" ON "term_glosses" USING btree ("term_id");--> statement-breakpoint
|
|
CREATE INDEX "idx_terms_pos" ON "terms" USING btree ("pos");--> statement-breakpoint
|
|
CREATE INDEX "idx_translations_lang" ON "translations" USING btree ("language_code","term_id"); |