2 newtypes::{DbUrl, PersonId},
3 schema::person::dsl::*,
4 source::person::{Person, PersonInsertForm, PersonUpdateForm},
5 traits::{ApubActor, Crud},
6 utils::{functions::lower, naive_now},
15 TextExpressionMethods,
19 use crate::{schema::person::columns::*, source::person::Person, traits::ToSafe};
43 impl ToSafe for Person {
44 type SafeColumns = Columns;
45 fn safe_columns_tuple() -> Self::SafeColumns {
71 impl Crud for Person {
72 type InsertForm = PersonInsertForm;
73 type UpdateForm = PersonUpdateForm;
74 type IdType = PersonId;
75 fn read(conn: &mut PgConnection, person_id: PersonId) -> Result<Self, Error> {
77 .filter(deleted.eq(false))
81 fn delete(conn: &mut PgConnection, person_id: PersonId) -> Result<usize, Error> {
82 diesel::delete(person.find(person_id)).execute(conn)
84 fn create(conn: &mut PgConnection, form: &PersonInsertForm) -> Result<Self, Error> {
87 .on_conflict(actor_id)
90 .get_result::<Self>(conn)
93 conn: &mut PgConnection,
95 form: &PersonUpdateForm,
96 ) -> Result<Self, Error> {
97 diesel::update(person.find(person_id))
99 .get_result::<Self>(conn)
104 pub fn delete_account(conn: &mut PgConnection, person_id: PersonId) -> Result<Person, Error> {
105 use crate::schema::local_user;
107 // Set the local user info to none
108 diesel::update(local_user::table.filter(local_user::person_id.eq(person_id)))
110 local_user::email.eq::<Option<String>>(None),
111 local_user::validator_time.eq(naive_now()),
115 diesel::update(person.find(person_id))
117 display_name.eq::<Option<String>>(None),
118 avatar.eq::<Option<String>>(None),
119 banner.eq::<Option<String>>(None),
120 bio.eq::<Option<String>>(None),
121 matrix_user_id.eq::<Option<String>>(None),
123 updated.eq(naive_now()),
125 .get_result::<Self>(conn)
129 pub fn is_banned(banned_: bool, expires: Option<chrono::NaiveDateTime>) -> bool {
130 if let Some(expires) = expires {
131 banned_ && expires.gt(&naive_now())
137 impl ApubActor for Person {
138 fn read_from_apub_id(conn: &mut PgConnection, object_id: &DbUrl) -> Result<Option<Self>, Error> {
139 use crate::schema::person::dsl::*;
142 .filter(deleted.eq(false))
143 .filter(actor_id.eq(object_id))
144 .first::<Person>(conn)
151 conn: &mut PgConnection,
153 include_deleted: bool,
154 ) -> Result<Person, Error> {
157 .filter(local.eq(true))
158 .filter(lower(name).eq(lower(from_name)));
159 if !include_deleted {
160 q = q.filter(deleted.eq(false))
162 q.first::<Self>(conn)
165 fn read_from_name_and_domain(
166 conn: &mut PgConnection,
168 protocol_domain: &str,
169 ) -> Result<Person, Error> {
170 use crate::schema::person::dsl::*;
172 .filter(lower(name).eq(lower(person_name)))
173 .filter(actor_id.like(format!("{}%", protocol_domain)))
181 source::{instance::Instance, person::*},
183 utils::establish_unpooled_connection,
185 use serial_test::serial;
190 let conn = &mut establish_unpooled_connection();
192 let inserted_instance = Instance::create(conn, "my_domain.tld").unwrap();
194 let new_person = PersonInsertForm::builder()
195 .name("holly".into())
196 .public_key("nada".to_owned())
197 .instance_id(inserted_instance.id)
200 let inserted_person = Person::create(conn, &new_person).unwrap();
202 let expected_person = Person {
203 id: inserted_person.id,
204 name: "holly".into(),
210 published: inserted_person.published,
212 actor_id: inserted_person.actor_id.to_owned(),
218 public_key: "nada".to_owned(),
219 last_refreshed_at: inserted_person.published,
220 inbox_url: inserted_person.inbox_url.to_owned(),
221 shared_inbox_url: None,
222 matrix_user_id: None,
224 instance_id: inserted_instance.id,
227 let read_person = Person::read(conn, inserted_person.id).unwrap();
229 let update_person_form = PersonUpdateForm::builder()
230 .actor_id(Some(inserted_person.actor_id.to_owned()))
232 let updated_person = Person::update(conn, inserted_person.id, &update_person_form).unwrap();
234 let num_deleted = Person::delete(conn, inserted_person.id).unwrap();
235 Instance::delete(conn, inserted_instance.id).unwrap();
237 assert_eq!(expected_person, read_person);
238 assert_eq!(expected_person, inserted_person);
239 assert_eq!(expected_person, updated_person);
240 assert_eq!(1, num_deleted);