Creating external ids table and join tables.

This commit is contained in:
Bradley Shellnut 2024-02-14 09:42:29 -08:00
parent b7d7f298bc
commit ec5f1ed93b
10 changed files with 3558 additions and 36 deletions

View file

@ -0,0 +1,30 @@
DO $$ BEGIN
CREATE TYPE "external_id_type" AS ENUM('game', 'category', 'mechanic', 'publisher', 'designer', 'artist');
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS "external_ids" (
"id" varchar(255) PRIMARY KEY NOT NULL,
"type" varchar(255),
"external_id" varchar(255)
);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS "game_external_ids" (
"game_id" varchar(255) NOT NULL,
"external_id" varchar(255) NOT NULL
);
--> statement-breakpoint
ALTER TABLE "games" DROP CONSTRAINT "games_external_id_unique";--> statement-breakpoint
ALTER TABLE "games" DROP COLUMN IF EXISTS "external_id";--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "game_external_ids" ADD CONSTRAINT "game_external_ids_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "games"("id") ON DELETE cascade ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "game_external_ids" ADD CONSTRAINT "game_external_ids_external_id_external_ids_id_fk" FOREIGN KEY ("external_id") REFERENCES "external_ids"("id") ON DELETE cascade ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN null;
END $$;

View file

@ -0,0 +1,16 @@
ALTER TABLE "game_external_ids" RENAME TO "games_to_external_ids";--> statement-breakpoint
ALTER TABLE "games_to_external_ids" DROP CONSTRAINT "game_external_ids_game_id_games_id_fk";
--> statement-breakpoint
ALTER TABLE "games_to_external_ids" DROP CONSTRAINT "game_external_ids_external_id_external_ids_id_fk";
--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "games_to_external_ids" ADD CONSTRAINT "games_to_external_ids_game_id_games_id_fk" FOREIGN KEY ("game_id") REFERENCES "games"("id") ON DELETE cascade ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "games_to_external_ids" ADD CONSTRAINT "games_to_external_ids_external_id_external_ids_id_fk" FOREIGN KEY ("external_id") REFERENCES "external_ids"("id") ON DELETE cascade ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN null;
END $$;

View file

@ -0,0 +1,2 @@
ALTER TABLE "external_ids" ALTER COLUMN "type" SET NOT NULL;--> statement-breakpoint
ALTER TABLE "external_ids" ALTER COLUMN "external_id" SET NOT NULL;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -29,6 +29,27 @@
"when": 1707526808124,
"tag": "0003_thick_tinkerer",
"breakpoints": true
},
{
"idx": 4,
"version": "5",
"when": 1707932397672,
"tag": "0004_fancy_umar",
"breakpoints": true
},
{
"idx": 5,
"version": "5",
"when": 1707932466413,
"tag": "0005_uneven_lifeguard",
"breakpoints": true
},
{
"idx": 6,
"version": "5",
"when": 1707932522909,
"tag": "0006_light_corsair",
"breakpoints": true
}
]
}

View file

@ -38,7 +38,7 @@
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"autoprefixer": "^10.4.17",
"dotenv": "^16.4.1",
"dotenv": "^16.4.4",
"drizzle-kit": "^0.20.14",
"eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0",
@ -50,7 +50,7 @@
"postcss-load-config": "^5.0.3",
"postcss-preset-env": "^9.3.0",
"prettier": "^3.2.5",
"prettier-plugin-svelte": "^3.1.2",
"prettier-plugin-svelte": "^3.2.0",
"prisma": "^5.9.1",
"sass": "^1.70.0",
"satori": "^0.10.13",
@ -65,7 +65,7 @@
"tailwindcss": "^3.4.1",
"ts-node": "^10.9.2",
"tslib": "^2.6.1",
"tsx": "^4.7.0",
"tsx": "^4.7.1",
"typescript": "^5.3.3",
"vite": "^5.1.1",
"vitest": "^1.2.2",
@ -91,14 +91,14 @@
"@sveltejs/adapter-vercel": "^5.1.0",
"@types/feather-icons": "^4.29.4",
"@vercel/og": "^0.5.20",
"bits-ui": "^0.17.0",
"bits-ui": "^0.18.1",
"boardgamegeekclient": "^1.9.1",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.0",
"cookie": "^0.6.0",
"drizzle-orm": "^0.29.3",
"feather-icons": "^4.29.1",
"formsnap": "^0.4.3",
"formsnap": "^0.4.4",
"html-entities": "^2.4.0",
"iconify-icon": "^2.0.0",
"just-kebab-case": "^4.2.0",
@ -108,7 +108,7 @@
"mysql2": "^3.9.1",
"nanoid": "^5.0.5",
"open-props": "^1.6.18",
"oslo": "^1.1.0",
"oslo": "^1.1.1",
"pg": "^8.11.3",
"postgres": "^3.4.3",
"radix-svelte": "^0.9.0",

