diff --git a/migrations/20250506184716_remove_unused_columns.sql b/migrations/20250506184716_remove_unused_columns.sql index 90e33fc..4022562 100644 --- a/migrations/20250506184716_remove_unused_columns.sql +++ b/migrations/20250506184716_remove_unused_columns.sql @@ -5,8 +5,11 @@ DROP TABLE IF EXISTS embeds; DROP TABLE IF EXISTS embed_fields; DROP TABLE IF EXISTS command_aliases; DROP TABLE IF EXISTS macro; +DROP TABLE IF EXISTS command_restrictions; DROP TABLE IF EXISTS roles; +SET FOREIGN_KEY_CHECKS = 0; + -- Drop columns from channels that are no longer used ALTER TABLE channels DROP COLUMN `name`; ALTER TABLE channels DROP COLUMN `blacklisted`; @@ -77,3 +80,5 @@ ALTER TABLE command_macro UPDATE command_macro SET guild_id = (SELECT guild FROM guilds_old WHERE id = guild_id); DROP TABLE guilds_old; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/src/commands/autocomplete.rs b/src/commands/autocomplete.rs index bfffffe..a22879c 100644 --- a/src/commands/autocomplete.rs +++ b/src/commands/autocomplete.rs @@ -24,7 +24,7 @@ pub async fn macro_name_autocomplete(ctx: Context<'_>, partial: &str) -> Vec Result<(), Error> { match sqlx::query!( " - SELECT m.id - FROM command_macro m - INNER JOIN guilds - ON guilds.id = m.guild_id - WHERE guild = ? - AND m.name = ? + SELECT id + FROM command_macro + WHERE guild_id = ? + AND name = ? ", ctx.guild_id().unwrap().get(), name diff --git a/src/commands/command_macro/finish_macro.rs b/src/commands/command_macro/finish_macro.rs index 26de52c..8321045 100644 --- a/src/commands/command_macro/finish_macro.rs +++ b/src/commands/command_macro/finish_macro.rs @@ -32,7 +32,7 @@ pub async fn finish_macro(ctx: Context<'_>) -> Result<(), Error> { let json = serde_json::to_string(&command_macro.commands).unwrap(); sqlx::query!( - "INSERT INTO command_macro (guild_id, name, description, commands) VALUES ((SELECT id FROM guilds WHERE guild = ?), ?, ?, ?)", + "INSERT INTO command_macro (guild_id, name, description, commands) VALUES (?, ?, ?, ?)", command_macro.guild_id.get(), command_macro.name, command_macro.description, diff --git a/src/commands/command_macro/record_macro.rs b/src/commands/command_macro/record_macro.rs index b60bcec..afb618b 100644 --- a/src/commands/command_macro/record_macro.rs +++ b/src/commands/command_macro/record_macro.rs @@ -35,7 +35,7 @@ pub async fn record_macro( " SELECT 1 as _e FROM command_macro - WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?) + WHERE guild_id = ? AND name = ? ", guild_id.get(), 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/commands/todo/guild/add.rs b/src/commands/todo/guild/add.rs index 6dcd4c6..5939fe0 100644 --- a/src/commands/todo/guild/add.rs +++ b/src/commands/todo/guild/add.rs @@ -18,7 +18,7 @@ impl Recordable for Options { " INSERT INTO todos (guild_id, value) VALUES ( - (SELECT id FROM guilds WHERE guild = ?), ? + ?, ? ) ", ctx.guild_id().unwrap().get(), diff --git a/src/commands/todo/guild/view.rs b/src/commands/todo/guild/view.rs index c607e33..5528d76 100644 --- a/src/commands/todo/guild/view.rs +++ b/src/commands/todo/guild/view.rs @@ -13,9 +13,8 @@ impl Recordable for Options { async fn run(self, ctx: Context<'_>) -> Result<(), Error> { let values = sqlx::query!( " - SELECT todos.id, value FROM todos - INNER JOIN guilds ON todos.guild_id = guilds.id - WHERE guilds.guild = ? + SELECT id, value FROM todos + WHERE guild_id = ? ", ctx.guild_id().unwrap().get(), ) diff --git a/src/component_models/mod.rs b/src/component_models/mod.rs index a1f1094..8d4187e 100644 --- a/src/component_models/mod.rs +++ b/src/component_models/mod.rs @@ -219,9 +219,8 @@ impl ComponentDataModel { } else { sqlx::query!( " - SELECT todos.id, value FROM todos - INNER JOIN guilds ON todos.guild_id = guilds.id - WHERE guilds.guild = ? + SELECT id, value FROM todos + WHERE guild_id = ? ", pager.guild_id, ) @@ -311,10 +310,9 @@ impl ComponentDataModel { } else { sqlx::query!( " - SELECT todos.id, value FROM todos - INNER JOIN guilds ON todos.guild_id = guilds.id - WHERE guilds.guild = ? - ", + SELECT id, value FROM todos + WHERE guild_id = ? + ", selector.guild_id, ) .fetch_all(&data.database) 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/command_macro.rs b/src/models/command_macro.rs index 90fdf1e..eef968d 100644 --- a/src/models/command_macro.rs +++ b/src/models/command_macro.rs @@ -144,12 +144,10 @@ pub async fn guild_command_macro(ctx: &Context<'_>, name: &str) -> Option 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..c764fde 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()) @@ -57,7 +57,6 @@ pub async fn create_guild_reminder_template( check_authorization(cookies, ctx.inner(), id).await?; match create_reminder_template( - ctx.inner(), &mut transaction, GuildId::new(id), reminder_template.into_inner(), @@ -87,15 +86,14 @@ 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 = ?", - id, delete_reminder_template.id + "DELETE FROM reminder_template WHERE guild_id = ? AND id = ?", + id, + delete_reminder_template.id ) .fetch_all(pool.inner()) .await { - Ok(_) => { - Ok(json!({})) - } + Ok(_) => Ok(json!({})), Err(e) => { warn!("Could not delete template from {}: {:?}", id, e); 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..107f20e 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()) @@ -144,7 +147,6 @@ pub async fn import( }; create_reminder_template( - ctx.inner(), &mut transaction, GuildId::new(id), reminder_template, 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..8da5807 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() @@ -594,7 +594,6 @@ pub(crate) async fn create_reminder( } pub(crate) async fn create_reminder_template( - ctx: &Context, transaction: &mut Transaction<'_>, guild_id: GuildId, reminder_template: ReminderTemplate, @@ -659,7 +658,7 @@ pub(crate) async fn create_reminder_template( interval_months, tts, username - ) VALUES ((SELECT id FROM guilds WHERE guild = ?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", guild_id.get(), name,