Files
www/src/server/db/schema.ts

223 lines
6.8 KiB
TypeScript

import { relations, sql } from 'drizzle-orm'
import {
boolean,
index,
integer,
json,
pgTable,
primaryKey,
real,
text,
timestamp,
uniqueIndex,
varchar,
} from 'drizzle-orm/pg-core'
import type { AdapterAccount } from 'next-auth/adapters'
export const raw_history = pgTable(
'raw_history',
{
id: integer('id').primaryKey().generatedByDefaultAsIdentity(),
game_num: integer('game_num').notNull(),
entry: json(),
},
(t) => [uniqueIndex('game_num_unique_idx').on(t.game_num)]
)
export const metadata = pgTable('metadata', {
key: text('key').primaryKey().notNull(),
value: text('value').notNull(),
})
export const player_games = pgTable(
'player_games',
{
playerId: text('player_id').notNull(),
playerName: text('player_name').notNull(),
gameId: integer('game_id').notNull(),
gameTime: timestamp('game_time').notNull(),
gameType: text('game_type').notNull(),
gameNum: integer('game_num').notNull(),
playerMmr: real('player_mmr').notNull(),
mmrChange: real('mmr_change').notNull(),
opponentId: text('opponent_id').notNull(),
opponentName: text('opponent_name').notNull(),
opponentMmr: real('opponent_mmr').notNull(),
result: text('result').notNull(),
},
(t) => [
primaryKey({ columns: [t.playerId, t.gameNum] }),
uniqueIndex('game_num_per_player_idx').on(t.playerId, t.gameNum),
]
)
export const users = pgTable('user', (d) => ({
id: d
.varchar({ length: 255 })
.notNull()
.primaryKey()
.$defaultFn(() => crypto.randomUUID()),
name: d.varchar({ length: 255 }),
email: d.varchar({ length: 255 }).notNull(),
emailVerified: d
.timestamp({
mode: 'date',
withTimezone: true,
})
.default(sql`CURRENT_TIMESTAMP`),
image: d.varchar({ length: 255 }),
discord_id: d.varchar({ length: 255 }),
twitch_url: d.varchar({ length: 255 }),
youtube_url: d.varchar({ length: 255 }),
role: d.varchar({ length: 255 }).notNull().default('user'),
}))
export const usersRelations = relations(users, ({ many }) => ({
accounts: many(accounts),
}))
export const accounts = pgTable(
'account',
(d) => ({
userId: d
.varchar({ length: 255 })
.notNull()
.references(() => users.id),
type: d.varchar({ length: 255 }).$type<AdapterAccount['type']>().notNull(),
provider: d.varchar({ length: 255 }).notNull(),
providerAccountId: d.varchar({ length: 255 }).notNull(),
refresh_token: d.text(),
access_token: d.text(),
expires_at: d.integer(),
token_type: d.varchar({ length: 255 }),
scope: d.varchar({ length: 255 }),
id_token: d.text(),
session_state: d.varchar({ length: 255 }),
}),
(t) => [
primaryKey({ columns: [t.provider, t.providerAccountId] }),
index('account_user_id_idx').on(t.userId),
]
)
export const accountsRelations = relations(accounts, ({ one }) => ({
user: one(users, { fields: [accounts.userId], references: [users.id] }),
}))
export const sessions = pgTable(
'session',
(d) => ({
sessionToken: d.varchar({ length: 255 }).notNull().primaryKey(),
userId: d
.varchar({ length: 255 })
.notNull()
.references(() => users.id),
expires: d.timestamp({ mode: 'date', withTimezone: true }).notNull(),
}),
(t) => [index('t_user_id_idx').on(t.userId)]
)
export const sessionsRelations = relations(sessions, ({ one }) => ({
user: one(users, { fields: [sessions.userId], references: [users.id] }),
}))
export const verificationTokens = pgTable(
'verification_token',
(d) => ({
identifier: d.varchar({ length: 255 }).notNull(),
token: d.varchar({ length: 255 }).notNull(),
expires: d.timestamp({ mode: 'date', withTimezone: true }).notNull(),
}),
(t) => [primaryKey({ columns: [t.identifier, t.token] })]
)
export const branches = pgTable('mod_branches', {
id: integer('id').primaryKey().generatedByDefaultAsIdentity(),
name: text('name').notNull().unique(),
description: text('description'),
createdAt: timestamp('created_at').notNull().defaultNow(),
})
export const releases = pgTable('mod_release', {
id: integer('id').primaryKey().generatedByDefaultAsIdentity(),
name: text('name').notNull(),
description: text('description'),
version: text('version').notNull(),
url: text('url').notNull(),
smods_version: text('smods_version').default('latest'),
lovely_version: text('lovely_version').default('latest'),
branchId: integer('branch_id')
.references(() => branches.id)
.notNull()
.default(1),
createdAt: timestamp('created_at').notNull().defaultNow(),
updatedAt: timestamp('updated_at')
.notNull()
.defaultNow()
.$onUpdate(() => new Date()),
})
export const branchesRelations = relations(branches, ({ many }) => ({
releases: many(releases),
}))
export const releasesRelations = relations(releases, ({ one }) => ({
branch: one(branches, {
fields: [releases.branchId],
references: [branches.id],
}),
}))
export const logFiles = pgTable('log_files', {
id: integer('id').primaryKey().generatedByDefaultAsIdentity(),
userId: text('user_id').references(() => users.id),
fileName: text('file_name').notNull(),
fileUrl: text('file_url').notNull(),
parsedJson: json('parsed_json').notNull(),
createdAt: timestamp('created_at').notNull().defaultNow(),
})
export const logFilesRelations = relations(logFiles, ({ one }) => ({
user: one(users, {
fields: [logFiles.userId],
references: [users.id],
}),
}))
export const leaderboardSnapshots = pgTable('leaderboard_snapshots', {
id: integer('id').primaryKey().generatedByDefaultAsIdentity(),
channelId: text('channel_id').notNull(),
timestamp: timestamp('timestamp').notNull().defaultNow(),
data: json('data').notNull(),
createdAt: timestamp('created_at').notNull().defaultNow(),
})
export const leaderboardSnapshotsRelations = relations(leaderboardSnapshots, ({}) => ({}))
export const transcripts = pgTable('transcripts', {
id: integer('id').primaryKey().generatedByDefaultAsIdentity(),
gameNumber: integer('game_number').notNull().unique(),
content: text('content').notNull(),
createdAt: timestamp('created_at').notNull().defaultNow(),
})
export const blogPosts = pgTable('blog_posts', {
id: integer('id').primaryKey().generatedByDefaultAsIdentity(),
title: varchar('title', { length: 255 }).notNull(),
slug: varchar('slug', { length: 255 }).notNull().unique(),
content: text('content').notNull(),
excerpt: text('excerpt'),
published: boolean('published').notNull().default(false),
authorId: varchar('author_id', { length: 255 }).references(() => users.id).notNull(),
createdAt: timestamp('created_at').notNull().defaultNow(),
updatedAt: timestamp('updated_at')
.notNull()
.defaultNow()
.$onUpdate(() => new Date()),
})
export const blogPostsRelations = relations(blogPosts, ({ one }) => ({
author: one(users, {
fields: [blogPosts.authorId],
references: [users.id],
}),
}))