1 use crate::{schema::activity, Crud};
2 use diesel::{dsl::*, result::Error, *};
8 io::{Error as IoError, ErrorKind},
11 #[derive(Queryable, Identifiable, PartialEq, Debug)]
12 #[table_name = "activity"]
19 pub published: chrono::NaiveDateTime,
20 pub updated: Option<chrono::NaiveDateTime>,
23 #[derive(Insertable, AsChangeset)]
24 #[table_name = "activity"]
25 pub struct ActivityForm {
30 pub updated: Option<chrono::NaiveDateTime>,
33 impl Crud<ActivityForm> for Activity {
34 fn read(conn: &PgConnection, activity_id: i32) -> Result<Self, Error> {
35 use crate::schema::activity::dsl::*;
36 activity.find(activity_id).first::<Self>(conn)
39 fn create(conn: &PgConnection, new_activity: &ActivityForm) -> Result<Self, Error> {
40 use crate::schema::activity::dsl::*;
43 .get_result::<Self>(conn)
49 new_activity: &ActivityForm,
50 ) -> Result<Self, Error> {
51 use crate::schema::activity::dsl::*;
52 diesel::update(activity.find(activity_id))
54 .get_result::<Self>(conn)
65 ) -> Result<Self, IoError>
69 debug!("inserting activity for user {}: ", user_id);
70 debug!("{}", serde_json::to_string_pretty(&data)?);
71 let activity_form = ActivityForm {
74 data: serde_json::to_value(&data)?,
78 let result = Activity::create(&conn, &activity_form);
81 Err(e) => Err(IoError::new(
83 format!("Failed to insert activity into database: {}", e),
88 pub fn read_from_apub_id(conn: &PgConnection, object_id: &str) -> Result<Self, Error> {
89 use crate::schema::activity::dsl::*;
90 activity.filter(ap_id.eq(object_id)).first::<Self>(conn)
97 activity::{Activity, ActivityForm},
98 tests::establish_unpooled_connection,
99 user::{UserForm, User_},
104 use serde_json::Value;
108 let conn = establish_unpooled_connection();
110 let creator_form = UserForm {
111 name: "activity_creator_pm".into(),
112 preferred_username: None,
113 password_encrypted: "nope".into(),
115 matrix_user_id: None,
123 theme: "browser".into(),
124 default_sort_type: SortType::Hot as i16,
125 default_listing_type: ListingType::Subscribed as i16,
126 lang: "browser".into(),
128 send_notifications_to_email: false,
134 last_refreshed_at: None,
137 let inserted_creator = User_::create(&conn, &creator_form).unwrap();
140 "https://enterprise.lemmy.ml/activities/delete/f1b5d57c-80f8-4e03-a615-688d552e946c";
141 let test_json: Value = serde_json::from_str(
143 "@context": "https://www.w3.org/ns/activitystreams",
144 "id": "https://enterprise.lemmy.ml/activities/delete/f1b5d57c-80f8-4e03-a615-688d552e946c",
146 "actor": "https://enterprise.lemmy.ml/u/riker",
147 "to": "https://www.w3.org/ns/activitystreams#Public",
149 "https://enterprise.lemmy.ml/c/main/"
151 "object": "https://enterprise.lemmy.ml/post/32"
155 let activity_form = ActivityForm {
156 ap_id: ap_id.to_string(),
157 user_id: inserted_creator.id,
158 data: test_json.to_owned(),
163 let inserted_activity = Activity::create(&conn, &activity_form).unwrap();
165 let expected_activity = Activity {
166 ap_id: ap_id.to_string(),
167 id: inserted_activity.id,
168 user_id: inserted_creator.id,
171 published: inserted_activity.published,
175 let read_activity = Activity::read(&conn, inserted_activity.id).unwrap();
176 let read_activity_by_apub_id = Activity::read_from_apub_id(&conn, ap_id).unwrap();
177 User_::delete(&conn, inserted_creator.id).unwrap();
179 assert_eq!(expected_activity, read_activity);
180 assert_eq!(expected_activity, read_activity_by_apub_id);
181 assert_eq!(expected_activity, inserted_activity);