1 use crate::{newtypes::DbUrl, source::activity::*, traits::Crud};
2 use diesel::{dsl::*, result::Error, *};
4 use std::io::{Error as IoError, ErrorKind};
6 impl Crud for Activity {
7 type Form = ActivityForm;
9 fn read(conn: &PgConnection, activity_id: i32) -> Result<Self, Error> {
10 use crate::schema::activity::dsl::*;
11 activity.find(activity_id).first::<Self>(conn)
14 fn create(conn: &PgConnection, new_activity: &ActivityForm) -> Result<Self, Error> {
15 use crate::schema::activity::dsl::*;
18 .get_result::<Self>(conn)
24 new_activity: &ActivityForm,
25 ) -> Result<Self, Error> {
26 use crate::schema::activity::dsl::*;
27 diesel::update(activity.find(activity_id))
29 .get_result::<Self>(conn)
31 fn delete(conn: &PgConnection, activity_id: i32) -> Result<usize, Error> {
32 use crate::schema::activity::dsl::*;
33 diesel::delete(activity.find(activity_id)).execute(conn)
44 ) -> Result<Activity, IoError> {
45 let activity_form = ActivityForm {
52 let result = Activity::create(conn, &activity_form);
55 Err(e) => Err(IoError::new(
57 format!("Failed to insert activity into database: {}", e),
62 pub fn read_from_apub_id(conn: &PgConnection, object_id: &DbUrl) -> Result<Activity, Error> {
63 use crate::schema::activity::dsl::*;
64 activity.filter(ap_id.eq(object_id)).first::<Self>(conn)
67 pub fn delete_olds(conn: &PgConnection) -> Result<usize, Error> {
68 use crate::schema::activity::dsl::*;
69 diesel::delete(activity.filter(published.lt(now - 6.months()))).execute(conn)
77 establish_unpooled_connection,
80 activity::{Activity, ActivityForm},
81 person::{Person, PersonForm},
84 use serde_json::Value;
85 use serial_test::serial;
91 let conn = establish_unpooled_connection();
93 let creator_form = PersonForm {
94 name: "activity_creator_pm".into(),
95 ..PersonForm::default()
98 let inserted_creator = Person::create(&conn, &creator_form).unwrap();
100 let ap_id: DbUrl = Url::parse(
101 "https://enterprise.lemmy.ml/activities/delete/f1b5d57c-80f8-4e03-a615-688d552e946c",
105 let test_json: Value = serde_json::from_str(
107 "@context": "https://www.w3.org/ns/activitystreams",
108 "id": "https://enterprise.lemmy.ml/activities/delete/f1b5d57c-80f8-4e03-a615-688d552e946c",
110 "actor": "https://enterprise.lemmy.ml/u/riker",
111 "to": "https://www.w3.org/ns/activitystreams#Public",
113 "https://enterprise.lemmy.ml/c/main/"
115 "object": "https://enterprise.lemmy.ml/post/32"
119 let activity_form = ActivityForm {
120 ap_id: ap_id.clone(),
121 data: test_json.to_owned(),
127 let inserted_activity = Activity::create(&conn, &activity_form).unwrap();
129 let expected_activity = Activity {
130 ap_id: ap_id.clone(),
131 id: inserted_activity.id,
134 sensitive: Some(false),
135 published: inserted_activity.published,
139 let read_activity = Activity::read(&conn, inserted_activity.id).unwrap();
140 let read_activity_by_apub_id = Activity::read_from_apub_id(&conn, &ap_id).unwrap();
141 Person::delete(&conn, inserted_creator.id).unwrap();
142 Activity::delete(&conn, inserted_activity.id).unwrap();
144 assert_eq!(expected_activity, read_activity);
145 assert_eq!(expected_activity, read_activity_by_apub_id);
146 assert_eq!(expected_activity, inserted_activity);