2 use diesel::{dsl::*, result::Error, sql_types::Text, *};
3 use lemmy_db_schema::{source::activity::*, Url};
9 io::{Error as IoError, ErrorKind},
12 impl Crud<ActivityForm> for Activity {
13 fn read(conn: &PgConnection, activity_id: i32) -> Result<Self, Error> {
14 use lemmy_db_schema::schema::activity::dsl::*;
15 activity.find(activity_id).first::<Self>(conn)
18 fn create(conn: &PgConnection, new_activity: &ActivityForm) -> Result<Self, Error> {
19 use lemmy_db_schema::schema::activity::dsl::*;
22 .get_result::<Self>(conn)
28 new_activity: &ActivityForm,
29 ) -> Result<Self, Error> {
30 use lemmy_db_schema::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 lemmy_db_schema::schema::activity::dsl::*;
37 diesel::delete(activity.find(activity_id)).execute(conn)
48 ) -> Result<Activity, IoError>
52 fn read_from_apub_id(conn: &PgConnection, object_id: &str) -> Result<Activity, Error>;
54 /// Returns up to 20 activities of type `Announce/Create/Page` from the community
55 fn read_community_outbox(
57 community_actor_id: &Url,
58 ) -> Result<Vec<Value>, Error>;
61 impl Activity_ for Activity {
68 ) -> Result<Activity, IoError>
72 debug!("{}", serde_json::to_string_pretty(&data)?);
73 let activity_form = ActivityForm {
75 data: serde_json::to_value(&data)?,
80 let result = Activity::create(&conn, &activity_form);
83 Err(e) => Err(IoError::new(
85 format!("Failed to insert activity into database: {}", e),
90 fn read_from_apub_id(conn: &PgConnection, object_id: &str) -> Result<Activity, Error> {
91 use lemmy_db_schema::schema::activity::dsl::*;
92 activity.filter(ap_id.eq(object_id)).first::<Self>(conn)
95 fn read_community_outbox(
97 community_actor_id: &Url,
98 ) -> Result<Vec<Value>, Error> {
99 use lemmy_db_schema::schema::activity::dsl::*;
100 let res: Vec<Value> = activity
103 sql("activity.data ->> 'type' = 'Announce'")
104 .sql(" AND activity.data -> 'object' ->> 'type' = 'Create'")
105 .sql(" AND activity.data -> 'object' -> 'object' ->> 'type' = 'Page'")
106 .sql(" AND activity.data ->> 'actor' = ")
107 .bind::<Text, _>(community_actor_id),
118 establish_unpooled_connection,
119 source::activity::Activity_,
124 use lemmy_db_schema::source::{
125 activity::{Activity, ActivityForm},
126 user::{UserForm, User_},
128 use serde_json::Value;
132 let conn = establish_unpooled_connection();
134 let creator_form = UserForm {
135 name: "activity_creator_pm".into(),
136 preferred_username: None,
137 password_encrypted: "nope".into(),
139 matrix_user_id: None,
147 theme: "browser".into(),
148 default_sort_type: SortType::Hot as i16,
149 default_listing_type: ListingType::Subscribed as i16,
150 lang: "browser".into(),
152 send_notifications_to_email: false,
158 last_refreshed_at: None,
161 let inserted_creator = User_::create(&conn, &creator_form).unwrap();
164 "https://enterprise.lemmy.ml/activities/delete/f1b5d57c-80f8-4e03-a615-688d552e946c";
165 let test_json: Value = serde_json::from_str(
167 "@context": "https://www.w3.org/ns/activitystreams",
168 "id": "https://enterprise.lemmy.ml/activities/delete/f1b5d57c-80f8-4e03-a615-688d552e946c",
170 "actor": "https://enterprise.lemmy.ml/u/riker",
171 "to": "https://www.w3.org/ns/activitystreams#Public",
173 "https://enterprise.lemmy.ml/c/main/"
175 "object": "https://enterprise.lemmy.ml/post/32"
179 let activity_form = ActivityForm {
180 ap_id: ap_id.to_string(),
181 data: test_json.to_owned(),
187 let inserted_activity = Activity::create(&conn, &activity_form).unwrap();
189 let expected_activity = Activity {
190 ap_id: Some(ap_id.to_string()),
191 id: inserted_activity.id,
194 sensitive: Some(false),
195 published: inserted_activity.published,
199 let read_activity = Activity::read(&conn, inserted_activity.id).unwrap();
200 let read_activity_by_apub_id = Activity::read_from_apub_id(&conn, ap_id).unwrap();
201 User_::delete(&conn, inserted_creator.id).unwrap();
202 Activity::delete(&conn, inserted_activity.id).unwrap();
204 assert_eq!(expected_activity, read_activity);
205 assert_eq!(expected_activity, read_activity_by_apub_id);
206 assert_eq!(expected_activity, inserted_activity);