diff options
Diffstat (limited to 'src/db/mod.rs')
| -rw-r--r-- | src/db/mod.rs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/db/mod.rs b/src/db/mod.rs index 8657a4f..0bf2f1d 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -35,6 +35,56 @@ pub fn find_meme<T: AsRef<str>>(conn: &PgConnection, search: T) -> Result<Meme> .map_err(Error::from)
}
+pub fn delete_meme<T: AsRef<str>>(conn: &PgConnection, search: T, deleted_by: u64) -> Result<()> {
+ conn.transaction::<(), Error, _>(|| {
+ let deleted = memes::table
+ .filter(memes::title.eq(search.as_ref()))
+ .first::<Meme>(conn)?;
+
+ ::diesel::delete(memes::table)
+ .filter(memes::id.eq(deleted.id))
+ .execute(conn)?;
+
+ if let Some(image_id) = deleted.image_id {
+ let count = memes::table
+ .filter(memes::image_id.eq(image_id))
+ .count()
+ .execute(conn)?;
+
+ if count == 0 {
+ ::diesel::delete(images::table)
+ .filter(images::id.eq(image_id))
+ .execute(conn)?;
+ }
+ }
+
+ if let Some(audio_id) = deleted.audio_id {
+ let count = memes::table
+ .select(::diesel::dsl::count_star())
+ .filter(memes::audio_id.eq(audio_id))
+ .execute(conn)?;
+
+ if count == 0 {
+ ::diesel::delete(audio::table)
+ .filter(audio::id.eq(audio_id))
+ .execute(conn)?;
+ }
+ }
+
+ let tombstone = NewTombstone {
+ deleted_by: deleted_by as i64,
+ metadata_id: deleted.metadata_id,
+ meme_id: deleted.id,
+ };
+
+ let _ = ::diesel::insert_into(tombstones::table)
+ .values(&tombstone)
+ .execute(conn)?;
+
+ Ok(())
+ })
+}
+
pub fn rand_text(conn: &PgConnection) -> Result<Meme> {
memes::table
.filter(memes::content.is_not_null())
|
