Update dependencies, custom tsVector type for drizzle, and adding vector column on game for name and slug, and adding index on the search vector column.

This commit is contained in:
Bradley Shellnut 2024-02-09 17:01:54 -08:00
parent baafd75839
commit eac53a993b
11 changed files with 2879 additions and 687 deletions

View file

@ -0,0 +1,27 @@
ALTER TABLE "artists" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "artists" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "categories" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "categories" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "collection_items" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "collection_items" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "collections" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "collections" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "designers" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "designers" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "expansions" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "expansions" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "games" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "games" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "mechanics" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "mechanics" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "publishers" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "publishers" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "user_roles" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "user_roles" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "users" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "users" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "wishlist_items" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "wishlist_items" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "wishlists" ALTER COLUMN "created_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "wishlists" ALTER COLUMN "updated_at" SET DEFAULT now();--> statement-breakpoint
ALTER TABLE "games" ADD COLUMN "text_searchable_index" "tsvector";

View file

@ -0,0 +1 @@
CREATE INDEX IF NOT EXISTS "text_searchable_idx" ON "games" ("text_searchable_index");

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -15,6 +15,20 @@
"when": 1707438055782,
"tag": "0001_giant_tomorrow_man",
"breakpoints": true
},
{
"idx": 2,
"version": "5",
"when": 1707524139123,
"tag": "0002_sour_silverclaw",
"breakpoints": true
},
{
"idx": 3,
"version": "5",
"when": 1707526808124,
"tag": "0003_thick_tinkerer",
"breakpoints": true
}
]
}

View file

@ -34,7 +34,7 @@
"@sveltejs/kit": "^2.5.0",
"@sveltejs/vite-plugin-svelte": "^3.0.2",
"@types/cookie": "^0.6.0",
"@types/node": "^20.11.16",
"@types/node": "^20.11.17",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"autoprefixer": "^10.4.17",
@ -47,11 +47,11 @@
"just-debounce-it": "^3.2.0",
"postcss": "^8.4.35",
"postcss-import": "^16.0.0",
"postcss-load-config": "^5.0.2",
"postcss-load-config": "^5.0.3",
"postcss-preset-env": "^9.3.0",
"prettier": "^3.2.5",
"prettier-plugin-svelte": "^3.1.2",
"prisma": "^5.8.1",
"prisma": "^5.9.1",
"sass": "^1.70.0",
"satori": "^0.10.13",
"satori-html": "^0.3.2",
@ -67,7 +67,7 @@
"tslib": "^2.6.1",
"tsx": "^4.7.0",
"typescript": "^5.3.3",
"vite": "^5.0.12",
"vite": "^5.1.1",
"vitest": "^1.2.2",
"zod": "^3.22.4"
},
@ -85,8 +85,8 @@
"@lukeed/uuid": "^2.0.1",
"@neondatabase/serverless": "^0.8.1",
"@paralleldrive/cuid2": "^2.2.2",
"@planetscale/database": "^1.15.0",
"@prisma/client": "^5.8.1",
"@planetscale/database": "^1.16.0",
"@prisma/client": "^5.9.1",
"@sentry/sveltekit": "^7.100.1",
"@sveltejs/adapter-vercel": "^5.1.0",
"@types/feather-icons": "^4.29.4",

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,5 @@
<script lang="ts">
export let kind = 'primary';
export let size;
export let icon = false;
export let disabled = false;
</script>
@ -27,18 +26,4 @@
min-width: 23.5rem;
}
}
.danger {
background-color: var(--warning);
}
.danger:hover {
background-color: var(--warning-hover);
}
.btn-icon {
display: grid;
grid-template-columns: repeat(2, auto);
gap: 1rem;
}
</style>

View file

