mirror of
https://github.com/ershisan99/www.git
synced 2025-12-17 05:19:23 +00:00
223 lines
6.8 KiB
TypeScript
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],
|
|
}),
|
|
}))
|