From 66e1bf03403706cc5c42e96d248958bee929114b Mon Sep 17 00:00:00 2001 From: jude Date: Fri, 23 May 2025 22:04:21 +0100 Subject: [PATCH] Restructure guilds table --- src/commands/todo/channel/add.rs | 2 +- src/event_handlers.rs | 4 +- src/models/channel_data.rs | 18 ++----- src/models/guild_data.rs | 10 ++-- src/models/mod.rs | 9 ++-- src/models/reminder/mod.rs | 2 +- .../routes/dashboard/api/guild/templates.rs | 4 +- src/web/routes/dashboard/api/guild/todos.rs | 12 ++--- .../dashboard/export/reminder_templates.rs | 47 ++++++++++--------- src/web/routes/dashboard/export/todos.rs | 9 ++-- src/web/routes/dashboard/mod.rs | 6 +-- 11 files changed, 59 insertions(+), 64 deletions(-) diff --git a/src/commands/todo/channel/add.rs b/src/commands/todo/channel/add.rs index 03335cb..4133120 100644 --- a/src/commands/todo/channel/add.rs +++ b/src/commands/todo/channel/add.rs @@ -21,7 +21,7 @@ impl Recordable for Options { " INSERT INTO todos (guild_id, channel_id, value) VALUES ( - (SELECT id FROM guilds WHERE guild = ?), + ?, (SELECT id FROM channels WHERE channel = ?), ? ) diff --git a/src/event_handlers.rs b/src/event_handlers.rs index e8a27c3..3896b1f 100644 --- a/src/event_handlers.rs +++ b/src/event_handlers.rs @@ -23,7 +23,7 @@ pub async fn listener( if is_new.unwrap_or(false) { let guild_id = guild.id.get().to_owned(); - sqlx::query!("INSERT IGNORE INTO guilds (guild) VALUES (?)", guild_id) + sqlx::query!("INSERT IGNORE INTO guilds (id) VALUES (?)", guild_id) .execute(&data.database) .await?; @@ -56,7 +56,7 @@ To stay up to date on the latest features and fixes, join our [Discord](https:// } FullEvent::GuildDelete { incomplete, .. } => { if !incomplete.unavailable { - let _ = sqlx::query!("DELETE FROM guilds WHERE guild = ?", incomplete.id.get()) + let _ = sqlx::query!("DELETE FROM guilds WHERE id = ?", incomplete.id.get()) .execute(&data.database) .await; } diff --git a/src/models/channel_data.rs b/src/models/channel_data.rs index 0122b80..f94256e 100644 --- a/src/models/channel_data.rs +++ b/src/models/channel_data.rs @@ -8,9 +8,7 @@ use crate::{consts::DEFAULT_AVATAR, Error}; pub struct ChannelData { pub id: u32, pub channel: u64, - pub name: Option, pub nudge: i16, - pub blacklisted: bool, pub webhook_id: Option, pub webhook_token: Option, pub paused: bool, @@ -27,7 +25,7 @@ impl ChannelData { if let Ok(c) = sqlx::query_as_unchecked!( Self, " - SELECT id, channel, name, nudge, blacklisted, webhook_id, webhook_token, paused, + SELECT id, channel, nudge, webhook_id, webhook_token, paused, paused_until FROM channels WHERE channel = ? @@ -39,15 +37,11 @@ impl ChannelData { { Ok(c) } else { - let props = channel.to_owned().guild().map(|g| (g.guild_id.get().to_owned(), g.name)); - - let (guild_id, channel_name) = - if let Some((a, b)) = props { (Some(a), Some(b)) } else { (None, None) }; + let guild_id = channel.to_owned().guild().map(|g| g.guild_id.get().to_owned()); sqlx::query!( - "INSERT IGNORE INTO channels (channel, name, guild_id) VALUES (?, ?, (SELECT id FROM guilds WHERE guild = ?))", + "INSERT IGNORE INTO channels (channel, guild_id) VALUES (?, ?)", channel_id, - channel_name, guild_id ) .execute(&pool.clone()) @@ -56,7 +50,7 @@ impl ChannelData { Ok(sqlx::query_as_unchecked!( Self, " - SELECT id, channel, name, nudge, blacklisted, webhook_id, webhook_token, paused, paused_until + SELECT id, channel, nudge, webhook_id, webhook_token, paused, paused_until FROM channels WHERE channel = ? ", @@ -72,18 +66,14 @@ impl ChannelData { " UPDATE channels SET - name = ?, nudge = ?, - blacklisted = ?, webhook_id = ?, webhook_token = ?, paused = ?, paused_until = ? WHERE id = ? ", - self.name, self.nudge, - self.blacklisted, self.webhook_id, self.webhook_token, self.paused, diff --git a/src/models/guild_data.rs b/src/models/guild_data.rs index b0ce526..ae91e84 100644 --- a/src/models/guild_data.rs +++ b/src/models/guild_data.rs @@ -3,7 +3,7 @@ use sqlx::MySqlPool; pub struct GuildData { pub ephemeral_confirmations: bool, - pub id: u32, + pub guild_id: u64, } impl GuildData { @@ -13,7 +13,7 @@ impl GuildData { ) -> Result> { if let Ok(c) = sqlx::query_as_unchecked!( Self, - "SELECT id, ephemeral_confirmations FROM guilds WHERE guild = ?", + "SELECT ephemeral_confirmations, id as guild_id FROM guilds WHERE id = ?", guild_id.get() ) .fetch_one(pool) @@ -21,13 +21,13 @@ impl GuildData { { Ok(c) } else { - sqlx::query!("INSERT IGNORE INTO guilds (guild) VALUES (?)", guild_id.get()) + sqlx::query!("INSERT IGNORE INTO guilds (id) VALUES (?)", guild_id.get()) .execute(&pool.clone()) .await?; Ok(sqlx::query_as_unchecked!( Self, - "SELECT id, ephemeral_confirmations FROM guilds WHERE guild = ?", + "SELECT ephemeral_confirmations, id as guild_id FROM guilds WHERE id = ?", guild_id.get() ) .fetch_one(pool) @@ -39,7 +39,7 @@ impl GuildData { sqlx::query!( "UPDATE guilds SET ephemeral_confirmations = ? WHERE id = ?", self.ephemeral_confirmations, - self.id + self.guild_id ) .execute(pool) .await diff --git a/src/models/mod.rs b/src/models/mod.rs index f40fa7b..2d0bdc9 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -68,16 +68,19 @@ impl Data { guild_id: GuildId, ) -> Result, Error> { let rows = sqlx::query!( - "SELECT name, description, commands FROM command_macro WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)", + "SELECT name, description, commands FROM command_macro WHERE guild_id = ?", guild_id.get() ) .fetch_all(&self.database) - .await?.iter().map(|row| CommandMacro { + .await? + .iter() + .map(|row| CommandMacro { guild_id, name: row.name.clone(), description: row.description.clone(), commands: serde_json::from_str(&row.commands.to_string()).unwrap(), - }).collect(); + }) + .collect(); Ok(rows) } diff --git a/src/models/reminder/mod.rs b/src/models/reminder/mod.rs index ba5dedd..4580fa2 100644 --- a/src/models/reminder/mod.rs +++ b/src/models/reminder/mod.rs @@ -262,7 +262,7 @@ impl Reminder { channels.id = reminders.channel_id WHERE `status` = 'pending' AND - channels.guild_id = (SELECT id FROM guilds WHERE guild = ?) + channels.guild_id = ? ", guild_id.get() ) diff --git a/src/web/routes/dashboard/api/guild/templates.rs b/src/web/routes/dashboard/api/guild/templates.rs index 278290b..22d39c8 100644 --- a/src/web/routes/dashboard/api/guild/templates.rs +++ b/src/web/routes/dashboard/api/guild/templates.rs @@ -31,7 +31,7 @@ pub async fn get_reminder_templates( match sqlx::query_as_unchecked!( ReminderTemplate, - "SELECT * FROM reminder_template WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)", + "SELECT * FROM reminder_template WHERE guild_id = ?", id ) .fetch_all(pool.inner()) @@ -87,7 +87,7 @@ pub async fn delete_reminder_template( check_authorization(cookies, ctx.inner(), id).await?; match sqlx::query!( - "DELETE FROM reminder_template WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?) AND id = ?", + "DELETE FROM reminder_template WHERE guild_id = ? AND id = ?", id, delete_reminder_template.id ) .fetch_all(pool.inner()) diff --git a/src/web/routes/dashboard/api/guild/todos.rs b/src/web/routes/dashboard/api/guild/todos.rs index 8042581..dd501cc 100644 --- a/src/web/routes/dashboard/api/guild/todos.rs +++ b/src/web/routes/dashboard/api/guild/todos.rs @@ -66,7 +66,7 @@ pub async fn create_todo( " INSERT INTO todos (guild_id, channel_id, value) VALUES ( - (SELECT id FROM guilds WHERE guild = ?), + ?, (SELECT id FROM channels WHERE channel = ?), ? ) @@ -88,7 +88,7 @@ pub async fn create_todo( " INSERT INTO todos (guild_id, channel_id, value) VALUES ( - (SELECT id FROM guilds WHERE guild = ?), + ?, NULL, ? ) @@ -130,11 +130,9 @@ pub async fn get_todo( channels.channel AS channel_id, value FROM todos - INNER JOIN guilds - ON guilds.id = todos.guild_id LEFT JOIN channels ON channels.id = todos.channel_id - WHERE guilds.guild = ? + WHERE todos.guild_id = ? ", id ) @@ -167,7 +165,7 @@ pub async fn update_todo( " UPDATE todos SET value = ? - WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?) + WHERE guild_id = ? AND id = ? ", todo.value, @@ -202,7 +200,7 @@ pub async fn delete_todo( sqlx::query!( " DELETE FROM todos - WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?) + WHERE guild_id = ? AND id = ? ", guild_id, diff --git a/src/web/routes/dashboard/export/reminder_templates.rs b/src/web/routes/dashboard/export/reminder_templates.rs index 56d0d10..9285da9 100644 --- a/src/web/routes/dashboard/export/reminder_templates.rs +++ b/src/web/routes/dashboard/export/reminder_templates.rs @@ -39,28 +39,31 @@ pub async fn export( match sqlx::query_as_unchecked!( ReminderTemplateCsv, - "SELECT - name, - attachment, - attachment_name, - avatar, - content, - embed_author, - embed_author_url, - embed_color, - embed_description, - embed_footer, - embed_footer_url, - embed_image_url, - embed_thumbnail_url, - embed_title, - embed_fields, - interval_seconds, - interval_days, - interval_months, - tts, - username - FROM reminder_template WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)", + " + SELECT + name, + attachment, + attachment_name, + avatar, + content, + embed_author, + embed_author_url, + embed_color, + embed_description, + embed_footer, + embed_footer_url, + embed_image_url, + embed_thumbnail_url, + embed_title, + embed_fields, + interval_seconds, + interval_days, + interval_months, + tts, + username + FROM reminder_template + WHERE guild_id = ? + ", id ) .fetch_all(pool.inner()) diff --git a/src/web/routes/dashboard/export/todos.rs b/src/web/routes/dashboard/export/todos.rs index d291a56..fe5d25a 100644 --- a/src/web/routes/dashboard/export/todos.rs +++ b/src/web/routes/dashboard/export/todos.rs @@ -38,10 +38,11 @@ pub async fn export( match sqlx::query_as_unchecked!( TodoCsv, - "SELECT value, CONCAT('#', channels.channel) AS channel_id FROM todos + " + SELECT value, CONCAT('#', channels.channel) AS channel_id FROM todos LEFT JOIN channels ON todos.channel_id = channels.id - INNER JOIN guilds ON todos.guild_id = guilds.id - WHERE guilds.guild = ?", + INNER JOIN guilds ON todos.guild_id = ? + ", id ) .fetch_all(pool.inner()) @@ -96,7 +97,7 @@ pub async fn import( Ok(body) => { let mut reader = csv::Reader::from_reader(body.as_slice()); - let query_placeholder = "(?, (SELECT id FROM channels WHERE channel = ?), (SELECT id FROM guilds WHERE guild = ?))"; + let query_placeholder = "(?, (SELECT id FROM channels WHERE channel = ?), ?)"; let mut query_params = vec![]; for result in reader.deserialize::() { diff --git a/src/web/routes/dashboard/mod.rs b/src/web/routes/dashboard/mod.rs index efaf41a..1bb6857 100644 --- a/src/web/routes/dashboard/mod.rs +++ b/src/web/routes/dashboard/mod.rs @@ -373,12 +373,12 @@ pub(crate) async fn create_reminder( reminder: CreateReminder, ) -> JsonResult { // check guild in db - match sqlx::query!("SELECT 1 as A FROM guilds WHERE guild = ?", guild_id.get()) + match sqlx::query!("SELECT 1 as A FROM guilds WHERE id = ?", guild_id.get()) .fetch_one(transaction.executor()) .await { Err(sqlx::Error::RowNotFound) => { - if sqlx::query!("INSERT INTO guilds (guild) VALUES (?)", guild_id.get()) + if sqlx::query!("INSERT INTO guilds (id) VALUES (?)", guild_id.get()) .execute(transaction.executor()) .await .is_err() @@ -659,7 +659,7 @@ pub(crate) async fn create_reminder_template( interval_months, tts, username - ) VALUES ((SELECT id FROM guilds WHERE guild = ?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", guild_id.get(), name,