+fn queries<'a>() -> Queries<
+ impl ReadFn<'a, RegistrationApplicationView, i32>,
+ impl ListFn<'a, RegistrationApplicationView, RegistrationApplicationQuery>,
+> {
+ let all_joins = |query: registration_application::BoxedQuery<'a, Pg>| {
+ query
+ .inner_join(local_user::table.on(registration_application::local_user_id.eq(local_user::id)))
+ .inner_join(person::table.on(local_user::person_id.eq(person::id)))
+ .left_join(
+ aliases::person1
+ .on(registration_application::admin_id.eq(aliases::person1.field(person::id).nullable())),
+ )
+ .order_by(registration_application::published.desc())
+ .select((
+ registration_application::all_columns,
+ local_user::all_columns,
+ person::all_columns,
+ aliases::person1.fields(person::all_columns).nullable(),
+ ))
+ };
+
+ let read = move |mut conn: DbConn<'a>, registration_application_id: i32| async move {
+ all_joins(
+ registration_application::table
+ .find(registration_application_id)
+ .into_boxed(),
+ )
+ .first::<RegistrationApplicationViewTuple>(&mut conn)
+ .await
+ };
+
+ let list = move |mut conn: DbConn<'a>, options: RegistrationApplicationQuery| async move {
+ let mut query = all_joins(registration_application::table.into_boxed());
+
+ if options.unread_only {
+ query = query.filter(registration_application::admin_id.is_null())
+ }
+
+ if options.verified_email_only {
+ query = query.filter(local_user::email_verified.eq(true))
+ }
+
+ let (limit, offset) = limit_and_offset(options.page, options.limit)?;
+
+ query = query
+ .limit(limit)
+ .offset(offset)
+ .order_by(registration_application::published.desc());
+
+ query
+ .load::<RegistrationApplicationViewTuple>(&mut conn)
+ .await
+ };
+
+ Queries::new(read, list)
+}
+