- let (local_user, person, counts) = local_user::table
- .find(local_user_id)
- .inner_join(person::table)
+enum ListMode {
+ AdminsWithEmails,
+}
+
+fn queries<'a>(
+) -> Queries<impl ReadFn<'a, LocalUserView, ReadBy<'a>>, impl ListFn<'a, LocalUserView, ListMode>> {
+ let selection = (
+ local_user::all_columns,
+ person::all_columns,
+ person_aggregates::all_columns,
+ );
+
+ let read = move |mut conn: DbConn<'a>, search: ReadBy<'a>| async move {
+ let mut query = local_user::table.into_boxed();
+ query = match search {
+ ReadBy::Id(local_user_id) => query.filter(local_user::id.eq(local_user_id)),
+ ReadBy::Email(from_email) => query.filter(local_user::email.eq(from_email)),
+ _ => query,
+ };
+ let mut query = query.inner_join(person::table);
+ query = match search {
+ ReadBy::Person(person_id) => query.filter(person::id.eq(person_id)),
+ ReadBy::Name(name) => query.filter(lower(person::name).eq(name.to_lowercase())),
+ ReadBy::NameOrEmail(name_or_email) => query.filter(
+ lower(person::name)
+ .eq(lower(name_or_email))
+ .or(local_user::email.eq(name_or_email)),
+ ),
+ _ => query,
+ };
+ query