liljudd-website/src/drizzle/schema.ts
aronmal 3c404ab5fa
refactor: Update time planning feature
- Update checksums for browser compatibility
- Add script to kill running server process
- Refactor time planning structure and handling
- Adjust database schema and type definitions accordingly
2024-03-15 10:59:41 +01:00

100 lines
3 KiB
TypeScript

import { relations } from "drizzle-orm";
import {
bigint,
boolean,
pgTable,
primaryKey,
serial,
smallint,
text,
timestamp,
varchar,
} from "drizzle-orm/pg-core";
export const users = pgTable("user", {
id: varchar("id", { length: 24 }).primaryKey(),
discord_id: text("discord_id").notNull(),
name: text("name"),
image: text("image"),
});
export const sessions = pgTable("session", {
id: varchar("id", { length: 24 }).primaryKey(),
userId: varchar("user_id", { length: 24 })
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
expiresAt: timestamp("expires_at", {
withTimezone: true,
mode: "date",
}).notNull(),
});
export const discordTokens = pgTable("tokens", {
userId: varchar("user_id", { length: 24 })
.primaryKey()
.references(() => users.id, { onDelete: "cascade" }),
refreshToken: text("refresh_token").notNull(),
accessToken: text("access_token").notNull(),
expiresAt: timestamp("expires_at", { mode: "date" }).notNull(),
});
export const guilds = pgTable("guilds", {
id: bigint("id", { mode: "bigint" }).primaryKey(),
timezone: text("timezone").notNull().default("Etc/UTC"),
tpChannelId: bigint("tp_channel_id", { mode: "bigint" }),
tpInterval: smallint("target_interval").notNull().default(64),
tpRolesEnabled: boolean("tp_roles_enabled").notNull().default(false),
isAvailableRoleId: bigint("is_available_role_id", { mode: "bigint" }),
wantsToBeNotifieRoledId: bigint("wants_to_be_notified_role_id", {
mode: "bigint",
}),
});
export const guildsRelations = relations(guilds, ({ many }) => ({
tpMessages: many(tpMessages),
matches: many(matches),
}));
export const tpMessages = pgTable(
"tp_messages",
{
messageId: bigint("message_id", { mode: "bigint" }),
day: smallint("day").notNull(),
guildId: bigint("guild_id", { mode: "bigint" })
.notNull()
.references(() => guilds.id, { onDelete: "cascade" }),
},
(table) => {
return {
pk: primaryKey({ columns: [table.guildId, table.day] }),
};
},
);
export const tpMessagesRelations = relations(tpMessages, ({ one }) => ({
guild: one(guilds, {
fields: [tpMessages.guildId],
references: [guilds.id],
}),
}));
export const matches = pgTable("matches", {
id: serial("id").primaryKey(),
channelId: bigint("channel_id", { mode: "bigint" }).notNull(),
matchType: varchar("match_type", { length: 50 }).notNull(),
createrId: bigint("creater_id", { mode: "bigint" }).notNull(),
roleId: bigint("role_id", { mode: "bigint" }).notNull(),
opponentName: varchar("opponent_name", { length: 100 }).notNull(),
messageId: bigint("message_id", { mode: "bigint" }).notNull(),
utc_ts: timestamp("utc_ts").notNull(),
guildId: bigint("guild_id", { mode: "bigint" })
.notNull()
.references(() => guilds.id, { onDelete: "cascade" }),
});
export const matchPlanningsRelations = relations(matches, ({ one }) => ({
guild: one(guilds, {
fields: [matches.guildId],
references: [guilds.id],
}),
}));