11use crate :: db:: internal;
22use crate :: db:: schema;
3+ use crate :: db:: types:: RoleType ;
34use crate :: db:: types:: TrustType ;
45use crate :: db:: users:: UserProfile ;
56use crate :: db:: users:: * ;
@@ -165,6 +166,7 @@ pub fn update_user_cache(connection: &PgConnection, profile: &Profile) -> Result
165166 . execute ( connection) ?;
166167 Ok ( ( ) )
167168}
169+
168170macro_rules! scoped_search_users_for_group {
169171 ( $g: ident, $t: ident, $typ: ident, $q: ident, $trust: ident, $limit: ident, $connection: ident) => { {
170172 use schema:: $t as u;
@@ -200,6 +202,51 @@ macro_rules! scoped_search_users_for_group {
200202 } } ;
201203}
202204
205+ /*
206+ .inner_join(schema::roles::table)
207+ .on(schema::roles::role_id.eq(schema::memberships::role_id))
208+ .filter(schema::memberships::group_id.eq($g))
209+ .filter(schema::roles::typ.ne(RoleType::Member))
210+ .select(schema::memberships::all_columns))
211+ */
212+ macro_rules! scoped_search_curators_for_group {
213+ ( $g: ident, $t: ident, $typ: ident, $q: ident, $trust: ident, $limit: ident, $connection: ident) => { {
214+ use schema:: $t as u;
215+ u:: table
216+ . filter(
217+ u:: first_name
218+ . concat( " " )
219+ . concat( u:: last_name)
220+ . ilike( $q)
221+ . or( u:: first_name. ilike( $q) )
222+ . or( u:: last_name. ilike( $q) )
223+ . or( u:: username. ilike( $q) )
224+ . or( u:: email. ilike( $q) ) ,
225+ )
226+ . filter( u:: trust. ge( $trust) )
227+ . left_outer_join(
228+ schema:: memberships:: table. on( schema:: memberships:: user_uuid
229+ . eq( u:: user_uuid)
230+ . and( schema:: memberships:: group_id. eq( $g) ) ) ,
231+ )
232+ . left_outer_join(
233+ schema:: roles:: table. on( schema:: roles:: role_id. eq( schema:: memberships:: role_id) ) ,
234+ )
235+ . filter(
236+ schema:: memberships:: group_id
237+ . is_null( )
238+ . or( schema:: memberships:: group_id
239+ . ne( $g)
240+ . or( schema:: roles:: typ. eq( RoleType :: Member ) ) ) ,
241+ )
242+ . select( u:: all_columns)
243+ . limit( $limit)
244+ . get_results:: <$typ>( $connection)
245+ . map( |users| users. into_iter( ) . map( |u| u. into( ) ) . collect( ) )
246+ . map_err( Into :: into)
247+ } } ;
248+ }
249+
203250macro_rules! scoped_search_users {
204251 ( $t: ident, $typ: ident, $q: ident, $trust: ident, $limit: ident, $connection: ident) => { {
205252 use schema:: $t as u;
@@ -222,6 +269,64 @@ macro_rules! scoped_search_users {
222269 } } ;
223270}
224271
272+ pub fn search_curators_for_group (
273+ connection : & PgConnection ,
274+ group_name : & str ,
275+ scope : TrustType ,
276+ q : & str ,
277+ limit : i64 ,
278+ ) -> Result < Vec < DisplayUser > , Error > {
279+ let q: & str = & format ! ( "{}%" , q) ;
280+ let group_id = internal:: group:: get_group ( connection, group_name) ?. id ;
281+ let trust = TrustType :: Ndaed ;
282+ match scope {
283+ TrustType :: Staff => scoped_search_curators_for_group ! (
284+ group_id,
285+ users_staff,
286+ UsersStaff ,
287+ q,
288+ trust,
289+ limit,
290+ connection
291+ ) ,
292+ TrustType :: Ndaed => scoped_search_curators_for_group ! (
293+ group_id,
294+ users_ndaed,
295+ UsersNdaed ,
296+ q,
297+ trust,
298+ limit,
299+ connection
300+ ) ,
301+ TrustType :: Vouched => scoped_search_curators_for_group ! (
302+ group_id,
303+ users_vouched,
304+ UsersVouched ,
305+ q,
306+ trust,
307+ limit,
308+ connection
309+ ) ,
310+ TrustType :: Authenticated => scoped_search_curators_for_group ! (
311+ group_id,
312+ users_authenticated,
313+ UsersAuthenticated ,
314+ q,
315+ trust,
316+ limit,
317+ connection
318+ ) ,
319+ TrustType :: Public => scoped_search_curators_for_group ! (
320+ group_id,
321+ users_public,
322+ UsersPublic ,
323+ q,
324+ trust,
325+ limit,
326+ connection
327+ ) ,
328+ }
329+ }
225330pub fn search_users_for_group (
226331 connection : & PgConnection ,
227332 group_name : & str ,
0 commit comments