View file

@ -48,8 +48,8 @@ dependencies:
specifier: ^0.5.20
version: 0.5.20
bits-ui:
specifier: ^0.17.0
version: 0.17.0(svelte@4.2.10)
specifier: ^0.18.1
version: 0.18.1(svelte@4.2.10)
boardgamegeekclient:
specifier: ^1.9.1
version: 1.9.1
@ -69,8 +69,8 @@ dependencies:
specifier: ^4.29.1
version: 4.29.1
formsnap:
specifier: ^0.4.3
version: 0.4.3(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4)
specifier: ^0.4.4
version: 0.4.4(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4)
html-entities:
specifier: ^2.4.0
version: 2.4.0
@ -99,8 +99,8 @@ dependencies:
specifier: ^1.6.18
version: 1.6.18
oslo:
specifier: ^1.1.0
version: 1.1.0
specifier: ^1.1.1
version: 1.1.1
pg:
specifier: ^8.11.3
version: 8.11.3
@ -170,8 +170,8 @@ devDependencies:
specifier: ^10.4.17
version: 10.4.17(postcss@8.4.35)
dotenv:
specifier: ^16.4.1
version: 16.4.1
specifier: ^16.4.4
version: 16.4.4
drizzle-kit:
specifier: ^0.20.14
version: 0.20.14
@ -206,8 +206,8 @@ devDependencies:
specifier: ^3.2.5
version: 3.2.5
prettier-plugin-svelte:
specifier: ^3.1.2
version: 3.1.2(prettier@3.2.5)(svelte@4.2.10)
specifier: ^3.2.0
version: 3.2.0(prettier@3.2.5)(svelte@4.2.10)
prisma:
specifier: ^5.9.1
version: 5.9.1
@ -251,8 +251,8 @@ devDependencies:
specifier: ^2.6.1
version: 2.6.2
tsx:
specifier: ^4.7.0
version: 4.7.0
specifier: ^4.7.1
version: 4.7.1
typescript:
specifier: ^5.3.3
version: 5.3.3
@ -1393,6 +1393,14 @@ packages:
dependencies:
'@floating-ui/core': 1.6.0
'@floating-ui/utils': 0.2.1
dev: true
/@floating-ui/dom@1.6.3:
resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==}
dependencies:
'@floating-ui/core': 1.6.0
'@floating-ui/utils': 0.2.1
dev: false
/@floating-ui/utils@0.1.6:
resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==}
@ -1746,7 +1754,7 @@ packages:
svelte: '>=3 <5'
dependencies:
'@floating-ui/core': 1.6.0
'@floating-ui/dom': 1.6.1
'@floating-ui/dom': 1.6.3
'@internationalized/date': 3.5.1
dequal: 2.0.3
focus-trap: 7.5.4
@ -3437,10 +3445,10 @@ packages:
hasBin: true
dependencies:
'@actions/core': 1.10.1
dotenv: 16.4.1
dotenv: 16.4.4
front-matter: 4.0.2
nanoid: 4.0.2
oslo: 1.1.0
oslo: 1.1.1
dev: false
/autoprefixer@10.4.17(postcss@8.4.35):
@ -3486,8 +3494,8 @@ packages:
file-uri-to-path: 1.0.0
dev: false
/bits-ui@0.17.0(svelte@4.2.10):
resolution: {integrity: sha512-K73jjco1qPmvGXMQtTkZG6K36UmNrPR21u+C1jzoRWmF3NnUfDP4hPJnAci0LosUycfvOxtaHB1M4awvLvQXyQ==}
/bits-ui@0.18.1(svelte@4.2.10):
resolution: {integrity: sha512-6junivBQ3EIHeF9j8wDa5pgzegtOwaI61ny4X8F7h2SIJi4RJWwZknkT7O5qPLeGoIYNeYV7N6EOBrr1w9/Mxg==}
peerDependencies:
svelte: ^4.0.0
dependencies:
@ -3948,8 +3956,8 @@ packages:
esutils: 2.0.3
dev: true
/dotenv@16.4.1:
resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==}
/dotenv@16.4.4:
resolution: {integrity: sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==}
engines: {node: '>=12'}
/dreamopt@0.8.0:
@ -4507,8 +4515,8 @@ packages:
is-callable: 1.2.7
dev: false
/formsnap@0.4.3(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4):
resolution: {integrity: sha512-PWVq78XVUHhAU1tcVGKeGamk6B4Opkk1uVNRW2YofiQpnA5Bry1c3TQjB9cVDw5u4oAwmDvIoAzVHlrAIgc+tw==}
/formsnap@0.4.4(svelte@4.2.10)(sveltekit-superforms@1.13.4)(zod@3.22.4):
resolution: {integrity: sha512-O+Cf4GneR4CLP48J0c5AJY6eowc+1N3DYZz9uIJ3Mk57AjdL5l8DQEA+HmRfse4UEPepizEPl+M4vFg8cON2BQ==}
peerDependencies:
svelte: ^4.0.0
sveltekit-superforms: ^1.7.1
@ -5517,8 +5525,8 @@ packages:
'@node-rs/bcrypt': 1.9.2
dev: false
/oslo@1.1.0:
resolution: {integrity: sha512-uUvVt1boGt1aO0oMjzyzxIiDGAkfOdh6jPOzfJZBXsOsHuHfvTnrW7ealrBb27sgg5pHnTjmen6xPz4so+gQEQ==}
/oslo@1.1.1:
resolution: {integrity: sha512-BuJp5GfBW3jkUDLb8VftXD9FRTfjnodMyVshSy6p4UP8PhQI8auTxAQlef9NdFe6JC4mEgZb/mhMJpfNVudDTA==}
dependencies:
'@node-rs/argon2': 1.7.0
'@node-rs/bcrypt': 1.9.0
@ -6203,8 +6211,8 @@ packages:
engines: {node: '>= 0.8.0'}
dev: true
/prettier-plugin-svelte@3.1.2(prettier@3.2.5)(svelte@4.2.10):
resolution: {integrity: sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA==}
/prettier-plugin-svelte@3.2.0(prettier@3.2.5)(svelte@4.2.10):
resolution: {integrity: sha512-3474Zxxw8z4k64aqZmwTfcGdh/ULM2zNQslORdXEkNjKqqsSxBmiASazoxdCrmaqsbKD2Y0rxKhBEn1u0Y+j9g==}
peerDependencies:
prettier: ^3.0.0
svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0
@ -7079,8 +7087,8 @@ packages:
/tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
/tsx@4.7.0:
resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==}
/tsx@4.7.1:
resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==}
engines: {node: '>=18.0.0'}
hasBin: true
dependencies:

