1// Example model schema from the Drizzle docs
2// https://orm.drizzle.team/docs/sql-schema-declaration
3
4import { sql } from "drizzle-orm";
5import { index, mysqlTableCreator } from "drizzle-orm/mysql-core";
6
7/**
8 * This is an example of how to use the multi-project schema feature of Drizzle ORM. Use the same
9 * database instance for multiple projects.
10 *
11 * @see https://orm.drizzle.team/docs/goodies#multi-project-schema
12 */
13export const createTable = mysqlTableCreator((name) => `ricochet_${name}`);
14
15export const users = createTable("users", (d) => ({
16 id: d.bigint({ mode: "number" }).primaryKey().autoincrement(),
17 username: d.varchar({ length: 256 }).notNull(),
18 email: d.varchar({ length: 256 }).notNull(),
19 createdAt: d
20 .timestamp()
21 .default(sql`CURRENT_TIMESTAMP`)
22 .notNull(),
23 updatedAt: d.timestamp().onUpdateNow(),
24}));
25
26export const pendingUsers = createTable("pending_users", (d) => ({
27 id: d.bigint({ mode: "number" }).primaryKey().autoincrement(),
28 username: d.varchar({ length: 256 }).notNull(),
29 email: d.varchar({ length: 256 }).notNull(),
30 token: d.varchar({ length: 64 }).notNull(),
31 createdAt: d
32 .timestamp()
33 .default(sql`CURRENT_TIMESTAMP`)
34 .notNull(),
35 updatedAt: d.timestamp().onUpdateNow(),
36}));
37
38export const userVerificationCode = createTable(
39 "user_verification_codes",
40 (d) => ({
41 id: d.bigint({ mode: "number" }).primaryKey().autoincrement(),
42 token: d.varchar({ length: 256 }).notNull(),
43 userId: d
44 .bigint({ mode: "number" })
45 .notNull()
46 .references(() => users.id, { onDelete: "cascade" }),
47 used: d.boolean(),
48 createdAt: d
49 .timestamp()
50 .default(sql`CURRENT_TIMESTAMP`)
51 .notNull(),
52 updatedAt: d.timestamp().onUpdateNow(),
53 }),
54);
55
56export const sessions = createTable("sessions", (d) => ({
57 id: d.bigint({ mode: "number" }).primaryKey().autoincrement(),
58 token: d.varchar({ length: 256 }).notNull(),
59 userId: d
60 .bigint({ mode: "number" })
61 .notNull()
62 .references(() => users.id, { onDelete: "cascade" }),
63 createdAt: d
64 .timestamp()
65 .default(sql`CURRENT_TIMESTAMP`)
66 .notNull(),
67}));
68
69export const gameStates = ["lobby", "ingame", "ended"] as const;
70export type GameState = (typeof gameStates)[number];
71
72export const games = createTable("games", (d) => ({
73 id: d.bigint({ mode: "number" }).primaryKey().autoincrement(),
74 name: d.varchar({ length: 256 }).notNull(),
75 code: d.varchar({ length: 64 }).notNull(),
76 password: d.varchar({ length: 256 }),
77 state: d.mysqlEnum("state", gameStates).notNull().default("lobby"),
78 ownerId: d
79 .bigint({ mode: "number" })
80 .notNull()
81 .references(() => users.id, { onDelete: "cascade" }),
82 winnerId: d
83 .bigint({ mode: "number" })
84 .references(() => users.id, { onDelete: "cascade" }),
85 createdAt: d
86 .timestamp()
87 .default(sql`CURRENT_TIMESTAMP`)
88 .notNull(),
89 updatedAt: d.timestamp().onUpdateNow(),
90}));
91
92export const gameUsers = createTable("game_users", (d) => ({
93 id: d.bigint({ mode: "number" }).primaryKey().autoincrement(),
94 gameId: d
95 .bigint({ mode: "number" })
96 .notNull()
97 .references(() => games.id, { onDelete: "cascade" }),
98 userId: d
99 .bigint({ mode: "number" })
100 .notNull()
101 .references(() => users.id, { onDelete: "cascade" }),
102 createdAt: d
103 .timestamp()
104 .default(sql`CURRENT_TIMESTAMP`)
105 .notNull(),
106 updatedAt: d.timestamp().onUpdateNow(),
107}));