A realtime multiplayer version of the boardgame Ricochet Robots
at master 3.4 kB view raw
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}));