mirror of
https://github.com/BradNut/boredgame
synced 2025-09-08 17:40:22 +00:00
51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
import { createId as cuid2 } from '@paralleldrive/cuid2'
|
|
import { type InferSelectModel, relations, sql } from 'drizzle-orm'
|
|
import { index, integer, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core'
|
|
import { timestamps } from '../../common/utils/table'
|
|
import { categories_to_games_table } from './categoriesToGames.table'
|
|
import { gamesToExternalIdsTable } from './gamesToExternalIds.table'
|
|
import { mechanics_to_games } from './mechanicsToGames.table'
|
|
import { publishers_to_games } from './publishersToGames.table'
|
|
|
|
export const gamesTable = pgTable(
|
|
'games',
|
|
{
|
|
id: uuid('id').primaryKey().defaultRandom(),
|
|
cuid: text('cuid')
|
|
.unique()
|
|
.$defaultFn(() => cuid2()),
|
|
name: text('name').notNull(),
|
|
slug: text('slug').notNull(),
|
|
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: text('image_url'),
|
|
thumb_url: text('thumb_url'),
|
|
url: text('url'),
|
|
last_sync_at: timestamp('last_sync_at'),
|
|
...timestamps,
|
|
},
|
|
(table) => ({
|
|
searchIndex: index('search_index').using(
|
|
'gin',
|
|
sql`(
|
|
setweight(to_tsvector('english', ${table.name}), 'A') ||
|
|
setweight(to_tsvector('english', ${table.slug}), 'B')
|
|
)`,
|
|
),
|
|
}),
|
|
)
|
|
|
|
export const gameRelations = relations(gamesTable, ({ many }) => ({
|
|
categories_to_games: many(categories_to_games_table),
|
|
mechanics_to_games: many(mechanics_to_games),
|
|
publishers_to_games: many(publishers_to_games),
|
|
gamesToExternalIds: many(gamesToExternalIdsTable),
|
|
}))
|
|
|
|
export type Games = InferSelectModel<typeof gamesTable>
|