feat(db): add categories table and update channels relations
All checks were successful
Deploy Waveform to VPS / deploy (push) Successful in 1m3s
All checks were successful
Deploy Waveform to VPS / deploy (push) Successful in 1m3s
This commit is contained in:
parent
a6232b0c38
commit
4b9256e570
1 changed files with 48 additions and 58 deletions
106
db/schema.ts
106
db/schema.ts
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @file db/schema.ts
|
* @file db/schema.ts
|
||||||
* @description Database schema definition using Drizzle ORM, containing enums, table definitions, relations, and TypeScript type exports for users, servers, members, channels, messages, conversations, direct messages and friendships.
|
* @description Database schema definition using Drizzle ORM, containing enums, table definitions, relations, and TypeScript type exports for users, servers, members, channels, categories, messages, conversations, direct messages and friendships.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { relations } from "drizzle-orm";
|
import { relations } from "drizzle-orm";
|
||||||
|
|
@ -18,14 +18,10 @@ import {
|
||||||
// Enums
|
// Enums
|
||||||
// ==========================================
|
// ==========================================
|
||||||
|
|
||||||
/**
|
/** Enum representing member access roles within a server. */
|
||||||
* Enum representing member access roles within a server.
|
|
||||||
*/
|
|
||||||
export const roleEnum = pgEnum("role", ["OWNER", "ADMIN", "MEMBER"]);
|
export const roleEnum = pgEnum("role", ["OWNER", "ADMIN", "MEMBER"]);
|
||||||
|
|
||||||
/**
|
/** Enum representing online status of a user. */
|
||||||
* Enum representing online status of a user.
|
|
||||||
*/
|
|
||||||
export const userStatusEnum = pgEnum("user_status", [
|
export const userStatusEnum = pgEnum("user_status", [
|
||||||
"ONLINE",
|
"ONLINE",
|
||||||
"OFFLINE",
|
"OFFLINE",
|
||||||
|
|
@ -33,9 +29,7 @@ export const userStatusEnum = pgEnum("user_status", [
|
||||||
"DND",
|
"DND",
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/**
|
/** Enum representing friendship status between two users. */
|
||||||
* Enum representing friendship status between two users.
|
|
||||||
*/
|
|
||||||
export const friendshipStatusEnum = pgEnum("friendship_status", [
|
export const friendshipStatusEnum = pgEnum("friendship_status", [
|
||||||
"PENDING",
|
"PENDING",
|
||||||
"ACCEPTED",
|
"ACCEPTED",
|
||||||
|
|
@ -46,9 +40,7 @@ export const friendshipStatusEnum = pgEnum("friendship_status", [
|
||||||
// Tables
|
// Tables
|
||||||
// ==========================================
|
// ==========================================
|
||||||
|
|
||||||
/**
|
/** Database table definition for application users. */
|
||||||
* Database table definition for application users.
|
|
||||||
*/
|
|
||||||
export const users = pgTable("users", {
|
export const users = pgTable("users", {
|
||||||
id: uuid("id").primaryKey().defaultRandom(),
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
username: text("username").notNull(),
|
username: text("username").notNull(),
|
||||||
|
|
@ -60,9 +52,7 @@ export const users = pgTable("users", {
|
||||||
createdAt: timestamp("created_at").defaultNow().notNull(),
|
createdAt: timestamp("created_at").defaultNow().notNull(),
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/** Database table definition for chat servers. */
|
||||||
* Database table definition for chat servers.
|
|
||||||
*/
|
|
||||||
export const servers = pgTable("servers", {
|
export const servers = pgTable("servers", {
|
||||||
id: uuid("id").primaryKey().defaultRandom(),
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
name: varchar("name", { length: 32 }).notNull(),
|
name: varchar("name", { length: 32 }).notNull(),
|
||||||
|
|
@ -74,9 +64,7 @@ export const servers = pgTable("servers", {
|
||||||
createdAt: timestamp("created_at").defaultNow().notNull(),
|
createdAt: timestamp("created_at").defaultNow().notNull(),
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/** Database table definition linking users to servers with specific roles. */
|
||||||
* Database table definition linking users to servers with specific roles.
|
|
||||||
*/
|
|
||||||
export const members = pgTable("members", {
|
export const members = pgTable("members", {
|
||||||
id: uuid("id").primaryKey().defaultRandom(),
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
role: roleEnum("role").default("MEMBER").notNull(),
|
role: roleEnum("role").default("MEMBER").notNull(),
|
||||||
|
|
@ -89,22 +77,31 @@ export const members = pgTable("members", {
|
||||||
createdAt: timestamp("created_at").defaultNow().notNull(),
|
createdAt: timestamp("created_at").defaultNow().notNull(),
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/** Database table definition for text channels within servers. */
|
||||||
* Database table definition for text channels within servers.
|
|
||||||
*/
|
|
||||||
export const channels = pgTable("channels", {
|
export const channels = pgTable("channels", {
|
||||||
id: uuid("id").primaryKey().defaultRandom(),
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
name: varchar("name", { length: 32 }).notNull(),
|
name: varchar("name", { length: 32 }).notNull(),
|
||||||
serverId: uuid("server_id")
|
serverId: uuid("server_id")
|
||||||
.references(() => servers.id, { onDelete: "cascade" })
|
.references(() => servers.id, { onDelete: "cascade" })
|
||||||
.notNull(),
|
.notNull(),
|
||||||
|
categoryId: uuid("category_id").references(() => categories.id, {
|
||||||
|
onDelete: "set null",
|
||||||
|
}),
|
||||||
isDefault: boolean("is_default").default(false).notNull(),
|
isDefault: boolean("is_default").default(false).notNull(),
|
||||||
createdAt: timestamp("created_at").defaultNow().notNull(),
|
createdAt: timestamp("created_at").defaultNow().notNull(),
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/** Database table definition for channel categories within servers. */
|
||||||
* Database table definition for chat messages sent within channels by members.
|
export const categories = pgTable("categories", {
|
||||||
*/
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
|
name: varchar("name", { length: 32 }).notNull(),
|
||||||
|
serverId: uuid("server_id")
|
||||||
|
.references(() => servers.id, { onDelete: "cascade" })
|
||||||
|
.notNull(),
|
||||||
|
createdAt: timestamp("created_at").defaultNow().notNull(),
|
||||||
|
});
|
||||||
|
|
||||||
|
/** Database table definition for chat messages sent within channels by members. */
|
||||||
export const messages = pgTable("messages", {
|
export const messages = pgTable("messages", {
|
||||||
id: uuid("id").primaryKey().defaultRandom(),
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
content: text("content").notNull(),
|
content: text("content").notNull(),
|
||||||
|
|
@ -118,9 +115,7 @@ export const messages = pgTable("messages", {
|
||||||
updatedAt: timestamp("updated_at").defaultNow().notNull(),
|
updatedAt: timestamp("updated_at").defaultNow().notNull(),
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/** Database table definition for friendships / friend requests between users. */
|
||||||
* Database table definition for friendships / friend requests between users.
|
|
||||||
*/
|
|
||||||
export const friendships = pgTable("friendships", {
|
export const friendships = pgTable("friendships", {
|
||||||
id: uuid("id").primaryKey().defaultRandom(),
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
status: friendshipStatusEnum("status").default("PENDING").notNull(),
|
status: friendshipStatusEnum("status").default("PENDING").notNull(),
|
||||||
|
|
@ -134,9 +129,7 @@ export const friendships = pgTable("friendships", {
|
||||||
updatedAt: timestamp("updated_at").defaultNow().notNull(),
|
updatedAt: timestamp("updated_at").defaultNow().notNull(),
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/** Database table definition for direct message conversations between two users. */
|
||||||
* Database table definition for direct message conversations between two users.
|
|
||||||
*/
|
|
||||||
export const conversations = pgTable("conversations", {
|
export const conversations = pgTable("conversations", {
|
||||||
id: uuid("id").primaryKey().defaultRandom(),
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
userOneId: uuid("user_one_id")
|
userOneId: uuid("user_one_id")
|
||||||
|
|
@ -148,9 +141,7 @@ export const conversations = pgTable("conversations", {
|
||||||
createdAt: timestamp("created_at").defaultNow().notNull(),
|
createdAt: timestamp("created_at").defaultNow().notNull(),
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/** Database table definition for direct messages sent within a conversation. */
|
||||||
* Database table definition for direct messages sent within a conversation.
|
|
||||||
*/
|
|
||||||
export const directMessages = pgTable("direct_messages", {
|
export const directMessages = pgTable("direct_messages", {
|
||||||
id: uuid("id").primaryKey().defaultRandom(),
|
id: uuid("id").primaryKey().defaultRandom(),
|
||||||
content: text("content").notNull(),
|
content: text("content").notNull(),
|
||||||
|
|
@ -168,9 +159,7 @@ export const directMessages = pgTable("direct_messages", {
|
||||||
// Drizzle Relations
|
// Drizzle Relations
|
||||||
// ==========================================
|
// ==========================================
|
||||||
|
|
||||||
/**
|
/** Relational definitions for the users table. */
|
||||||
* Relational definitions for the users table.
|
|
||||||
*/
|
|
||||||
export const usersRelations = relations(users, ({ many }) => ({
|
export const usersRelations = relations(users, ({ many }) => ({
|
||||||
memberships: many(members),
|
memberships: many(members),
|
||||||
sentFriendRequests: many(friendships, { relationName: "sentFriendships" }),
|
sentFriendRequests: many(friendships, { relationName: "sentFriendships" }),
|
||||||
|
|
@ -186,17 +175,14 @@ export const usersRelations = relations(users, ({ many }) => ({
|
||||||
directMessages: many(directMessages),
|
directMessages: many(directMessages),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
/**
|
/** Relational definitions for the servers table. */
|
||||||
* Relational definitions for the servers table.
|
|
||||||
*/
|
|
||||||
export const serversRelations = relations(servers, ({ many }) => ({
|
export const serversRelations = relations(servers, ({ many }) => ({
|
||||||
channels: many(channels),
|
channels: many(channels),
|
||||||
|
categories: many(categories),
|
||||||
members: many(members),
|
members: many(members),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
/**
|
/** Relational definitions for the members table. */
|
||||||
* Relational definitions for the members table.
|
|
||||||
*/
|
|
||||||
export const membersRelations = relations(members, ({ one, many }) => ({
|
export const membersRelations = relations(members, ({ one, many }) => ({
|
||||||
user: one(users, { fields: [members.userId], references: [users.id] }),
|
user: one(users, { fields: [members.userId], references: [users.id] }),
|
||||||
server: one(servers, {
|
server: one(servers, {
|
||||||
|
|
@ -206,20 +192,29 @@ export const membersRelations = relations(members, ({ one, many }) => ({
|
||||||
messages: many(messages),
|
messages: many(messages),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
/**
|
/** Relational definitions for the channels table. */
|
||||||
* Relational definitions for the channels table.
|
|
||||||
*/
|
|
||||||
export const channelsRelations = relations(channels, ({ one, many }) => ({
|
export const channelsRelations = relations(channels, ({ one, many }) => ({
|
||||||
server: one(servers, {
|
server: one(servers, {
|
||||||
fields: [channels.serverId],
|
fields: [channels.serverId],
|
||||||
references: [servers.id],
|
references: [servers.id],
|
||||||
}),
|
}),
|
||||||
|
category: one(categories, {
|
||||||
|
fields: [channels.categoryId],
|
||||||
|
references: [categories.id],
|
||||||
|
}),
|
||||||
messages: many(messages),
|
messages: many(messages),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
/**
|
/** Relational definitions for the categories table. */
|
||||||
* Relational definitions for the messages table.
|
export const categoriesRelations = relations(categories, ({ one, many }) => ({
|
||||||
*/
|
server: one(servers, {
|
||||||
|
fields: [categories.serverId],
|
||||||
|
references: [servers.id],
|
||||||
|
}),
|
||||||
|
channels: many(channels),
|
||||||
|
}));
|
||||||
|
|
||||||
|
/** Relational definitions for the messages table. */
|
||||||
export const messagesRelations = relations(messages, ({ one }) => ({
|
export const messagesRelations = relations(messages, ({ one }) => ({
|
||||||
channel: one(channels, {
|
channel: one(channels, {
|
||||||
fields: [messages.channelId],
|
fields: [messages.channelId],
|
||||||
|
|
@ -231,9 +226,7 @@ export const messagesRelations = relations(messages, ({ one }) => ({
|
||||||
}),
|
}),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
/**
|
/** Relational definitions for the friendships table. */
|
||||||
* Relational definitions for the friendships table.
|
|
||||||
*/
|
|
||||||
export const friendshipsRelations = relations(friendships, ({ one }) => ({
|
export const friendshipsRelations = relations(friendships, ({ one }) => ({
|
||||||
sender: one(users, {
|
sender: one(users, {
|
||||||
fields: [friendships.senderId],
|
fields: [friendships.senderId],
|
||||||
|
|
@ -247,9 +240,7 @@ export const friendshipsRelations = relations(friendships, ({ one }) => ({
|
||||||
}),
|
}),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
/**
|
/** Relational definitions for the conversations table. */
|
||||||
* Relational definitions for the conversations table.
|
|
||||||
*/
|
|
||||||
export const conversationsRelations = relations(
|
export const conversationsRelations = relations(
|
||||||
conversations,
|
conversations,
|
||||||
({ one, many }) => ({
|
({ one, many }) => ({
|
||||||
|
|
@ -267,9 +258,7 @@ export const conversationsRelations = relations(
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/** Relational definitions for the directMessages table. */
|
||||||
* Relational definitions for the directMessages table.
|
|
||||||
*/
|
|
||||||
export const directMessagesRelations = relations(directMessages, ({ one }) => ({
|
export const directMessagesRelations = relations(directMessages, ({ one }) => ({
|
||||||
conversation: one(conversations, {
|
conversation: one(conversations, {
|
||||||
fields: [directMessages.conversationId],
|
fields: [directMessages.conversationId],
|
||||||
|
|
@ -289,6 +278,7 @@ export type User = typeof users.$inferSelect;
|
||||||
export type Server = typeof servers.$inferSelect;
|
export type Server = typeof servers.$inferSelect;
|
||||||
export type Member = typeof members.$inferSelect;
|
export type Member = typeof members.$inferSelect;
|
||||||
export type Channel = typeof channels.$inferSelect;
|
export type Channel = typeof channels.$inferSelect;
|
||||||
|
export type Category = typeof categories.$inferSelect;
|
||||||
export type Message = typeof messages.$inferSelect;
|
export type Message = typeof messages.$inferSelect;
|
||||||
export type UserStatus = (typeof userStatusEnum.enumValues)[number];
|
export type UserStatus = (typeof userStatusEnum.enumValues)[number];
|
||||||
export type Friendship = typeof friendships.$inferSelect;
|
export type Friendship = typeof friendships.$inferSelect;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue