Restructure guilds table

This commit is contained in:
jude
2025-05-23 22:04:21 +01:00
parent 19cfacffe5
commit 06041ba184
20 changed files with 85 additions and 96 deletions

View File

@ -5,8 +5,11 @@ DROP TABLE IF EXISTS embeds;
DROP TABLE IF EXISTS embed_fields; DROP TABLE IF EXISTS embed_fields;
DROP TABLE IF EXISTS command_aliases; DROP TABLE IF EXISTS command_aliases;
DROP TABLE IF EXISTS macro; DROP TABLE IF EXISTS macro;
DROP TABLE IF EXISTS command_restrictions;
DROP TABLE IF EXISTS roles; DROP TABLE IF EXISTS roles;
SET FOREIGN_KEY_CHECKS = 0;
-- Drop columns from channels that are no longer used -- Drop columns from channels that are no longer used
ALTER TABLE channels DROP COLUMN `name`; ALTER TABLE channels DROP COLUMN `name`;
ALTER TABLE channels DROP COLUMN `blacklisted`; 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); UPDATE command_macro SET guild_id = (SELECT guild FROM guilds_old WHERE id = guild_id);
DROP TABLE guilds_old; DROP TABLE guilds_old;
SET FOREIGN_KEY_CHECKS = 1;

View File

