1 use crate::{newtypes::DbUrl, source::activity::*, traits::Crud};
2 use diesel::{dsl::*, result::Error, sql_types::Text, *};
7 io::{Error as IoError, ErrorKind},
10 impl Crud for Activity {
11 type Form = ActivityForm;
13 fn read(conn: &PgConnection, activity_id: i32) -> Result<Self, Error> {
14 use crate::schema::activity::dsl::*;
15 activity.find(activity_id).first::<Self>(conn)
18 fn create(conn: &PgConnection, new_activity: &ActivityForm) -> Result<Self, Error> {
19 use crate::schema::activity::dsl::*;
22 .get_result::<Self>(conn)
28 new_activity: &ActivityForm,
29 ) -> Result<Self, Error> {
30 use crate::schema::activity::dsl::*;
31 diesel::update(activity.find(activity_id))
33 .get_result::<Self>(conn)
35 fn delete(conn: &PgConnection, activity_id: i32) -> Result<usize, Error> {
36 use crate::schema::activity::dsl::*;
37 diesel::delete(activity.find(activity_id)).execute(conn)
48 ) -> Result<Activity, IoError>
52 let activity_form = ActivityForm {
54 data: serde_json::to_value(&data)?,
59 let result = Activity::create(conn, &activity_form);
62 Err(e) => Err(IoError::new(
64 format!("Failed to insert activity into database: {}", e),
69 pub fn read_from_apub_id(conn: &PgConnection, object_id: &DbUrl) -> Result<Activity, Error> {
70 use crate::schema::activity::dsl::*;
71 activity.filter(ap_id.eq(object_id)).first::<Self>(conn)
74 pub fn delete_olds(conn: &PgConnection) -> Result<usize, Error> {
75 use crate::schema::activity::dsl::*;
76 diesel::delete(activity.filter(published.lt(now - 6.months()))).execute(conn)
79 pub fn read_community_outbox(
81 community_actor_id: &DbUrl,
82 ) -> Result<Vec<Value>, Error> {
83 use crate::schema::activity::dsl::*;
84 let res: Vec<Value> = activity
87 sql("activity.data ->> 'type' = 'Announce'")
88 .sql(" AND activity.data -> 'object' ->> 'type' = 'Create'")
89 .sql(" AND activity.data -> 'object' -> 'object' ->> 'type' = 'Page'")
90 .sql(" AND activity.data ->> 'actor' = ")
91 .bind::<Text, _>(community_actor_id)
92 .sql(" ORDER BY activity.published DESC"),
104 establish_unpooled_connection,
107 activity::{Activity, ActivityForm},
108 person::{Person, PersonForm},
111 use serde_json::Value;
112 use serial_test::serial;
118 let conn = establish_unpooled_connection();
120 let creator_form = PersonForm {
121 name: "activity_creator_pm".into(),
122 ..PersonForm::default()
125 let inserted_creator = Person::create(&conn, &creator_form).unwrap();
127 let ap_id: DbUrl = Url::parse(
128 "https://enterprise.lemmy.ml/activities/delete/f1b5d57c-80f8-4e03-a615-688d552e946c",
132 let test_json: Value = serde_json::from_str(
134 "@context": "https://www.w3.org/ns/activitystreams",
135 "id": "https://enterprise.lemmy.ml/activities/delete/f1b5d57c-80f8-4e03-a615-688d552e946c",
137 "actor": "https://enterprise.lemmy.ml/u/riker",
138 "to": "https://www.w3.org/ns/activitystreams#Public",
140 "https://enterprise.lemmy.ml/c/main/"
142 "object": "https://enterprise.lemmy.ml/post/32"
146 let activity_form = ActivityForm {
147 ap_id: ap_id.clone(),
148 data: test_json.to_owned(),
154 let inserted_activity = Activity::create(&conn, &activity_form).unwrap();
156 let expected_activity = Activity {
157 ap_id: Some(ap_id.clone()),
158 id: inserted_activity.id,
161 sensitive: Some(false),
162 published: inserted_activity.published,
166 let read_activity = Activity::read(&conn, inserted_activity.id).unwrap();
167 let read_activity_by_apub_id = Activity::read_from_apub_id(&conn, &ap_id).unwrap();
168 Person::delete(&conn, inserted_creator.id).unwrap();
169 Activity::delete(&conn, inserted_activity.id).unwrap();
171 assert_eq!(expected_activity, read_activity);
172 assert_eq!(expected_activity, read_activity_by_apub_id);
173 assert_eq!(expected_activity, inserted_activity);