diff --git a/backend/src/apps/admin/core/database/schema/admins.ts b/backend/src/apps/admin/core/database/schema/admins.ts index ea2270dd0..ea4c4ca60 100644 --- a/backend/src/apps/admin/core/database/schema/admins.ts +++ b/backend/src/apps/admin/core/database/schema/admins.ts @@ -1,5 +1,6 @@ import { boolean, + index, integer, pgTable, serial, @@ -10,19 +11,28 @@ import { relations } from "drizzle-orm"; import { core_groups } from "./groups"; import { core_users } from "./users"; -export const core_admin_permissions = pgTable("core_admin_permissions", { - id: serial("id").primaryKey(), - group_id: integer("group_id").references(() => core_groups.id, { - onDelete: "cascade" - }), - user_id: integer("user_id").references(() => core_users.id, { - onDelete: "cascade" - }), - unrestricted: boolean("unrestricted").notNull().default(false), - created: integer("created").notNull(), - updated: integer("updated").notNull(), - protected: boolean("protected").notNull().default(false) -}); +export const core_admin_permissions = pgTable( + "core_admin_permissions", + { + id: serial("id").primaryKey(), + group_id: integer("group_id").references(() => core_groups.id, { + onDelete: "cascade" + }), + user_id: integer("user_id").references(() => core_users.id, { + onDelete: "cascade" + }), + unrestricted: boolean("unrestricted").notNull().default(false), + created: integer("created").notNull(), + updated: integer("updated").notNull(), + protected: boolean("protected").notNull().default(false) + }, + table => ({ + group_id_idx: index("core_admin_permissions_group_id_idx").on( + table.group_id + ), + user_id_idx: index("core_admin_permissions_user_id_idx").on(table.user_id) + }) +); export const core_admin_permissions_relations = relations( core_admin_permissions, @@ -38,16 +48,25 @@ export const core_admin_permissions_relations = relations( }) ); -export const core_admin_sessions = pgTable("core_admin_sessions", { - login_token: varchar("login_token", { length: 255 }).primaryKey(), - user_id: integer("user_id") - .notNull() - .references(() => core_users.id, { - onDelete: "cascade" - }), - last_seen: integer("last_seen").notNull(), - expires: integer("expires").notNull() -}); +export const core_admin_sessions = pgTable( + "core_admin_sessions", + { + login_token: varchar("login_token", { length: 255 }).primaryKey(), + user_id: integer("user_id") + .notNull() + .references(() => core_users.id, { + onDelete: "cascade" + }), + last_seen: integer("last_seen").notNull(), + expires: integer("expires").notNull() + }, + table => ({ + login_token_idx: index("core_admin_sessions_login_token_idx").on( + table.login_token + ), + user_id_idx: index("core_admin_sessions_user_id_idx").on(table.user_id) + }) +); export const core_admin_sessions_relations = relations( core_admin_sessions, diff --git a/backend/src/apps/admin/core/database/schema/files.ts b/backend/src/apps/admin/core/database/schema/files.ts index 5c877c0b0..4f8b91d90 100644 --- a/backend/src/apps/admin/core/database/schema/files.ts +++ b/backend/src/apps/admin/core/database/schema/files.ts @@ -1,26 +1,39 @@ -import { integer, pgTable, serial, text, varchar } from "drizzle-orm/pg-core"; +import { + index, + integer, + pgTable, + serial, + text, + varchar +} from "drizzle-orm/pg-core"; import { relations } from "drizzle-orm"; import { core_users } from "./users"; -export const core_files = pgTable("core_files", { - id: serial("id").primaryKey(), - extension: varchar("extension", { length: 32 }).notNull(), - name: varchar("name", { length: 255 }).notNull(), - url: varchar("url", { length: 255 }).notNull(), - user_id: integer("user_id") - .notNull() - .references(() => core_users.id, { - onDelete: "cascade" - }), - created: integer("created").notNull(), - file_size: integer("file_size").notNull(), - position: integer("position").notNull().default(0), - description: text("description"), - module: varchar("module", { length: 255 }), - module_id: varchar("module_id", { length: 255 }), - mimetype: varchar("mimetype", { length: 255 }) -}); +export const core_files = pgTable( + "core_files", + { + id: serial("id").primaryKey(), + extension: varchar("extension", { length: 32 }).notNull(), + name: varchar("name", { length: 255 }).notNull(), + url: varchar("url", { length: 255 }).notNull(), + user_id: integer("user_id") + .notNull() + .references(() => core_users.id, { + onDelete: "cascade" + }), + created: integer("created").notNull(), + file_size: integer("file_size").notNull(), + position: integer("position").notNull().default(0), + description: text("description"), + module: varchar("module", { length: 255 }), + module_id: varchar("module_id", { length: 255 }), + mimetype: varchar("mimetype", { length: 255 }) + }, + table => ({ + user_id_idx: index("core_files_user_id_idx").on(table.user_id) + }) +); export const core_files_relations = relations(core_files, ({ one }) => ({ user: one(core_users, { diff --git a/backend/src/apps/admin/core/database/schema/groups.ts b/backend/src/apps/admin/core/database/schema/groups.ts index 31fc3bcdf..3f87316f2 100644 --- a/backend/src/apps/admin/core/database/schema/groups.ts +++ b/backend/src/apps/admin/core/database/schema/groups.ts @@ -1,6 +1,7 @@ import { relations } from "drizzle-orm"; import { boolean, + index, integer, pgTable, serial, @@ -29,20 +30,29 @@ export const core_members = pgTable("core_members", { posts: integer("posts").notNull().default(0) }); -export const core_groups_names = pgTable("core_groups_names", { - id: serial("id").primaryKey(), - group_id: integer("group_id") - .notNull() - .references(() => core_groups.id, { - onDelete: "cascade" - }), - language_code: varchar("language_code") - .notNull() - .references(() => core_languages.code, { - onDelete: "cascade" - }), - value: varchar("value", { length: 255 }).notNull() -}); +export const core_groups_names = pgTable( + "core_groups_names", + { + id: serial("id").primaryKey(), + group_id: integer("group_id") + .notNull() + .references(() => core_groups.id, { + onDelete: "cascade" + }), + language_code: varchar("language_code") + .notNull() + .references(() => core_languages.code, { + onDelete: "cascade" + }), + value: varchar("value", { length: 255 }).notNull() + }, + table => ({ + group_id_idx: index("core_groups_names_group_id_idx").on(table.group_id), + language_code_idx: index("core_groups_names_language_code_idx").on( + table.language_code + ) + }) +); export const core_groups_names_relations = relations( core_groups_names, diff --git a/backend/src/apps/admin/core/database/schema/languages.ts b/backend/src/apps/admin/core/database/schema/languages.ts index c7970d8a0..739e560d9 100644 --- a/backend/src/apps/admin/core/database/schema/languages.ts +++ b/backend/src/apps/admin/core/database/schema/languages.ts @@ -1,18 +1,26 @@ import { boolean, + index, integer, pgTable, serial, varchar } from "drizzle-orm/pg-core"; -export const core_languages = pgTable("core_languages", { - id: serial("id").primaryKey(), - code: varchar("code", { length: 32 }).notNull().unique(), - name: varchar("name", { length: 255 }).notNull(), - timezone: varchar("timezone", { length: 255 }).notNull().default("UTC"), - protected: boolean("protected").notNull().default(false), - default: boolean("default").notNull().default(false), - enabled: boolean("enabled").notNull().default(true), - created: integer("created").notNull() -}); +export const core_languages = pgTable( + "core_languages", + { + id: serial("id").primaryKey(), + code: varchar("code", { length: 32 }).notNull().unique(), + name: varchar("name", { length: 255 }).notNull(), + timezone: varchar("timezone", { length: 255 }).notNull().default("UTC"), + protected: boolean("protected").notNull().default(false), + default: boolean("default").notNull().default(false), + enabled: boolean("enabled").notNull().default(true), + created: integer("created").notNull() + }, + table => ({ + code_idx: index("core_languages_code_idx").on(table.code), + name_idx: index("core_languages_name_idx").on(table.name) + }) +); diff --git a/backend/src/apps/admin/core/database/schema/moderators.ts b/backend/src/apps/admin/core/database/schema/moderators.ts index c56e12d4f..cce50ef30 100644 --- a/backend/src/apps/admin/core/database/schema/moderators.ts +++ b/backend/src/apps/admin/core/database/schema/moderators.ts @@ -1,4 +1,4 @@ -import { boolean, integer, pgTable, serial } from "drizzle-orm/pg-core"; +import { boolean, index, integer, pgTable, serial } from "drizzle-orm/pg-core"; import { relations } from "drizzle-orm"; import { core_groups } from "./groups"; @@ -18,7 +18,15 @@ export const core_moderators_permissions = pgTable( created: integer("created").notNull(), updated: integer("updated").notNull(), protected: boolean("protected").notNull().default(false) - } + }, + table => ({ + group_id_idx: index("core_moderators_permissions_group_id_idx").on( + table.group_id + ), + user_id_idx: index("core_moderators_permissions_user_id_idx").on( + table.user_id + ) + }) ); export const core_moderators_permissions_relations = relations( diff --git a/backend/src/apps/admin/core/database/schema/nav.ts b/backend/src/apps/admin/core/database/schema/nav.ts index 1e93b1afe..3adbbef1e 100644 --- a/backend/src/apps/admin/core/database/schema/nav.ts +++ b/backend/src/apps/admin/core/database/schema/nav.ts @@ -1,6 +1,7 @@ import { relations } from "drizzle-orm"; import { boolean, + index, integer, pgTable, serial, @@ -9,14 +10,20 @@ import { import { core_languages } from "./languages"; -export const core_nav = pgTable("core_nav", { - id: serial("id").primaryKey(), - href: varchar("href", { length: 255 }).notNull(), - external: boolean("external").notNull().default(false), - position: integer("position").notNull().default(0), - // ! Warning: this is a recursive relation. It's not supported by drizzle-orm yet. - parent_id: integer("parent_id") -}); +export const core_nav = pgTable( + "core_nav", + { + id: serial("id").primaryKey(), + href: varchar("href", { length: 255 }).notNull(), + external: boolean("external").notNull().default(false), + position: integer("position").notNull().default(0), + // ! Warning: this is a recursive relation. It's not supported by drizzle-orm yet. + parent_id: integer("parent_id") + }, + table => ({ + parent_id_idx: index("core_nav_parent_id_idx").on(table.parent_id) + }) +); export const core_nav_relations = relations(core_nav, ({ many, one }) => ({ name: many(core_nav_name), @@ -27,20 +34,29 @@ export const core_nav_relations = relations(core_nav, ({ many, one }) => ({ }) })); -export const core_nav_name = pgTable("core_nav_name", { - id: serial("id").primaryKey(), - nav_id: serial("nav_id") - .notNull() - .references(() => core_nav.id, { - onDelete: "cascade" - }), - language_code: varchar("language_code") - .notNull() - .references(() => core_languages.code, { - onDelete: "cascade" - }), - value: varchar("value", { length: 50 }).notNull() -}); +export const core_nav_name = pgTable( + "core_nav_name", + { + id: serial("id").primaryKey(), + nav_id: serial("nav_id") + .notNull() + .references(() => core_nav.id, { + onDelete: "cascade" + }), + language_code: varchar("language_code") + .notNull() + .references(() => core_languages.code, { + onDelete: "cascade" + }), + value: varchar("value", { length: 50 }).notNull() + }, + table => ({ + nav_id_idx: index("core_nav_name_nav_id_idx").on(table.nav_id), + language_code_idx: index("core_nav_name_language_code_idx").on( + table.language_code + ) + }) +); export const core_nav_name_relations = relations(core_nav_name, ({ one }) => ({ nav: one(core_nav, { @@ -53,20 +69,29 @@ export const core_nav_name_relations = relations(core_nav_name, ({ one }) => ({ }) })); -export const core_nav_description = pgTable("core_nav_description", { - id: serial("id").primaryKey(), - nav_id: serial("nav_id") - .notNull() - .references(() => core_nav.id, { - onDelete: "cascade" - }), - language_code: varchar("language_code") - .notNull() - .references(() => core_languages.code, { - onDelete: "cascade" - }), - value: varchar("value", { length: 50 }).notNull() -}); +export const core_nav_description = pgTable( + "core_nav_description", + { + id: serial("id").primaryKey(), + nav_id: serial("nav_id") + .notNull() + .references(() => core_nav.id, { + onDelete: "cascade" + }), + language_code: varchar("language_code") + .notNull() + .references(() => core_languages.code, { + onDelete: "cascade" + }), + value: varchar("value", { length: 50 }).notNull() + }, + table => ({ + nav_id_idx: index("core_nav_description_nav_id_idx").on(table.nav_id), + language_code_idx: index("core_nav_description_language_code_idx").on( + table.language_code + ) + }) +); export const core_nav_description_relations = relations( core_nav_description, diff --git a/backend/src/apps/admin/core/database/schema/plugins.ts b/backend/src/apps/admin/core/database/schema/plugins.ts index 12ed9f0b2..2d46baf59 100644 --- a/backend/src/apps/admin/core/database/schema/plugins.ts +++ b/backend/src/apps/admin/core/database/schema/plugins.ts @@ -1,23 +1,31 @@ import { boolean, + index, integer, pgTable, serial, varchar } from "drizzle-orm/pg-core"; -export const core_plugins = pgTable("core_plugins", { - id: serial("id").primaryKey(), - code: varchar("code", { length: 50 }).notNull(), - name: varchar("name", { length: 100 }).notNull(), - description: varchar("description", { length: 255 }), - version: varchar("version", { length: 255 }), - version_code: integer("version_code"), - enabled: boolean("enabled").notNull().default(true), - created: integer("created").notNull(), - support_url: varchar("support_url", { length: 255 }), - protected: boolean("protected").notNull().default(false), - author: varchar("author", { length: 100 }).notNull(), - author_url: varchar("author_url", { length: 255 }).notNull(), - default: boolean("default").notNull().default(false) -}); +export const core_plugins = pgTable( + "core_plugins", + { + id: serial("id").primaryKey(), + code: varchar("code", { length: 50 }).notNull(), + name: varchar("name", { length: 100 }).notNull(), + description: varchar("description", { length: 255 }), + version: varchar("version", { length: 255 }), + version_code: integer("version_code"), + enabled: boolean("enabled").notNull().default(true), + created: integer("created").notNull(), + support_url: varchar("support_url", { length: 255 }), + protected: boolean("protected").notNull().default(false), + author: varchar("author", { length: 100 }).notNull(), + author_url: varchar("author_url", { length: 255 }).notNull(), + default: boolean("default").notNull().default(false) + }, + table => ({ + code_idx: index("core_plugins_code_idx").on(table.code), + name_idx: index("core_plugins_name_idx").on(table.name) + }) +); diff --git a/backend/src/apps/admin/core/database/schema/sessions.ts b/backend/src/apps/admin/core/database/schema/sessions.ts index 0b4560f41..3d41ea383 100644 --- a/backend/src/apps/admin/core/database/schema/sessions.ts +++ b/backend/src/apps/admin/core/database/schema/sessions.ts @@ -1,18 +1,31 @@ -import { integer, pgTable, serial, text, varchar } from "drizzle-orm/pg-core"; +import { + index, + integer, + pgTable, + serial, + text, + varchar +} from "drizzle-orm/pg-core"; import { relations } from "drizzle-orm"; import { core_users } from "./users"; import { core_admin_sessions } from "./admins"; -export const core_sessions = pgTable("core_sessions", { - login_token: varchar("login_token", { length: 255 }).primaryKey(), - user_id: integer("user_id") - .notNull() - .references(() => core_users.id, { - onDelete: "cascade" - }), - last_seen: integer("last_seen").notNull(), - expires: integer("expires").notNull() -}); +export const core_sessions = pgTable( + "core_sessions", + { + login_token: varchar("login_token", { length: 255 }).primaryKey(), + user_id: integer("user_id") + .notNull() + .references(() => core_users.id, { + onDelete: "cascade" + }), + last_seen: integer("last_seen").notNull(), + expires: integer("expires").notNull() + }, + table => ({ + user_id_idx: index("core_sessions_user_id_idx").on(table.user_id) + }) +); export const core_sessions_relations = relations( core_sessions, @@ -44,7 +57,12 @@ export const core_sessions_known_devices = pgTable( uagent_device_type: varchar("uagent_device_type", { length: 200 }), uagent_device_model: varchar("uagent_device_model", { length: 200 }), last_seen: integer("last_seen").notNull() - } + }, + table => ({ + session_id_idx: index("core_sessions_known_devices_session_id_idx").on( + table.session_id + ) + }) ); export const core_sessions_known_devices_relations = relations( diff --git a/backend/src/apps/admin/core/database/schema/users.ts b/backend/src/apps/admin/core/database/schema/users.ts index 2dc16eb3e..3f3d3156c 100644 --- a/backend/src/apps/admin/core/database/schema/users.ts +++ b/backend/src/apps/admin/core/database/schema/users.ts @@ -1,6 +1,7 @@ import { relations } from "drizzle-orm"; import { boolean, + index, integer, pgTable, serial, @@ -11,18 +12,26 @@ import { import { core_groups } from "./groups"; import { core_files_avatars } from "./files"; -export const core_users = pgTable("core_users", { - id: serial("id").primaryKey(), - name_seo: varchar("name_seo", { length: 255 }).unique(), - name: varchar("name", { length: 255 }).notNull().unique(), - email: varchar("email", { length: 255 }).notNull().unique(), - password: text("password").notNull(), - joined: integer("joined").notNull(), - posts: integer("posts").notNull().default(0), - newsletter: boolean("newsletter").notNull().default(false), - avatar_color: varchar("avatar_color", { length: 6 }).notNull(), - group_id: integer("group_id").references(() => core_groups.id) -}); +export const core_users = pgTable( + "core_users", + { + id: serial("id").primaryKey(), + name_seo: varchar("name_seo", { length: 255 }).unique(), + name: varchar("name", { length: 255 }).notNull().unique(), + email: varchar("email", { length: 255 }).notNull().unique(), + password: text("password").notNull(), + joined: integer("joined").notNull(), + posts: integer("posts").notNull().default(0), + newsletter: boolean("newsletter").notNull().default(false), + avatar_color: varchar("avatar_color", { length: 6 }).notNull(), + group_id: integer("group_id").references(() => core_groups.id) + }, + table => ({ + name_seo_idx: index("core_users_name_seo_idx").on(table.name_seo), + name_idx: index("core_users_name_idx").on(table.name), + email_idx: index("core_users_email_idx").on(table.email) + }) +); export const core_users_relations = relations(core_users, ({ one }) => ({ group: one(core_groups, { diff --git a/backend/src/apps/admin/forum/database/schema/forums.ts b/backend/src/apps/admin/forum/database/schema/forums.ts index 4f20e50a2..7b38f298b 100644 --- a/backend/src/apps/admin/forum/database/schema/forums.ts +++ b/backend/src/apps/admin/forum/database/schema/forums.ts @@ -1,6 +1,7 @@ import { relations } from "drizzle-orm"; import { boolean, + index, integer, pgTable, serial, @@ -12,17 +13,23 @@ import { forum_topics } from "./topics"; import { core_groups } from "@/apps/admin/core/database/schema/groups"; import { core_languages } from "@/apps/admin/core/database/schema/languages"; -export const forum_forums = pgTable("forum_forums", { - id: serial("id").primaryKey(), - created: integer("created").notNull(), - // ! Warning: this is a recursive relation. It's not supported by drizzle-orm yet. - parent_id: integer("parent_id"), - position: integer("position").notNull().default(0), - can_all_view: boolean("can_all_view").notNull().default(false), - can_all_read: boolean("can_all_read").notNull().default(false), - can_all_create: boolean("can_all_create").notNull().default(false), - can_all_reply: boolean("can_all_reply").notNull().default(false) -}); +export const forum_forums = pgTable( + "forum_forums", + { + id: serial("id").primaryKey(), + created: integer("created").notNull(), + // ! Warning: this is a recursive relation. It's not supported by drizzle-orm yet. + parent_id: integer("parent_id"), + position: integer("position").notNull().default(0), + can_all_view: boolean("can_all_view").notNull().default(false), + can_all_read: boolean("can_all_read").notNull().default(false), + can_all_create: boolean("can_all_create").notNull().default(false), + can_all_reply: boolean("can_all_reply").notNull().default(false) + }, + table => ({ + parent_id_idx: index("forum_forums_parent_id_idx").on(table.parent_id) + }) +); export const forum_forums_relations = relations( forum_forums, @@ -38,20 +45,29 @@ export const forum_forums_relations = relations( }) ); -export const forum_forums_name = pgTable("forum_forums_name", { - id: serial("id").primaryKey(), - forum_id: integer("forum_id") - .notNull() - .references(() => forum_forums.id, { - onDelete: "cascade" - }), - language_code: varchar("language_code") - .notNull() - .references(() => core_languages.code, { - onDelete: "cascade" - }), - value: varchar("value").notNull() -}); +export const forum_forums_name = pgTable( + "forum_forums_name", + { + id: serial("id").primaryKey(), + forum_id: integer("forum_id") + .notNull() + .references(() => forum_forums.id, { + onDelete: "cascade" + }), + language_code: varchar("language_code") + .notNull() + .references(() => core_languages.code, { + onDelete: "cascade" + }), + value: varchar("value").notNull() + }, + table => ({ + forum_id_idx: index("forum_forums_name_forum_id_idx").on(table.forum_id), + language_code_idx: index("forum_forums_name_language_code_idx").on( + table.language_code + ) + }) +); export const forum_forums_name_relations = relations( forum_forums_name, @@ -67,20 +83,31 @@ export const forum_forums_name_relations = relations( }) ); -export const forum_forums_description = pgTable("forum_forums_description", { - id: serial("id").primaryKey(), - forum_id: integer("forum_id") - .notNull() - .references(() => forum_forums.id, { - onDelete: "cascade" - }), - language_code: varchar("language_code") - .notNull() - .references(() => core_languages.code, { - onDelete: "cascade" - }), - value: varchar("value").notNull() -}); +export const forum_forums_description = pgTable( + "forum_forums_description", + { + id: serial("id").primaryKey(), + forum_id: integer("forum_id") + .notNull() + .references(() => forum_forums.id, { + onDelete: "cascade" + }), + language_code: varchar("language_code") + .notNull() + .references(() => core_languages.code, { + onDelete: "cascade" + }), + value: varchar("value").notNull() + }, + table => ({ + forum_id_idx: index("forum_forums_description_forum_id_idx").on( + table.forum_id + ), + language_code_idx: index("forum_forums_description_language_code_idx").on( + table.language_code + ) + }) +); export const forum_forums_description_relations = relations( forum_forums_description, @@ -96,19 +123,30 @@ export const forum_forums_description_relations = relations( }) ); -export const forum_forums_permissions = pgTable("forum_forums_permissions", { - id: serial("id").primaryKey(), - forum_id: integer("forum_id").references(() => forum_forums.id, { - onDelete: "cascade" - }), - group_id: integer("group_id").references(() => core_groups.id, { - onDelete: "cascade" - }), - can_view: boolean("can_view").notNull().default(false), - can_read: boolean("can_read").notNull().default(false), - can_create: boolean("can_create").notNull().default(false), - can_reply: boolean("can_reply").notNull().default(false) -}); +export const forum_forums_permissions = pgTable( + "forum_forums_permissions", + { + id: serial("id").primaryKey(), + forum_id: integer("forum_id").references(() => forum_forums.id, { + onDelete: "cascade" + }), + group_id: integer("group_id").references(() => core_groups.id, { + onDelete: "cascade" + }), + can_view: boolean("can_view").notNull().default(false), + can_read: boolean("can_read").notNull().default(false), + can_create: boolean("can_create").notNull().default(false), + can_reply: boolean("can_reply").notNull().default(false) + }, + table => ({ + forum_id_idx: index("forum_forums_permissions_forum_id_idx").on( + table.forum_id + ), + group_id_idx: index("forum_forums_permissions_group_id_idx").on( + table.group_id + ) + }) +); export const forum_forums_permissions_relations = relations( forum_forums_permissions, diff --git a/backend/src/apps/admin/forum/database/schema/posts.ts b/backend/src/apps/admin/forum/database/schema/posts.ts index 9ac8b22c4..41d2be515 100644 --- a/backend/src/apps/admin/forum/database/schema/posts.ts +++ b/backend/src/apps/admin/forum/database/schema/posts.ts @@ -1,4 +1,11 @@ -import { integer, pgTable, serial, text, varchar } from "drizzle-orm/pg-core"; +import { + index, + integer, + pgTable, + serial, + text, + varchar +} from "drizzle-orm/pg-core"; import { relations } from "drizzle-orm"; import { forum_topics, forum_topics_logs } from "./topics"; @@ -6,18 +13,25 @@ import { forum_topics, forum_topics_logs } from "./topics"; import { core_users } from "@/apps/admin/core/database/schema/users"; import { core_languages } from "@/apps/admin/core/database/schema/languages"; -export const forum_posts = pgTable("forum_posts", { - id: serial("id").primaryKey(), - topic_id: integer("topic_id").references(() => forum_topics.id, { - onDelete: "cascade" - }), - user_id: integer("user_id").references(() => core_users.id, { - onDelete: "cascade" - }), - ip_address: varchar("ip_address", { length: 45 }), - created: integer("created").notNull(), - updated: integer("updated").notNull() -}); +export const forum_posts = pgTable( + "forum_posts", + { + id: serial("id").primaryKey(), + topic_id: integer("topic_id").references(() => forum_topics.id, { + onDelete: "cascade" + }), + user_id: integer("user_id").references(() => core_users.id, { + onDelete: "cascade" + }), + ip_address: varchar("ip_address", { length: 45 }), + created: integer("created").notNull(), + updated: integer("updated").notNull() + }, + table => ({ + topic_id_idx: index("forum_posts_topic_id_idx").on(table.topic_id), + user_id_idx: index("forum_posts_user_id_idx").on(table.user_id) + }) +); export const forum_posts_relations = relations( forum_posts, @@ -35,18 +49,27 @@ export const forum_posts_relations = relations( }) ); -export const forum_posts_content = pgTable("forum_posts_content", { - id: serial("id").primaryKey(), - post_id: integer("post_id").references(() => forum_posts.id, { - onDelete: "cascade" - }), - language_code: varchar("language_code") - .notNull() - .references(() => core_languages.code, { +export const forum_posts_content = pgTable( + "forum_posts_content", + { + id: serial("id").primaryKey(), + post_id: integer("post_id").references(() => forum_posts.id, { onDelete: "cascade" }), - value: varchar("value").notNull() -}); + language_code: varchar("language_code") + .notNull() + .references(() => core_languages.code, { + onDelete: "cascade" + }), + value: varchar("value").notNull() + }, + table => ({ + post_id_idx: index("forum_posts_content_post_id_idx").on(table.post_id), + language_code_idx: index("forum_posts_content_language_code_idx").on( + table.language_code + ) + }) +); export const forum_posts_content_relations = relations( forum_posts_content, @@ -62,22 +85,35 @@ export const forum_posts_content_relations = relations( }) ); -export const forum_posts_timeline = pgTable("forum_posts_timeline", { - id: serial("id").primaryKey(), - post_id: integer("post_id").references(() => forum_posts.id, { - onDelete: "cascade" - }), - log: text("log"), - topic_log_id: integer("topic_log_id").references(() => forum_topics_logs.id, { - onDelete: "cascade" - }), - created: integer("created").notNull(), - topic_id: integer("topic_id") - .notNull() - .references(() => forum_topics.id, { +export const forum_posts_timeline = pgTable( + "forum_posts_timeline", + { + id: serial("id").primaryKey(), + post_id: integer("post_id").references(() => forum_posts.id, { onDelete: "cascade" - }) -}); + }), + log: text("log"), + topic_log_id: integer("topic_log_id").references( + () => forum_topics_logs.id, + { + onDelete: "cascade" + } + ), + created: integer("created").notNull(), + topic_id: integer("topic_id") + .notNull() + .references(() => forum_topics.id, { + onDelete: "cascade" + }) + }, + table => ({ + post_id_idx: index("forum_posts_timeline_post_id_idx").on(table.post_id), + topic_log_id_idx: index("forum_posts_timeline_topic_log_id_idx").on( + table.topic_log_id + ), + topic_id_idx: index("forum_posts_timeline_topic_id_idx").on(table.topic_id) + }) +); export const forum_posts_timeline_relations = relations( forum_posts_timeline, diff --git a/backend/src/apps/admin/forum/database/schema/topics.ts b/backend/src/apps/admin/forum/database/schema/topics.ts index 8165d0580..f60ea78d8 100644 --- a/backend/src/apps/admin/forum/database/schema/topics.ts +++ b/backend/src/apps/admin/forum/database/schema/topics.ts @@ -1,5 +1,6 @@ import { boolean, + index, integer, pgEnum, pgTable, @@ -14,17 +15,23 @@ import { forum_posts, forum_posts_timeline } from "./posts"; import { core_languages } from "@/apps/admin/core/database/schema/languages"; import { core_users } from "@/apps/admin/core/database/schema/users"; -export const forum_topics = pgTable("forum_topics", { - id: serial("id").primaryKey(), - forum_id: integer("forum_id") - .notNull() - .references(() => forum_forums.id, { - onDelete: "cascade" - }), - created: integer("created").notNull(), - ip_address: varchar("ip_address", { length: 45 }), - locked: boolean("locked").notNull().default(false) -}); +export const forum_topics = pgTable( + "forum_topics", + { + id: serial("id").primaryKey(), + forum_id: integer("forum_id") + .notNull() + .references(() => forum_forums.id, { + onDelete: "cascade" + }), + created: integer("created").notNull(), + ip_address: varchar("ip_address", { length: 45 }), + locked: boolean("locked").notNull().default(false) + }, + table => ({ + forum_id_idx: index("forum_topics_forum_id_idx").on(table.forum_id) + }) +); export const forum_topics_relations = relations( forum_topics, @@ -40,20 +47,29 @@ export const forum_topics_relations = relations( }) ); -export const forum_topics_titles = pgTable("forum_topics_titles", { - id: serial("id").primaryKey(), - topic_id: integer("topic_id") - .notNull() - .references(() => forum_topics.id, { - onDelete: "cascade" - }), - language_code: varchar("language_code") - .notNull() - .references(() => core_languages.code, { - onDelete: "cascade" - }), - value: varchar("value").notNull() -}); +export const forum_topics_titles = pgTable( + "forum_topics_titles", + { + id: serial("id").primaryKey(), + topic_id: integer("topic_id") + .notNull() + .references(() => forum_topics.id, { + onDelete: "cascade" + }), + language_code: varchar("language_code") + .notNull() + .references(() => core_languages.code, { + onDelete: "cascade" + }), + value: varchar("value").notNull() + }, + table => ({ + topic_id_idx: index("forum_topics_titles_topic_id_idx").on(table.topic_id), + language_code_idx: index("forum_topics_titles_language_code_idx").on( + table.language_code + ) + }) +); export const forum_topics_titles_relations = relations( forum_topics_titles, @@ -74,18 +90,25 @@ export const forum_topics_logs_actions_enum = pgEnum("actions", [ "unlock" ]); -export const forum_topics_logs = pgTable("forum_topics_logs", { - id: serial("id").primaryKey(), - user_id: integer("user_id").references(() => core_users.id, { - onDelete: "cascade" - }), - ip_address: varchar("ip_address", { length: 45 }).notNull(), - created: integer("created").notNull(), - action: forum_topics_logs_actions_enum("action").notNull(), - topic_id: integer("topic_id").references(() => forum_topics.id, { - onDelete: "cascade" +export const forum_topics_logs = pgTable( + "forum_topics_logs", + { + id: serial("id").primaryKey(), + user_id: integer("user_id").references(() => core_users.id, { + onDelete: "cascade" + }), + ip_address: varchar("ip_address", { length: 45 }).notNull(), + created: integer("created").notNull(), + action: forum_topics_logs_actions_enum("action").notNull(), + topic_id: integer("topic_id").references(() => forum_topics.id, { + onDelete: "cascade" + }) + }, + table => ({ + user_id_idx: index("forum_topics_logs_user_id_idx").on(table.user_id), + topic_id_idx: index("forum_topics_logs_topic_id_idx").on(table.topic_id) }) -}); +); export const forum_topics_logs_relations = relations( forum_topics_logs, diff --git a/docs/pages/backend/i18n.mdx b/docs/pages/backend/i18n.mdx index 73ee9e2e9..2e065b0e7 100644 --- a/docs/pages/backend/i18n.mdx +++ b/docs/pages/backend/i18n.mdx @@ -34,23 +34,35 @@ The translation table must have: - any fields for relation with main table (in our case `nav_id`) ```ts -export const core_nav_name = pgTable("core_nav_name", { - id: serial("id").primaryKey(), - nav_id: serial("nav_id") - .notNull() - .references(() => core_nav.id, { - onDelete: "cascade" - }), - language_code: varchar("language_code") - .notNull() - .references(() => core_languages.code, { - onDelete: "cascade" - }), - value: varchar("value", { length: 50 }).notNull() -}); +import { relations } from "drizzle-orm"; +import { index, pgTable, serial, varchar } from "drizzle-orm/pg-core"; + +export const core_nav_name = pgTable( + "core_nav_name", + { + id: serial("id").primaryKey(), + nav_id: serial("nav_id") + .notNull() + .references(() => core_nav.id, { + onDelete: "cascade" + }), + language_code: varchar("language_code") + .notNull() + .references(() => core_languages.code, { + onDelete: "cascade" + }), + value: varchar("value", { length: 50 }).notNull() + }, + table => ({ + nav_id_idx: index("core_nav_name_nav_id_idx").on(table.nav_id), + language_code_idx: index("core_nav_name_language_code_idx").on( + table.language_code + ) + }) +); ``` -Remember to set `onDelete: 'cascade'` action into references. We want to delete translation when we delete main table. +Remember to set `onDelete: 'cascade'` action into references and set `indexes` for best performerce. We want to delete translation when we delete main table. ### Relation