@ -24,7 +24,7 @@ pub async fn macro_name_autocomplete(ctx: Context<'_>, partial: &str) -> Vec<Str
SELECT name SELECT name
FROM command_macro FROM command_macro
WHERE WHERE
guild_id = (SELECT id FROM guilds WHERE guild = ?) guild_id = ?
AND name LIKE CONCAT(?, '%') AND name LIKE CONCAT(?, '%')
", ",
ctx.guild_id().unwrap().get(), ctx.guild_id().unwrap().get(),

View File

@ -17,12 +17,10 @@ pub async fn delete_macro(
) -> Result<(), Error> { ) -> Result<(), Error> {
match sqlx::query!( match sqlx::query!(
" "
SELECT m.id SELECT id
FROM command_macro m FROM command_macro
INNER JOIN guilds WHERE guild_id = ?
ON guilds.id = m.guild_id AND name = ?
WHERE guild = ?
AND m.name = ?
", ",
ctx.guild_id().unwrap().get(), ctx.guild_id().unwrap().get(),
name name

View File

@ -32,7 +32,7 @@ pub async fn finish_macro(ctx: Context<'_>) -> Result<(), Error> {
let json = serde_json::to_string(&command_macro.commands).unwrap(); let json = serde_json::to_string(&command_macro.commands).unwrap();
sqlx::query!( 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.guild_id.get(),
command_macro.name, command_macro.name,
command_macro.description, command_macro.description,

View File

@ -35,7 +35,7 @@ pub async fn record_macro(
" "
SELECT 1 as _e SELECT 1 as _e
FROM command_macro FROM command_macro
WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?) WHERE guild_id = ?
AND name = ? AND name = ?
", ",
guild_id.get(), guild_id.get(),

View File

@ -21,7 +21,7 @@ impl Recordable for Options {
" "
INSERT INTO todos (guild_id, channel_id, value) INSERT INTO todos (guild_id, channel_id, value)
VALUES ( VALUES (
(SELECT id FROM guilds WHERE guild = ?), ?,
(SELECT id FROM channels WHERE channel = ?), (SELECT id FROM channels WHERE channel = ?),
? ?
) )

View File

@ -18,7 +18,7 @@ impl Recordable for Options {
" "
INSERT INTO todos (guild_id, value) INSERT INTO todos (guild_id, value)
VALUES ( VALUES (
(SELECT id FROM guilds WHERE guild = ?), ? ?, ?
) )
", ",
ctx.guild_id().unwrap().get(), ctx.guild_id().unwrap().get(),

View File

@ -13,9 +13,8 @@ impl Recordable for Options {
async fn run(self, ctx: Context<'_>) -> Result<(), Error> { async fn run(self, ctx: Context<'_>) -> Result<(), Error> {
let values = sqlx::query!( let values = sqlx::query!(
" "
SELECT todos.id, value FROM todos SELECT id, value FROM todos
INNER JOIN guilds ON todos.guild_id = guilds.id WHERE guild_id = ?
WHERE guilds.guild = ?
", ",
ctx.guild_id().unwrap().get(), ctx.guild_id().unwrap().get(),
) )

View File

@ -219,9 +219,8 @@ impl ComponentDataModel {
} else { } else {
sqlx::query!( sqlx::query!(
" "
SELECT todos.id, value FROM todos SELECT id, value FROM todos
INNER JOIN guilds ON todos.guild_id = guilds.id WHERE guild_id = ?
WHERE guilds.guild = ?
", ",
pager.guild_id, pager.guild_id,
) )
@ -311,9 +310,8 @@ impl ComponentDataModel {
} else { } else {
sqlx::query!( sqlx::query!(
" "
SELECT todos.id, value FROM todos SELECT id, value FROM todos
INNER JOIN guilds ON todos.guild_id = guilds.id WHERE guild_id = ?
WHERE guilds.guild = ?
", ",
selector.guild_id, selector.guild_id,
) )

View File

@ -23,7 +23,7 @@ pub async fn listener(
if is_new.unwrap_or(false) { if is_new.unwrap_or(false) {
let guild_id = guild.id.get().to_owned(); 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) .execute(&data.database)
.await?; .await?;
@ -56,7 +56,7 @@ To stay up to date on the latest features and fixes, join our [Discord](https://
} }
FullEvent::GuildDelete { incomplete, .. } => { FullEvent::GuildDelete { incomplete, .. } => {
if !incomplete.unavailable { 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) .execute(&data.database)
.await; .await;
} }

View File

@ -8,9 +8,7 @@ use crate::{consts::DEFAULT_AVATAR, Error};
pub struct ChannelData { pub struct ChannelData {
pub id: u32, pub id: u32,
pub channel: u64, pub channel: u64,
pub name: Option<String>,
pub nudge: i16, pub nudge: i16,
pub blacklisted: bool,
pub webhook_id: Option<u64>, pub webhook_id: Option<u64>,
pub webhook_token: Option<String>, pub webhook_token: Option<String>,
pub paused: bool, pub paused: bool,
@ -27,7 +25,7 @@ impl ChannelData {
if let Ok(c) = sqlx::query_as_unchecked!( if let Ok(c) = sqlx::query_as_unchecked!(
Self, Self,
" "
SELECT id, channel, name, nudge, blacklisted, webhook_id, webhook_token, paused, SELECT id, channel, nudge, webhook_id, webhook_token, paused,
paused_until paused_until
FROM channels FROM channels
WHERE channel = ? WHERE channel = ?
@ -39,15 +37,11 @@ impl ChannelData {
{ {
Ok(c) Ok(c)
} else { } else {
let props = channel.to_owned().guild().map(|g| (g.guild_id.get().to_owned(), g.name)); let guild_id = channel.to_owned().guild().map(|g| g.guild_id.get().to_owned());
let (guild_id, channel_name) =
if let Some((a, b)) = props { (Some(a), Some(b)) } else { (None, None) };
sqlx::query!( 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_id,
channel_name,
guild_id guild_id
) )
.execute(&pool.clone()) .execute(&pool.clone())
@ -56,7 +50,7 @@ impl ChannelData {
Ok(sqlx::query_as_unchecked!( Ok(sqlx::query_as_unchecked!(
Self, 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 FROM channels
WHERE channel = ? WHERE channel = ?
", ",
@ -72,18 +66,14 @@ impl ChannelData {
" "
UPDATE channels UPDATE channels
SET SET
name = ?,
nudge = ?, nudge = ?,
blacklisted = ?,
webhook_id = ?, webhook_id = ?,
webhook_token = ?, webhook_token = ?,
paused = ?, paused = ?,
paused_until = ? paused_until = ?
WHERE id = ? WHERE id = ?
", ",
self.name,
self.nudge, self.nudge,
self.blacklisted,
self.webhook_id, self.webhook_id,
self.webhook_token, self.webhook_token,
self.paused, self.paused,

View File

@ -144,12 +144,10 @@ pub async fn guild_command_macro(ctx: &Context<'_>, name: &str) -> Option<Comman
let row = sqlx::query_as!( let row = sqlx::query_as!(
Row, Row,
" "
SELECT m.name, m.description, m.commands SELECT name, description, commands
FROM command_macro m FROM command_macro m
INNER JOIN guilds g WHERE guild_id = ?
ON g.id = m.guild_id AND name = ?
WHERE guild = ?
AND m.name = ?
", ",
ctx.guild_id().unwrap().get(), ctx.guild_id().unwrap().get(),
name name

View File

@ -3,7 +3,7 @@ use sqlx::MySqlPool;
pub struct GuildData { pub struct GuildData {
pub ephemeral_confirmations: bool, pub ephemeral_confirmations: bool,
pub id: u32, pub guild_id: u64,
} }
impl GuildData { impl GuildData {
@ -13,7 +13,7 @@ impl GuildData {
) -> Result<Self, Box<dyn std::error::Error + Sync + Send>> { ) -> Result<Self, Box<dyn std::error::Error + Sync + Send>> {
if let Ok(c) = sqlx::query_as_unchecked!( if let Ok(c) = sqlx::query_as_unchecked!(
Self, Self,
"SELECT id, ephemeral_confirmations FROM guilds WHERE guild = ?", "SELECT ephemeral_confirmations, id as guild_id FROM guilds WHERE id = ?",
guild_id.get() guild_id.get()
) )
.fetch_one(pool) .fetch_one(pool)
@ -21,13 +21,13 @@ impl GuildData {
{ {
Ok(c) Ok(c)
} else { } 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()) .execute(&pool.clone())
.await?; .await?;
Ok(sqlx::query_as_unchecked!( Ok(sqlx::query_as_unchecked!(
Self, Self,
"SELECT id, ephemeral_confirmations FROM guilds WHERE guild = ?", "SELECT ephemeral_confirmations, id as guild_id FROM guilds WHERE id = ?",
guild_id.get() guild_id.get()
) )
.fetch_one(pool) .fetch_one(pool)
@ -39,7 +39,7 @@ impl GuildData {
sqlx::query!( sqlx::query!(
"UPDATE guilds SET ephemeral_confirmations = ? WHERE id = ?", "UPDATE guilds SET ephemeral_confirmations = ? WHERE id = ?",
self.ephemeral_confirmations, self.ephemeral_confirmations,
self.id self.guild_id
) )
.execute(pool) .execute(pool)
.await .await

View File

@ -68,16 +68,19 @@ impl Data {
guild_id: GuildId, guild_id: GuildId,
) -> Result<Vec<CommandMacro>, Error> { ) -> Result<Vec<CommandMacro>, Error> {
let rows = sqlx::query!( 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() guild_id.get()
) )
.fetch_all(&self.database) .fetch_all(&self.database)
.await?.iter().map(|row| CommandMacro { .await?
.iter()
.map(|row| CommandMacro {
guild_id, guild_id,
name: row.name.clone(), name: row.name.clone(),
description: row.description.clone(), description: row.description.clone(),
commands: serde_json::from_str(&row.commands.to_string()).unwrap(), commands: serde_json::from_str(&row.commands.to_string()).unwrap(),
}).collect(); })
.collect();
Ok(rows) Ok(rows)
} }

View File

@ -262,7 +262,7 @@ impl Reminder {
channels.id = reminders.channel_id channels.id = reminders.channel_id
WHERE WHERE
`status` = 'pending' AND `status` = 'pending' AND
channels.guild_id = (SELECT id FROM guilds WHERE guild = ?) channels.guild_id = ?
", ",
guild_id.get() guild_id.get()
) )

View File

@ -31,7 +31,7 @@ pub async fn get_reminder_templates(
match sqlx::query_as_unchecked!( match sqlx::query_as_unchecked!(
ReminderTemplate, ReminderTemplate,
"SELECT * FROM reminder_template WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)", "SELECT * FROM reminder_template WHERE guild_id = ?",
id id
) )
.fetch_all(pool.inner()) .fetch_all(pool.inner())
@ -57,7 +57,6 @@ pub async fn create_guild_reminder_template(
check_authorization(cookies, ctx.inner(), id).await?; check_authorization(cookies, ctx.inner(), id).await?;
match create_reminder_template( match create_reminder_template(
ctx.inner(),
&mut transaction, &mut transaction,
GuildId::new(id), GuildId::new(id),
reminder_template.into_inner(), reminder_template.into_inner(),
@ -87,15 +86,14 @@ pub async fn delete_reminder_template(
check_authorization(cookies, ctx.inner(), id).await?; check_authorization(cookies, ctx.inner(), id).await?;
match sqlx::query!( 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 id,
delete_reminder_template.id
) )
.fetch_all(pool.inner()) .fetch_all(pool.inner())
.await .await
{ {
Ok(_) => { Ok(_) => Ok(json!({})),
Ok(json!({}))
}
Err(e) => { Err(e) => {
warn!("Could not delete template from {}: {:?}", id, e); warn!("Could not delete template from {}: {:?}", id, e);

View File

@ -66,7 +66,7 @@ pub async fn create_todo(
" "
INSERT INTO todos (guild_id, channel_id, value) INSERT INTO todos (guild_id, channel_id, value)
VALUES ( VALUES (
(SELECT id FROM guilds WHERE guild = ?), ?,
(SELECT id FROM channels WHERE channel = ?), (SELECT id FROM channels WHERE channel = ?),
? ?
) )
@ -88,7 +88,7 @@ pub async fn create_todo(
" "
INSERT INTO todos (guild_id, channel_id, value) INSERT INTO todos (guild_id, channel_id, value)
VALUES ( VALUES (
(SELECT id FROM guilds WHERE guild = ?), ?,
NULL, NULL,
? ?
) )
@ -130,11 +130,9 @@ pub async fn get_todo(
channels.channel AS channel_id, channels.channel AS channel_id,
value value
FROM todos FROM todos
INNER JOIN guilds
ON guilds.id = todos.guild_id
LEFT JOIN channels LEFT JOIN channels
ON channels.id = todos.channel_id ON channels.id = todos.channel_id
WHERE guilds.guild = ? WHERE todos.guild_id = ?
", ",
id id
) )
@ -167,7 +165,7 @@ pub async fn update_todo(
" "
UPDATE todos UPDATE todos
SET value = ? SET value = ?
WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?) WHERE guild_id = ?
AND id = ? AND id = ?
", ",
todo.value, todo.value,
@ -202,7 +200,7 @@ pub async fn delete_todo(
sqlx::query!( sqlx::query!(
" "
DELETE FROM todos DELETE FROM todos
WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?) WHERE guild_id = ?
AND id = ? AND id = ?
", ",
guild_id, guild_id,

View File

@ -39,7 +39,8 @@ pub async fn export(
match sqlx::query_as_unchecked!( match sqlx::query_as_unchecked!(
ReminderTemplateCsv, ReminderTemplateCsv,
"SELECT "
SELECT
name, name,
attachment, attachment,
attachment_name, attachment_name,
@ -60,7 +61,9 @@ pub async fn export(
interval_months, interval_months,
tts, tts,
username username
FROM reminder_template WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)", FROM reminder_template
WHERE guild_id = ?
",
id id
) )
.fetch_all(pool.inner()) .fetch_all(pool.inner())
@ -144,7 +147,6 @@ pub async fn import(
}; };
create_reminder_template( create_reminder_template(
ctx.inner(),
&mut transaction, &mut transaction,
GuildId::new(id), GuildId::new(id),
reminder_template, reminder_template,

View File

@ -38,10 +38,11 @@ pub async fn export(
match sqlx::query_as_unchecked!( match sqlx::query_as_unchecked!(
TodoCsv, 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 LEFT JOIN channels ON todos.channel_id = channels.id
INNER JOIN guilds ON todos.guild_id = guilds.id INNER JOIN guilds ON todos.guild_id = ?
WHERE guilds.guild = ?", ",
id id
) )
.fetch_all(pool.inner()) .fetch_all(pool.inner())
@ -96,7 +97,7 @@ pub async fn import(
Ok(body) => { Ok(body) => {
let mut reader = csv::Reader::from_reader(body.as_slice()); 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![]; let mut query_params = vec![];
for result in reader.deserialize::<TodoCsv>() { for result in reader.deserialize::<TodoCsv>() {

View File

@ -373,12 +373,12 @@ pub(crate) async fn create_reminder(
reminder: CreateReminder, reminder: CreateReminder,
) -> JsonResult { ) -> JsonResult {
// check guild in db // 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()) .fetch_one(transaction.executor())
.await .await
{ {
Err(sqlx::Error::RowNotFound) => { 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()) .execute(transaction.executor())
.await .await
.is_err() .is_err()
@ -594,7 +594,6 @@ pub(crate) async fn create_reminder(
} }
pub(crate) async fn create_reminder_template( pub(crate) async fn create_reminder_template(
ctx: &Context,
transaction: &mut Transaction<'_>, transaction: &mut Transaction<'_>,
guild_id: GuildId, guild_id: GuildId,
reminder_template: ReminderTemplate, reminder_template: ReminderTemplate,
@ -659,7 +658,7 @@ pub(crate) async fn create_reminder_template(
interval_months, interval_months,
tts, tts,
username username
) VALUES ((SELECT id FROM guilds WHERE guild = ?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?)", ?, ?, ?, ?, ?, ?, ?)",
guild_id.get(), guild_id.get(),
name, name,