diff --git a/plume-models/src/tags.rs b/plume-models/src/tags.rs index fa961136..c15dd14e 100644 --- a/plume-models/src/tags.rs +++ b/plume-models/src/tags.rs @@ -5,7 +5,7 @@ use {ap_url, Connection}; use instance::Instance; use schema::tags; -#[derive(Serialize, Queryable, Clone)] +#[derive(Clone, Identifiable, Serialize, Queryable)] pub struct Tag { pub id: i32, pub tag: String, @@ -44,4 +44,8 @@ impl Tag { post_id: post }) } + + pub fn delete(&self, conn: &Connection) { + diesel::delete(self).execute(conn).expect("Tag::delete: database error"); + } } diff --git a/src/routes/posts.rs b/src/routes/posts.rs index 3a81a328..567d6111 100644 --- a/src/routes/posts.rs +++ b/src/routes/posts.rs @@ -212,14 +212,21 @@ fn update(blog: String, slug: String, user: User, conn: DbConn, data: LenientFor } } - let old_tags = Tag::for_post(&*conn, post.id).into_iter().map(|t| t.tag).collect::>(); - let tags = form.tags.split(",").map(|t| t.trim().to_camel_case()).filter(|t| t.len() > 0 && !old_tags.contains(t)); - for tag in tags { - Tag::insert(&*conn, NewTag { - tag: tag, - is_hastag: false, - post_id: post.id - }); + let old_tags = Tag::for_post(&*conn, post.id).into_iter().collect::>(); + let tags = form.tags.split(",").map(|t| t.trim().to_camel_case()).filter(|t| t.len() > 0).collect::>(); + for tag in tags.iter() { + if old_tags.iter().all(|ot| &ot.tag!=tag) { + Tag::insert(&*conn, NewTag { + tag: tag.clone(), + is_hastag: false, + post_id: post.id + }); + } + } + for ot in old_tags { + if !tags.contains(&ot.tag) { + ot.delete(&conn); + } } if post.published {