Plume/plume-models/src/tags.rs

148 lines
3.8 KiB
Rust
Raw Normal View History

2020-01-21 06:02:03 +00:00
use crate::{ap_url, instance::Instance, schema::tags, Connection, Error, Result};
use activitystreams::iri_string::types::IriString;
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
2022-05-02 15:10:51 +00:00
use plume_common::activity_pub::{Hashtag, HashtagExt};
2018-09-05 18:05:53 +00:00
#[derive(Clone, Identifiable, Queryable)]
2018-09-05 18:05:53 +00:00
pub struct Tag {
pub id: i32,
pub tag: String,
pub is_hashtag: bool,
pub post_id: i32,
2018-09-05 18:05:53 +00:00
}
#[derive(Insertable)]
#[table_name = "tags"]
pub struct NewTag {
pub tag: String,
pub is_hashtag: bool,
pub post_id: i32,
2018-09-05 18:05:53 +00:00
}
impl Tag {
insert!(tags, NewTag);
get!(tags);
find_by!(tags, find_by_name, tag as &str);
list_by!(tags, for_post, post_id as i32);
2018-09-06 08:21:08 +00:00
2022-05-02 16:26:15 +00:00
pub fn to_activity(&self) -> Result<Hashtag> {
2022-05-02 15:10:51 +00:00
let mut ht = Hashtag::new();
ht.set_href(
ap_url(&format!(
"{}/tag/{}",
Instance::get_local()?.public_domain,
self.tag
))
.parse::<IriString>()?,
);
ht.set_name(self.tag.clone());
Ok(ht)
}
pub fn from_activity(
2022-03-06 12:19:56 +00:00
conn: &Connection,
2022-05-02 15:10:51 +00:00
tag: &Hashtag,
2022-03-06 12:19:56 +00:00
post: i32,
is_hashtag: bool,
) -> Result<Tag> {
Tag::insert(
conn,
NewTag {
tag: tag.name().ok_or(Error::MissingApProperty)?.as_str().into(),
is_hashtag,
post_id: post,
},
)
}
2022-05-02 16:26:15 +00:00
pub fn build_activity(tag: String) -> Result<Hashtag> {
2022-05-02 15:10:51 +00:00
let mut ht = Hashtag::new();
ht.set_href(
ap_url(&format!(
"{}/tag/{}",
Instance::get_local()?.public_domain,
tag
))
.parse::<IriString>()?,
);
ht.set_name(tag);
Ok(ht)
}
pub fn delete(&self, conn: &Connection) -> Result<()> {
diesel::delete(self)
.execute(conn)
.map(|_| ())
.map_err(Error::from)
2018-10-20 12:05:41 +00:00
}
2018-09-05 18:05:53 +00:00
}
2022-02-27 12:47:40 +00:00
#[cfg(test)]
mod tests {
use super::*;
use crate::tests::db;
2022-03-06 11:22:36 +00:00
use crate::{diesel::Connection, inbox::tests::fill_database};
2022-02-27 12:47:40 +00:00
use assert_json_diff::assert_json_eq;
use serde_json::to_value;
2022-05-02 12:00:44 +00:00
#[test]
fn from_activity() {
2022-05-02 12:00:44 +00:00
let conn = &db();
conn.test_transaction::<_, Error, _>(|| {
let (posts, _users, _blogs) = fill_database(conn);
let post_id = posts[0].id;
2022-05-02 15:10:51 +00:00
let mut ht = Hashtag::new();
2023-01-02 17:45:13 +00:00
ht.set_href(ap_url("https://plu.me/tag/a_tag").parse::<IriString>()?);
2022-05-02 12:00:44 +00:00
ht.set_name("a_tag".to_string());
let tag = Tag::from_activity(conn, &ht, post_id, true)?;
2022-05-02 12:00:44 +00:00
assert_eq!(&tag.tag, "a_tag");
assert!(tag.is_hashtag);
Ok(())
});
}
#[test]
2022-05-02 16:26:15 +00:00
fn to_activity() {
let conn = &db();
conn.test_transaction::<_, Error, _>(|| {
fill_database(conn);
let tag = Tag {
id: 0,
tag: "a_tag".into(),
is_hashtag: false,
post_id: 0,
};
2022-05-02 16:26:15 +00:00
let act = tag.to_activity()?;
let expected = json!({
"href": "https://plu.me/tag/a_tag",
"name": "a_tag",
"type": "Hashtag"
});
assert_json_eq!(to_value(&act)?, expected);
Ok(())
})
}
#[test]
2022-05-02 16:26:15 +00:00
fn build_activity() {
let conn = &db();
conn.test_transaction::<_, Error, _>(|| {
fill_database(conn);
2022-05-02 16:26:15 +00:00
let act = Tag::build_activity("a_tag".into())?;
let expected = json!({
"href": "https://plu.me/tag/a_tag",
"name": "a_tag",
"type": "Hashtag"
});
assert_json_eq!(to_value(&act)?, expected);
Ok(())
});
}
2022-02-27 12:47:40 +00:00
}