1 use crate::structs::RegistrationApplicationView;
2 use diesel::{dsl::count, result::Error, *};
4 schema::{local_user, person, person_alias_1, registration_application},
6 local_user::{LocalUser, LocalUserSettings},
7 person::{Person, PersonAlias1, PersonSafe, PersonSafeAlias1},
8 registration_application::RegistrationApplication,
10 traits::{MaybeOptional, ToSafe, ToSafeSettings, ViewToVec},
11 utils::limit_and_offset,
14 type RegistrationApplicationViewTuple = (
15 RegistrationApplication,
18 Option<PersonSafeAlias1>,
21 impl RegistrationApplicationView {
22 pub fn read(conn: &PgConnection, registration_application_id: i32) -> Result<Self, Error> {
23 let (registration_application, creator_local_user, creator, admin) =
24 registration_application::table
25 .find(registration_application_id)
27 local_user::table.on(registration_application::local_user_id.eq(local_user::id)),
29 .inner_join(person::table.on(local_user::person_id.eq(person::id)))
32 .on(registration_application::admin_id.eq(person_alias_1::id.nullable())),
34 .order_by(registration_application::published.desc())
36 registration_application::all_columns,
37 LocalUser::safe_settings_columns_tuple(),
38 Person::safe_columns_tuple(),
39 PersonAlias1::safe_columns_tuple().nullable(),
41 .first::<RegistrationApplicationViewTuple>(conn)?;
43 Ok(RegistrationApplicationView {
44 registration_application,
51 /// Returns the current unread registration_application count
52 pub fn get_unread_count(conn: &PgConnection, verified_email_only: bool) -> Result<i64, Error> {
53 let mut query = registration_application::table
54 .inner_join(local_user::table.on(registration_application::local_user_id.eq(local_user::id)))
55 .inner_join(person::table.on(local_user::person_id.eq(person::id)))
58 .on(registration_application::admin_id.eq(person_alias_1::id.nullable())),
60 .filter(registration_application::admin_id.is_null())
63 if verified_email_only {
64 query = query.filter(local_user::email_verified.eq(true))
68 .select(count(registration_application::id))
73 pub struct RegistrationApplicationQueryBuilder<'a> {
74 conn: &'a PgConnection,
75 unread_only: Option<bool>,
76 verified_email_only: Option<bool>,
81 impl<'a> RegistrationApplicationQueryBuilder<'a> {
82 pub fn create(conn: &'a PgConnection) -> Self {
83 RegistrationApplicationQueryBuilder {
86 verified_email_only: None,
92 pub fn unread_only<T: MaybeOptional<bool>>(mut self, unread_only: T) -> Self {
93 self.unread_only = unread_only.get_optional();
97 pub fn verified_email_only<T: MaybeOptional<bool>>(mut self, verified_email_only: T) -> Self {
98 self.verified_email_only = verified_email_only.get_optional();
102 pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
103 self.page = page.get_optional();
107 pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
108 self.limit = limit.get_optional();
112 pub fn list(self) -> Result<Vec<RegistrationApplicationView>, Error> {
113 let mut query = registration_application::table
114 .inner_join(local_user::table.on(registration_application::local_user_id.eq(local_user::id)))
115 .inner_join(person::table.on(local_user::person_id.eq(person::id)))
117 person_alias_1::table
118 .on(registration_application::admin_id.eq(person_alias_1::id.nullable())),
120 .order_by(registration_application::published.desc())
122 registration_application::all_columns,
123 LocalUser::safe_settings_columns_tuple(),
124 Person::safe_columns_tuple(),
125 PersonAlias1::safe_columns_tuple().nullable(),
129 if self.unread_only.unwrap_or(false) {
130 query = query.filter(registration_application::admin_id.is_null())
133 if self.verified_email_only.unwrap_or(false) {
134 query = query.filter(local_user::email_verified.eq(true))
137 let (limit, offset) = limit_and_offset(self.page, self.limit)?;
142 .order_by(registration_application::published.desc());
144 let res = query.load::<RegistrationApplicationViewTuple>(self.conn)?;
146 Ok(RegistrationApplicationView::from_tuple_to_vec(res))
150 impl ViewToVec for RegistrationApplicationView {
151 type DbTuple = RegistrationApplicationViewTuple;
152 fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
156 registration_application: a.0.to_owned(),
157 creator_local_user: a.1.to_owned(),
158 creator: a.2.to_owned(),
159 admin: a.3.to_owned(),
161 .collect::<Vec<Self>>()
167 use crate::registration_application_view::{
168 RegistrationApplicationQueryBuilder,
169 RegistrationApplicationView,
171 use lemmy_db_schema::{
173 local_user::{LocalUser, LocalUserForm, LocalUserSettings},
175 registration_application::{RegistrationApplication, RegistrationApplicationForm},
178 utils::establish_unpooled_connection,
180 use serial_test::serial;
185 let conn = establish_unpooled_connection();
187 let timmy_person_form = PersonForm {
188 name: "timmy_rav".into(),
190 public_key: Some("pubkey".to_string()),
191 ..PersonForm::default()
194 let inserted_timmy_person = Person::create(&conn, &timmy_person_form).unwrap();
196 let timmy_local_user_form = LocalUserForm {
197 person_id: Some(inserted_timmy_person.id),
198 password_encrypted: Some("nada".to_string()),
199 ..LocalUserForm::default()
202 let _inserted_timmy_local_user = LocalUser::create(&conn, &timmy_local_user_form).unwrap();
204 let sara_person_form = PersonForm {
205 name: "sara_rav".into(),
206 public_key: Some("pubkey".to_string()),
207 ..PersonForm::default()
210 let inserted_sara_person = Person::create(&conn, &sara_person_form).unwrap();
212 let sara_local_user_form = LocalUserForm {
213 person_id: Some(inserted_sara_person.id),
214 password_encrypted: Some("nada".to_string()),
215 ..LocalUserForm::default()
218 let inserted_sara_local_user = LocalUser::create(&conn, &sara_local_user_form).unwrap();
220 // Sara creates an application
221 let sara_app_form = RegistrationApplicationForm {
222 local_user_id: Some(inserted_sara_local_user.id),
223 answer: Some("LET ME IIIIINN".to_string()),
224 ..RegistrationApplicationForm::default()
227 let sara_app = RegistrationApplication::create(&conn, &sara_app_form).unwrap();
229 let read_sara_app_view = RegistrationApplicationView::read(&conn, sara_app.id).unwrap();
231 let jess_person_form = PersonForm {
232 name: "jess_rav".into(),
233 public_key: Some("pubkey".to_string()),
234 ..PersonForm::default()
237 let inserted_jess_person = Person::create(&conn, &jess_person_form).unwrap();
239 let jess_local_user_form = LocalUserForm {
240 person_id: Some(inserted_jess_person.id),
241 password_encrypted: Some("nada".to_string()),
242 ..LocalUserForm::default()
245 let inserted_jess_local_user = LocalUser::create(&conn, &jess_local_user_form).unwrap();
247 // Sara creates an application
248 let jess_app_form = RegistrationApplicationForm {
249 local_user_id: Some(inserted_jess_local_user.id),
250 answer: Some("LET ME IIIIINN".to_string()),
251 ..RegistrationApplicationForm::default()
254 let jess_app = RegistrationApplication::create(&conn, &jess_app_form).unwrap();
256 let read_jess_app_view = RegistrationApplicationView::read(&conn, jess_app.id).unwrap();
258 let mut expected_sara_app_view = RegistrationApplicationView {
259 registration_application: sara_app.to_owned(),
260 creator_local_user: LocalUserSettings {
261 id: inserted_sara_local_user.id,
262 person_id: inserted_sara_local_user.person_id,
263 email: inserted_sara_local_user.email,
264 show_nsfw: inserted_sara_local_user.show_nsfw,
265 theme: inserted_sara_local_user.theme,
266 default_sort_type: inserted_sara_local_user.default_sort_type,
267 default_listing_type: inserted_sara_local_user.default_listing_type,
268 lang: inserted_sara_local_user.lang,
269 show_avatars: inserted_sara_local_user.show_avatars,
270 send_notifications_to_email: inserted_sara_local_user.send_notifications_to_email,
271 validator_time: inserted_sara_local_user.validator_time,
272 show_bot_accounts: inserted_sara_local_user.show_bot_accounts,
273 show_scores: inserted_sara_local_user.show_scores,
274 show_read_posts: inserted_sara_local_user.show_read_posts,
275 show_new_post_notifs: inserted_sara_local_user.show_new_post_notifs,
276 email_verified: inserted_sara_local_user.email_verified,
277 accepted_application: inserted_sara_local_user.accepted_application,
279 creator: PersonSafe {
280 id: inserted_sara_person.id,
281 name: inserted_sara_person.name.to_owned(),
283 published: inserted_sara_person.published,
285 actor_id: inserted_sara_person.actor_id.to_owned(),
295 inbox_url: inserted_sara_person.inbox_url.to_owned(),
296 shared_inbox_url: None,
297 matrix_user_id: None,
302 assert_eq!(read_sara_app_view, expected_sara_app_view);
304 // Do a batch read of the applications
305 let apps = RegistrationApplicationQueryBuilder::create(&conn)
313 read_jess_app_view.to_owned(),
314 expected_sara_app_view.to_owned()
318 // Make sure the counts are correct
319 let unread_count = RegistrationApplicationView::get_unread_count(&conn, false).unwrap();
320 assert_eq!(unread_count, 2);
322 // Approve the application
323 let approve_form = RegistrationApplicationForm {
324 admin_id: Some(inserted_timmy_person.id),
326 ..RegistrationApplicationForm::default()
329 RegistrationApplication::update(&conn, sara_app.id, &approve_form).unwrap();
331 // Update the local_user row
332 let approve_local_user_form = LocalUserForm {
333 accepted_application: Some(true),
334 ..LocalUserForm::default()
337 LocalUser::update(&conn, inserted_sara_local_user.id, &approve_local_user_form).unwrap();
339 let read_sara_app_view_after_approve =
340 RegistrationApplicationView::read(&conn, sara_app.id).unwrap();
342 // Make sure the columns changed
343 expected_sara_app_view
345 .accepted_application = true;
346 expected_sara_app_view.registration_application.admin_id = Some(inserted_timmy_person.id);
348 expected_sara_app_view.admin = Some(PersonSafeAlias1 {
349 id: inserted_timmy_person.id,
350 name: inserted_timmy_person.name.to_owned(),
352 published: inserted_timmy_person.published,
354 actor_id: inserted_timmy_person.actor_id.to_owned(),
364 inbox_url: inserted_timmy_person.inbox_url.to_owned(),
365 shared_inbox_url: None,
366 matrix_user_id: None,
368 assert_eq!(read_sara_app_view_after_approve, expected_sara_app_view);
370 // Do a batch read of apps again
371 // It should show only jessicas which is unresolved
372 let apps_after_resolve = RegistrationApplicationQueryBuilder::create(&conn)
376 assert_eq!(apps_after_resolve, vec![read_jess_app_view]);
378 // Make sure the counts are correct
379 let unread_count_after_approve =
380 RegistrationApplicationView::get_unread_count(&conn, false).unwrap();
381 assert_eq!(unread_count_after_approve, 1);
383 // Make sure the not undenied_only has all the apps
384 let all_apps = RegistrationApplicationQueryBuilder::create(&conn)
387 assert_eq!(all_apps.len(), 2);
389 Person::delete(&conn, inserted_timmy_person.id).unwrap();
390 Person::delete(&conn, inserted_sara_person.id).unwrap();
391 Person::delete(&conn, inserted_jess_person.id).unwrap();