@ -1,7 +1,7 @@
import 'dotenv/config';
import postgres from 'postgres';
import { drizzle } from 'drizzle-orm/postgres-js';
import { migrate } from 'drizzle-orm/postgres-js/migrator';
import postgres from 'postgres';
const connection = postgres({
host: process.env.DATABASE_HOST,

View file

@ -1,38 +1,40 @@
import { relations, sql, type InferSelectModel } from 'drizzle-orm';
import { pgTable, timestamp, varchar, boolean, integer, text } from 'drizzle-orm/pg-core';
import { pgTable, timestamp, varchar, boolean, integer, text, index } from 'drizzle-orm/pg-core';
import { nanoid } from 'nanoid';
import { tsvector } from './tsVector';
export const users = pgTable("users", {
id: varchar("id", {
export const users = pgTable('users', {
id: varchar('id', {
length: 255
}).primaryKey()
})
.primaryKey()
.$defaultFn(() => nanoid()),
username: varchar("username", {
username: varchar('username', {
length: 255
}).unique(),
hashed_password: varchar("hashed_password", {
hashed_password: varchar('hashed_password', {
length: 255
}),
email: varchar("email", {
email: varchar('email', {
length: 255
}).unique(),
first_name: varchar("first_name", {
first_name: varchar('first_name', {
length: 255
}),
last_name: varchar("last_name", {
last_name: varchar('last_name', {
length: 255
}),
verified: boolean("verified").default(false),
receive_email: boolean("receive_email").default(false),
theme: varchar("theme", {
verified: boolean('verified').default(false),
receive_email: boolean('receive_email').default(false),
theme: varchar('theme', {
length: 255
}).default("system"),
created_at: timestamp("created_at").default(sql`(now())`),
updated_at: timestamp("updated_at").default(sql`(now())`)
}).default('system'),
created_at: timestamp('created_at').default(sql`now()`),
updated_at: timestamp('updated_at').default(sql`now()`)
});
export const user_relations = relations(users, ({ many }) => ({
user_roles: many(user_roles)
user_roles: many(user_roles)
}));
export type Users = InferSelectModel<typeof users>;
@ -48,7 +50,7 @@ export const sessions = pgTable('sessions', {
.references(() => users.id),
expiresAt: timestamp('expires_at', {
withTimezone: true,
mode: "date"
mode: 'date'
}).notNull(),
ipCountry: varchar('ip_country', {
length: 255
@ -58,243 +60,255 @@ export const sessions = pgTable('sessions', {
})
});
export const roles = pgTable("roles", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
name: varchar("name", {
length: 255
}).unique()
export const roles = pgTable('roles', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
name: varchar('name', {
length: 255
}).unique()
});
export const user_roles = pgTable("user_roles", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
user_id: varchar("user_id", {
length: 255
})
.notNull()
.references(() => users.id, { onDelete: 'cascade' }),
role_id: varchar("role_id", {
length: 255
})
.notNull()
.references(() => roles.id, { onDelete: 'cascade' }),
created_at: timestamp("created_at", {
export const user_roles = pgTable('user_roles', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
user_id: varchar('user_id', {
length: 255
})
.notNull()
.references(() => users.id, { onDelete: 'cascade' }),
role_id: varchar('role_id', {
length: 255
})
.notNull()
.references(() => roles.id, { onDelete: 'cascade' }),
created_at: timestamp('created_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`),
updated_at: timestamp("updated_at", {
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
mode: 'date',
precision: 6
}).default(sql`now()`)
});
export const user_role_relations = relations(user_roles, ({ one }) => ({
role: one(roles, {
fields: [user_roles.role_id],
references: [roles.id]
}),
user: one(users, {
fields: [user_roles.user_id],
references: [users.id]
})
}),
user: one(users, {
fields: [user_roles.user_id],
references: [users.id]
})
}));
export const games = pgTable("games", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
name: varchar("name", {
length: 255
}),
slug: varchar("slug", {
length: 255
}),
description: text("description"),
year_published: integer("year_published"),
min_players: integer("min_players"),
max_players: integer("max_players"),
playtime: integer("playtime"),
min_playtime: integer("min_playtime"),
max_playtime: integer("max_playtime"),
min_age: integer("min_age"),
image_url: varchar("image_url", {
length: 255
}),
thumb_url: varchar("thumb_url", {
length: 255
}),
url: varchar("url", {
length: 255
}),
external_id: integer("external_id").unique(),
last_sync_at: timestamp("last_sync_at", {
withTimezone: true,
mode: "date",
precision: 6
export const games = pgTable('games', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
name: varchar('name', {
length: 255
}),
created_at: timestamp("created_at", {
slug: varchar('slug', {
length: 255
}),
description: text('description'),
year_published: integer('year_published'),
min_players: integer('min_players'),
max_players: integer('max_players'),
playtime: integer('playtime'),
min_playtime: integer('min_playtime'),
max_playtime: integer('max_playtime'),
min_age: integer('min_age'),
image_url: varchar('image_url', {
length: 255
}),
thumb_url: varchar('thumb_url', {
length: 255
}),
url: varchar('url', {
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",
precision: 6
}).default(sql`(now())`),
updated_at: timestamp("updated_at", {
mode: 'date',
precision: 6
}),
created_at: timestamp('created_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: 'date',
precision: 6
}).default(sql`now()`)
}, (table) => {
return {
text_searchable_idx: index("text_searchable_idx").on(table.text_searchable_index).using(sql`'gin'`)
}
});
export type Games = InferSelectModel<typeof games>;
export const gameRelations = relations(games, ({ many }) => ({
categories_to_games: many(categories_to_games),
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),
}))
export const expansions = pgTable("expansions", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
base_game_id: varchar("base_game_id", {
length: 255
})
.notNull()
.references(() => games.id, { onDelete: 'cascade' }),
game_id: varchar("game_id", {
length: 255
})
.notNull()
.references(() => games.id, { onDelete: 'cascade' }),
created_at: timestamp("created_at", {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`),
updated_at: timestamp("updated_at", {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
})
export const expansion_relations = relations(expansions, ({ one }) => ({
baseGame: one(games, {
fields: [expansions.base_game_id],
references: [games.id]
}),
game: one(games, {
fields: [expansions.game_id],
references: [games.id]
})
categories_to_games: many(categories_to_games),
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)
}));
export const collections = pgTable("collections", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
user_id: varchar("user_id", {
length: 255
})
.notNull()
.references(() => users.id, { onDelete: 'cascade' }),
created_at: timestamp("created_at", {
export const expansions = pgTable('expansions', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
base_game_id: varchar('base_game_id', {
length: 255
})
.notNull()
.references(() => games.id, { onDelete: 'cascade' }),
game_id: varchar('game_id', {
length: 255
})
.notNull()
.references(() => games.id, { onDelete: 'cascade' }),
created_at: timestamp('created_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`),
updated_at: timestamp("updated_at", {
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
mode: 'date',
precision: 6
}).default(sql`now()`)
});
export const expansion_relations = relations(expansions, ({ one }) => ({
baseGame: one(games, {
fields: [expansions.base_game_id],
references: [games.id]
}),
game: one(games, {
fields: [expansions.game_id],
references: [games.id]
})
}));
export const collections = pgTable('collections', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
user_id: varchar('user_id', {
length: 255
})
.notNull()
.references(() => users.id, { onDelete: 'cascade' }),
created_at: timestamp('created_at', {
withTimezone: true,
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: 'date',
precision: 6
}).default(sql`now()`)
});
export const collection_relations = relations(collections, ({ one }) => ({
user: one(users, {
fields: [collections.user_id],
references: [users.id]
}),
}))
export const collection_items = pgTable("collection_items", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
collection_id: varchar("collection_id", {
length: 255
})
.notNull()
.references(() => collections.id, { onDelete: 'cascade' }),
game_id: varchar("game_id", {
length: 255
})
.notNull()
.references(() => games.id, { onDelete: 'cascade' }),
created_at: timestamp("created_at", {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`),
updated_at: timestamp("updated_at", {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
});
export const collection_item_relations = relations(collection_items, ({ one }) =>({
collection: one(collections, {
fields: [collection_items.collection_id],
references: [collections.id]
}),
game: one(games, {
fields: [collection_items.game_id],
references: [games.id]
})
user: one(users, {
fields: [collections.user_id],
references: [users.id]
})
}));
export const wishlists = pgTable("wishlists", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
user_id: varchar("user_id", {
length: 255
})
.notNull()
.references(() => users.id, { onDelete: 'cascade' }),
created_at: timestamp("created_at", {
export const collection_items = pgTable('collection_items', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
collection_id: varchar('collection_id', {
length: 255
})
.notNull()
.references(() => collections.id, { onDelete: 'cascade' }),
game_id: varchar('game_id', {
length: 255
})
.notNull()
.references(() => games.id, { onDelete: 'cascade' }),
created_at: timestamp('created_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`),
updated_at: timestamp("updated_at", {
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
mode: 'date',
precision: 6
}).default(sql`now()`)
});
export const collection_item_relations = relations(collection_items, ({ one }) => ({
collection: one(collections, {
fields: [collection_items.collection_id],
references: [collections.id]
}),
game: one(games, {
fields: [collection_items.game_id],
references: [games.id]
})
}));
export const wishlists = pgTable('wishlists', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
user_id: varchar('user_id', {
length: 255
})
.notNull()
.references(() => users.id, { onDelete: 'cascade' }),
created_at: timestamp('created_at', {
withTimezone: true,
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: 'date',
precision: 6
}).default(sql`now()`)
});
export const wishlists_relations = relations(wishlists, ({ one }) => ({
user: one(users, {
fields: [wishlists.user_id],
references: [users.id]
}),
}))
user: one(users, {
fields: [wishlists.user_id],
references: [users.id]
})
}));
export const wishlist_items = pgTable('wishlist_items', {
id: varchar('id', {
@ -314,161 +328,166 @@ export const wishlist_items = pgTable('wishlist_items', {
.references(() => games.id, { onDelete: 'cascade' }),
created_at: timestamp('created_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`),
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
mode: 'date',
precision: 6
}).default(sql`now()`)
});
export const wishlist_item_relations = relations(wishlist_items, ({ one }) => ({
wishlist: one(wishlists, {
fields: [wishlist_items.wishlist_id],
references: [wishlists.id]
}),
game: one(games, {
fields: [wishlist_items.game_id],
references: [games.id]
})
}))
wishlist: one(wishlists, {
fields: [wishlist_items.wishlist_id],
references: [wishlists.id]
}),
game: one(games, {
fields: [wishlist_items.game_id],
references: [games.id]
})
}));
export const publishers = pgTable("publishers", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
name: varchar("name", {
length: 255
}),
slug: varchar("slug", {
length: 255
}),
external_id: integer("external_id"),
created_at: timestamp("created_at", {
export const publishers = pgTable('publishers', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
name: varchar('name', {
length: 255
}),
slug: varchar('slug', {
length: 255
}),
external_id: integer('external_id'),
created_at: timestamp('created_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`),
updated_at: timestamp("updated_at", {
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
mode: 'date',
precision: 6
}).default(sql`now()`)
});
export const publishers_relations = relations(publishers, ({ many }) => ({
publishers_to_games: many(publishers_to_games)
publishers_to_games: many(publishers_to_games)
}));
export const categories = pgTable("categories", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
name: varchar("name", {
length: 255
}),
slug: varchar("slug", {
length: 255
}),
external_id: integer("external_id"),
created_at: timestamp("created_at", {
export const categories = pgTable('categories', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
name: varchar('name', {
length: 255
}),
slug: varchar('slug', {
length: 255
}),
external_id: integer('external_id'),
created_at: timestamp('created_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`),
updated_at: timestamp("updated_at", {
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
mode: 'date',
precision: 6
}).default(sql`now()`)
});
export const categories_relations = relations(categories, ({ many }) => ({
categories_to_games: many(categories_to_games)
categories_to_games: many(categories_to_games)
}));
export const mechanics = pgTable("mechanics", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
name: varchar("name", {
length: 255
}),
slug: varchar("slug", {
length: 255
}),
external_id: integer("external_id"),
created_at: timestamp("created_at", {
export const mechanics = pgTable('mechanics', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
name: varchar('name', {
length: 255
}),
slug: varchar('slug', {
length: 255
}),
external_id: integer('external_id'),
created_at: timestamp('created_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`),
updated_at: timestamp("updated_at", {
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
mode: 'date',
precision: 6
}).default(sql`now()`)
});
export const mechanic_relations = relations(mechanics, ({ many }) => ({
mechanics_to_games: many(mechanics_to_games)
}))
mechanics_to_games: many(mechanics_to_games)
}));
export const designers = pgTable("designers", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
name: varchar("name", {
length: 255
}),
slug: varchar("slug", {
length: 255
}),
external_id: integer("external_id"),
created_at: timestamp("created_at", {
export const designers = pgTable('designers', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
name: varchar('name', {
length: 255
}),
slug: varchar('slug', {
length: 255
}),
external_id: integer('external_id'),
created_at: timestamp('created_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`),
updated_at: timestamp("updated_at", {
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
mode: 'date',
precision: 6
}).default(sql`now()`)
});
export const designers_relations = relations(designers, ({ many }) => ({
designers_to_games: many(designers_to_games)
designers_to_games: many(designers_to_games)
}));
export const artists = pgTable("artists", {
id: varchar("id", {
length: 255
}).primaryKey()
.$defaultFn(() => nanoid()),
name: varchar("name", {
length: 255
}),
slug: varchar("slug", {
length: 255
}),
external_id: integer("external_id"),
created_at: timestamp("created_at", {
export const artists = pgTable('artists', {
id: varchar('id', {
length: 255
})
.primaryKey()
.$defaultFn(() => nanoid()),
name: varchar('name', {
length: 255
}),
slug: varchar('slug', {
length: 255
}),
external_id: integer('external_id'),
created_at: timestamp('created_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`),
updated_at: timestamp("updated_at", {
mode: 'date',
precision: 6
}).default(sql`now()`),
updated_at: timestamp('updated_at', {
withTimezone: true,
mode: "date",
precision: 6
}).default(sql`(now())`)
mode: 'date',
precision: 6
}).default(sql`now()`)
});
export const artists_relations = relations(artists, ({ many }) => ({
@ -481,96 +500,96 @@ export const artists_to_games = pgTable('artists_to_games', {
}),
game_id: varchar('game_id', {
length: 255
}),
})
});
export const artists_to_games_relations = relations(artists_to_games, ({ one }) => ({
artist: one(artists, {
fields: [artists_to_games.artist_id],
references: [artists.id]
}),
game: one(games, {
fields: [artists_to_games.game_id],
references: [games.id]
}),
artist: one(artists, {
fields: [artists_to_games.artist_id],
references: [artists.id]
}),
game: one(games, {
fields: [artists_to_games.game_id],
references: [games.id]
})
}));
export const categories_to_games = pgTable("categories_to_games", {
category_id: varchar("category_id", {
length: 255
}),
game_id: varchar("game_id", {
length: 255
}),
export const categories_to_games = pgTable('categories_to_games', {
category_id: varchar('category_id', {
length: 255
}),
game_id: varchar('game_id', {
length: 255
})
});
export const categories_to_games_relations = relations(categories_to_games, ({ one }) => ({
category: one(categories, {
fields: [categories_to_games.category_id],
references: [categories.id]
}),
game: one(games, {
fields: [categories_to_games.game_id],
references: [games.id]
}),
}))
category: one(categories, {
fields: [categories_to_games.category_id],
references: [categories.id]
}),
game: one(games, {
fields: [categories_to_games.game_id],
references: [games.id]
})
}));
export const designers_to_games = pgTable("designers_to_games", {
designer_id: varchar("designer_id", {
length: 255
}),
game_id: varchar("game_id", {
length: 255
}),
export const designers_to_games = pgTable('designers_to_games', {
designer_id: varchar('designer_id', {
length: 255
}),
game_id: varchar('game_id', {
length: 255
})
});
export const designers_to_games_relations = relations(designers_to_games, ({ one }) => ({
designer: one(designers, {
fields: [designers_to_games.designer_id],
references: [designers.id]
}),
game: one(games, {
fields: [designers_to_games.game_id],
references: [games.id]
}),
}))
designer: one(designers, {
fields: [designers_to_games.designer_id],
references: [designers.id]
}),
game: one(games, {
fields: [designers_to_games.game_id],
references: [games.id]
})
}));
export const mechanics_to_games = pgTable("mechanics_to_games", {
mechanic_id: varchar("mechanic_id", {
length: 255
}),
game_id: varchar("game_id", {
length: 255
}),
export const mechanics_to_games = pgTable('mechanics_to_games', {
mechanic_id: varchar('mechanic_id', {
length: 255
}),
game_id: varchar('game_id', {
length: 255
})
});
export const mechanics_to_games_relations = relations(mechanics_to_games, ({ one }) => ({
mechanic: one(mechanics, {
fields: [mechanics_to_games.mechanic_id],
references: [mechanics.id]
}),
game: one(games, {
fields: [mechanics_to_games.game_id],
references: [games.id]
}),
mechanic: one(mechanics, {
fields: [mechanics_to_games.mechanic_id],
references: [mechanics.id]
}),
game: one(games, {
fields: [mechanics_to_games.game_id],
references: [games.id]
})
}));
export const publishers_to_games = pgTable("publishers_to_games", {
publisher_id: varchar("publisher_id", {
length: 255
}),
game_id: varchar("game_id", {
length: 255
}),
export const publishers_to_games = pgTable('publishers_to_games', {
publisher_id: varchar('publisher_id', {
length: 255
}),
game_id: varchar('game_id', {
length: 255
})
});
export const publishers_to_games_relations = relations(publishers_to_games, ({ one }) => ({
publisher: one(publishers, {
fields: [publishers_to_games.publisher_id],
references: [publishers.id]
}),
game: one(games, {
fields: [publishers_to_games.game_id],
references: [games.id]
}),
publisher: one(publishers, {
fields: [publishers_to_games.publisher_id],
references: [publishers.id]
}),
game: one(games, {
fields: [publishers_to_games.game_id],
references: [games.id]
})
}));

26
src/tsVector.ts Normal file
View file

@ -0,0 +1,26 @@
import { customType } from 'drizzle-orm/pg-core';
function genExpWithWeights(input: string[]) {
const columnExpressions = input.map((column, index) => {
const weight = String.fromCharCode(index + 65);
return `setweight(to_tsvector('english', coalesce(${column}, '')), '${weight}')`;
});
return `tsvector GENERATED ALWAYS AS (${columnExpressions.join(' || ')}) STORED`;
}
export const tsvector = customType<{
data: string;
config: { sources: string[]; weighted: boolean };
}>({
dataType(config) {
if (config) {
const sources = config.sources.join(" || ' ' || ");
return config.weighted
? genExpWithWeights(config.sources)
: `tsvector generated always as (to_tsvector('english', ${sources})) stored`;
} else {
return `tsvector`;
}
}
});