View file

@ -1,5 +1,5 @@
import { relations, sql, type InferSelectModel } from 'drizzle-orm';
import { pgTable, timestamp, varchar, boolean, integer, text, index } from 'drizzle-orm/pg-core';
import { pgTable, timestamp, varchar, boolean, integer, text, index, pgEnum } from 'drizzle-orm/pg-core';
import { nanoid } from 'nanoid';
import { tsvector } from './tsVector';
@ -140,7 +140,6 @@ export const games = pgTable('games', {
length: 255
}),
text_searchable_index: tsvector('text_searchable_index'),
external_id: integer('external_id').unique(),
last_sync_at: timestamp('last_sync_at', {
withTimezone: true,
mode: 'date',
@ -169,9 +168,41 @@ export const gameRelations = relations(games, ({ many }) => ({
mechanics_to_games: many(mechanics_to_games),
designers_to_games: many(designers_to_games),
publishers_to_games: many(publishers_to_games),
artists_to_games: many(artists_to_games)
artists_to_games: many(artists_to_games),
gameExternalIds: many(gameExternalIds),
}));
export const externalIdType = pgEnum('external_id_type', [
'game', 'category', 'mechanic', 'publisher', 'designer', 'artist'
]);
export const externalIds = pgTable('external_ids', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
type: varchar('type', {
length: 255
}).notNull(),
externalId: varchar('external_id', {
length: 255
}).notNull()
});
export const gamesToExternalIds = pgTable('games_to_external_ids', {
gameId: varchar('game_id', {
length: 255
})
.notNull()
.references(() => games.id, { onDelete: 'cascade' }),
externalId: varchar('external_id', {
length: 255
})
.notNull()
.references(() => externalIds.id, { onDelete: 'cascade' }),
});
export const expansions = pgTable('expansions', {
id: varchar('id', {
length: 255