Favorite/unfavorite sounds
This commit is contained in:
@@ -42,12 +42,21 @@ pub trait SoundCtx {
|
||||
user_id: U,
|
||||
page: Option<u64>,
|
||||
) -> Result<Vec<Sound>, sqlx::Error>;
|
||||
async fn favorite_sounds<U: Into<u64> + Send>(
|
||||
&self,
|
||||
user_id: U,
|
||||
page: Option<u64>,
|
||||
) -> Result<Vec<Sound>, sqlx::Error>;
|
||||
async fn guild_sounds<G: Into<u64> + Send>(
|
||||
&self,
|
||||
guild_id: G,
|
||||
page: Option<u64>,
|
||||
) -> Result<Vec<Sound>, sqlx::Error>;
|
||||
async fn count_user_sounds<U: Into<u64> + Send>(&self, user_id: U) -> Result<u64, sqlx::Error>;
|
||||
async fn count_favorite_sounds<U: Into<u64> + Send>(
|
||||
&self,
|
||||
user_id: U,
|
||||
) -> Result<u64, sqlx::Error>;
|
||||
async fn count_guild_sounds<G: Into<u64> + Send>(
|
||||
&self,
|
||||
guild_id: G,
|
||||
@@ -219,6 +228,50 @@ SELECT name, id, public, server_id, uploader_id
|
||||
Ok(sounds)
|
||||
}
|
||||
|
||||
async fn favorite_sounds<U: Into<u64> + Send>(
|
||||
&self,
|
||||
user_id: U,
|
||||
page: Option<u64>,
|
||||
) -> Result<Vec<Sound>, sqlx::Error> {
|
||||
let sounds = match page {
|
||||
Some(page) => {
|
||||
sqlx::query_as_unchecked!(
|
||||
Sound,
|
||||
"
|
||||
SELECT name, id, public, server_id, uploader_id
|
||||
FROM sounds
|
||||
INNER JOIN favorite_sounds f ON sounds.id = f.sound_id
|
||||
WHERE f.user_id = ?
|
||||
ORDER BY id DESC
|
||||
LIMIT ?, ?
|
||||
",
|
||||
user_id.into(),
|
||||
page * 25,
|
||||
(page + 1) * 25
|
||||
)
|
||||
.fetch_all(&self.database)
|
||||
.await?
|
||||
}
|
||||
None => {
|
||||
sqlx::query_as_unchecked!(
|
||||
Sound,
|
||||
"
|
||||
SELECT name, id, public, server_id, uploader_id
|
||||
FROM sounds
|
||||
INNER JOIN favorite_sounds f ON sounds.id = f.sound_id
|
||||
WHERE f.user_id = ?
|
||||
ORDER BY id DESC
|
||||
",
|
||||
user_id.into()
|
||||
)
|
||||
.fetch_all(&self.database)
|
||||
.await?
|
||||
}
|
||||
};
|
||||
|
||||
Ok(sounds)
|
||||
}
|
||||
|
||||
async fn guild_sounds<G: Into<u64> + Send>(
|
||||
&self,
|
||||
guild_id: G,
|
||||
@@ -272,6 +325,19 @@ SELECT name, id, public, server_id, uploader_id
|
||||
.count as u64)
|
||||
}
|
||||
|
||||
async fn count_favorite_sounds<U: Into<u64> + Send>(
|
||||
&self,
|
||||
user_id: U,
|
||||
) -> Result<u64, sqlx::Error> {
|
||||
Ok(sqlx::query!(
|
||||
"SELECT COUNT(1) as count FROM favorite_sounds WHERE user_id = ?",
|
||||
user_id.into()
|
||||
)
|
||||
.fetch_one(&self.database)
|
||||
.await?
|
||||
.count as u64)
|
||||
}
|
||||
|
||||
async fn count_guild_sounds<G: Into<u64> + Send>(
|
||||
&self,
|
||||
guild_id: G,
|
||||
@@ -416,6 +482,42 @@ WHERE
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn add_favorite<U: Into<u64>>(
|
||||
&self,
|
||||
user_id: U,
|
||||
db_pool: impl Executor<'_, Database = Database>,
|
||||
) -> Result<(), Box<dyn std::error::Error + Send + Sync + Send>> {
|
||||
let user_id = user_id.into();
|
||||
|
||||
sqlx::query!(
|
||||
"INSERT INTO favorite_sounds (user_id, sound_id) VALUES (?, ?)",
|
||||
user_id,
|
||||
self.id
|
||||
)
|
||||
.execute(db_pool)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn remove_favorite<U: Into<u64>>(
|
||||
&self,
|
||||
user_id: U,
|
||||
db_pool: impl Executor<'_, Database = Database>,
|
||||
) -> Result<(), Box<dyn std::error::Error + Send + Sync + Send>> {
|
||||
let user_id = user_id.into();
|
||||
|
||||
sqlx::query!(
|
||||
"DELETE FROM favorite_sounds WHERE user_id = ? AND sound_id = ?",
|
||||
user_id,
|
||||
self.id
|
||||
)
|
||||
.execute(db_pool)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn create_anon<G: Into<u64>, U: Into<u64>>(
|
||||
name: &str,
|
||||
src_url: &str,
|
||||
|
||||
Reference in New Issue
Block a user