Skip to content

Commit b0f782c

Browse files
committed
Add query param to Brig
1 parent d6f3e2c commit b0f782c

File tree

8 files changed

+188
-97
lines changed

8 files changed

+188
-97
lines changed

libs/wire-api/src/Wire/API/Routes/Public/Brig.hs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1740,6 +1740,13 @@ type SearchAPI =
17401740
]
17411741
"email"
17421742
EmailVerificationFilter
1743+
:> QueryParam'
1744+
[ Optional,
1745+
Strict,
1746+
Description "Optional, return only non-seacrhable members when false."
1747+
]
1748+
"searchable"
1749+
Bool
17431750
:> MultiVerb
17441751
'GET
17451752
'[JSON]

libs/wire-api/src/Wire/API/User/Search.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,8 @@ data TeamContact = TeamContact
192192
teamContactRole :: Maybe Role,
193193
teamContactScimExternalId :: Maybe Text,
194194
teamContactSso :: Maybe Sso,
195-
teamContactEmailUnvalidated :: Maybe EmailAddress
195+
teamContactEmailUnvalidated :: Maybe EmailAddress,
196+
teamContactSearchable :: Maybe Bool
196197
}
197198
deriving stock (Eq, Show, Generic)
198199
deriving (Arbitrary) via (GenericUniform TeamContact)
@@ -215,6 +216,7 @@ instance ToSchema TeamContact where
215216
<*> teamContactScimExternalId .= optField "scim_external_id" (maybeWithDefault Aeson.Null schema)
216217
<*> teamContactSso .= optField "sso" (maybeWithDefault Aeson.Null schema)
217218
<*> teamContactEmailUnvalidated .= optField "email_unvalidated" (maybeWithDefault Aeson.Null schema)
219+
<*> teamContactSearchable .= optField "searchable" (maybeWithDefault Aeson.Null schema)
218220

219221
data TeamUserSearchSortBy
220222
= SortByName

libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/SearchResult_20TeamContact_user.hs

Lines changed: 112 additions & 56 deletions
Large diffs are not rendered by default.

libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/TeamContact_user.hs

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ testObject_TeamContact_user_1 =
4040
teamContactRole = Just RoleAdmin,
4141
teamContactScimExternalId = Just "0307979d-c742-4421-954a-9ceb1f22e58f",
4242
teamContactSso = Nothing,
43-
teamContactEmailUnvalidated = Nothing
43+
teamContactEmailUnvalidated = Nothing,
44+
teamContactSearchable = Nothing
4445
}
4546

4647
testObject_TeamContact_user_2 :: TeamContact
@@ -58,7 +59,8 @@ testObject_TeamContact_user_2 =
5859
teamContactRole = Just RoleExternalPartner,
5960
teamContactScimExternalId = Nothing,
6061
teamContactSso = Nothing,
61-
teamContactEmailUnvalidated = Nothing
62+
teamContactEmailUnvalidated = Nothing,
63+
teamContactSearchable = Nothing
6264
}
6365

6466
testObject_TeamContact_user_3 :: TeamContact
@@ -76,7 +78,8 @@ testObject_TeamContact_user_3 =
7678
teamContactRole = Just RoleMember,
7779
teamContactScimExternalId = Nothing,
7880
teamContactSso = Just (Sso "https://example.com/issuer/123" "0307979d-c742-4421-954a-9ceb1f22e58f"),
79-
teamContactEmailUnvalidated = Nothing
81+
teamContactEmailUnvalidated = Nothing,
82+
teamContactSearchable = Nothing
8083
}
8184

8285
testObject_TeamContact_user_4 :: TeamContact
@@ -94,7 +97,8 @@ testObject_TeamContact_user_4 =
9497
teamContactRole = Nothing,
9598
teamContactScimExternalId = Nothing,
9699
teamContactSso = Nothing,
97-
teamContactEmailUnvalidated = Just (unsafeEmailAddress "some" "example")
100+
teamContactEmailUnvalidated = Just (unsafeEmailAddress "some" "example"),
101+
teamContactSearchable = Nothing
98102
}
99103

100104
testObject_TeamContact_user_5 :: TeamContact
@@ -112,7 +116,8 @@ testObject_TeamContact_user_5 =
112116
teamContactRole = Just RoleExternalPartner,
113117
teamContactScimExternalId = Nothing,
114118
teamContactSso = Nothing,
115-
teamContactEmailUnvalidated = Nothing
119+
teamContactEmailUnvalidated = Nothing,
120+
teamContactSearchable = Nothing
116121
}
117122

118123
testObject_TeamContact_user_6 :: TeamContact
@@ -130,7 +135,8 @@ testObject_TeamContact_user_6 =
130135
teamContactRole = Nothing,
131136
teamContactScimExternalId = Nothing,
132137
teamContactSso = Nothing,
133-
teamContactEmailUnvalidated = Nothing
138+
teamContactEmailUnvalidated = Nothing,
139+
teamContactSearchable = Nothing
134140
}
135141

136142
testObject_TeamContact_user_7 :: TeamContact
@@ -148,7 +154,8 @@ testObject_TeamContact_user_7 =
148154
teamContactRole = Just RoleAdmin,
149155
teamContactScimExternalId = Just "0307979d-c742-4421-954a-9ceb1f22e58f",
150156
teamContactSso = Nothing,
151-
teamContactEmailUnvalidated = Just (unsafeEmailAddress "some" "example")
157+
teamContactEmailUnvalidated = Just (unsafeEmailAddress "some" "example"),
158+
teamContactSearchable = Nothing
152159
}
153160

154161
testObject_TeamContact_user_8 :: TeamContact
@@ -166,7 +173,8 @@ testObject_TeamContact_user_8 =
166173
teamContactRole = Just RoleMember,
167174
teamContactScimExternalId = Nothing,
168175
teamContactSso = Nothing,
169-
teamContactEmailUnvalidated = Nothing
176+
teamContactEmailUnvalidated = Nothing,
177+
teamContactSearchable = Nothing
170178
}
171179

172180
testObject_TeamContact_user_9 :: TeamContact
@@ -184,7 +192,8 @@ testObject_TeamContact_user_9 =
184192
teamContactRole = Just RoleAdmin,
185193
teamContactScimExternalId = Nothing,
186194
teamContactSso = Nothing,
187-
teamContactEmailUnvalidated = Nothing
195+
teamContactEmailUnvalidated = Nothing,
196+
teamContactSearchable = Nothing
188197
}
189198

190199
testObject_TeamContact_user_10 :: TeamContact
@@ -202,7 +211,8 @@ testObject_TeamContact_user_10 =
202211
teamContactRole = Just RoleMember,
203212
teamContactScimExternalId = Nothing,
204213
teamContactSso = Just (Sso "https://example.com/issuer/123" "0307979d-c742-4421-954a-9ceb1f22e58f"),
205-
teamContactEmailUnvalidated = Nothing
214+
teamContactEmailUnvalidated = Nothing,
215+
teamContactSearchable = Nothing
206216
}
207217

208218
testObject_TeamContact_user_11 :: TeamContact
@@ -220,7 +230,8 @@ testObject_TeamContact_user_11 =
220230
teamContactRole = Just RoleExternalPartner,
221231
teamContactScimExternalId = Nothing,
222232
teamContactSso = Nothing,
223-
teamContactEmailUnvalidated = Nothing
233+
teamContactEmailUnvalidated = Nothing,
234+
teamContactSearchable = Nothing
224235
}
225236

226237
testObject_TeamContact_user_12 :: TeamContact
@@ -238,7 +249,8 @@ testObject_TeamContact_user_12 =
238249
teamContactRole = Nothing,
239250
teamContactScimExternalId = Nothing,
240251
teamContactSso = Nothing,
241-
teamContactEmailUnvalidated = Nothing
252+
teamContactEmailUnvalidated = Nothing,
253+
teamContactSearchable = Nothing
242254
}
243255

244256
testObject_TeamContact_user_13 :: TeamContact
@@ -256,7 +268,8 @@ testObject_TeamContact_user_13 =
256268
teamContactRole = Just RoleMember,
257269
teamContactScimExternalId = Just "0307979d-c742-4421-954a-9ceb1f22e58f",
258270
teamContactSso = Nothing,
259-
teamContactEmailUnvalidated = Nothing
271+
teamContactEmailUnvalidated = Nothing,
272+
teamContactSearchable = Nothing
260273
}
261274

262275
testObject_TeamContact_user_14 :: TeamContact
@@ -274,7 +287,8 @@ testObject_TeamContact_user_14 =
274287
teamContactRole = Just RoleExternalPartner,
275288
teamContactScimExternalId = Just "0307979d-c742-4421-954a-9ceb1f22e58f",
276289
teamContactSso = Nothing,
277-
teamContactEmailUnvalidated = Nothing
290+
teamContactEmailUnvalidated = Nothing,
291+
teamContactSearchable = Nothing
278292
}
279293

280294
testObject_TeamContact_user_15 :: TeamContact
@@ -292,7 +306,8 @@ testObject_TeamContact_user_15 =
292306
teamContactRole = Just RoleExternalPartner,
293307
teamContactScimExternalId = Nothing,
294308
teamContactSso = Nothing,
295-
teamContactEmailUnvalidated = Just (unsafeEmailAddress "some" "example")
309+
teamContactEmailUnvalidated = Just (unsafeEmailAddress "some" "example"),
310+
teamContactSearchable = Nothing
296311
}
297312

298313
testObject_TeamContact_user_16 :: TeamContact
@@ -310,7 +325,8 @@ testObject_TeamContact_user_16 =
310325
teamContactRole = Nothing,
311326
teamContactScimExternalId = Nothing,
312327
teamContactSso = Just (Sso "https://example.com/issuer/123" "0307979d-c742-4421-954a-9ceb1f22e58f"),
313-
teamContactEmailUnvalidated = Just (unsafeEmailAddress "some" "example")
328+
teamContactEmailUnvalidated = Just (unsafeEmailAddress "some" "example"),
329+
teamContactSearchable = Nothing
314330
}
315331

316332
testObject_TeamContact_user_17 :: TeamContact
@@ -328,7 +344,8 @@ testObject_TeamContact_user_17 =
328344
teamContactRole = Just RoleOwner,
329345
teamContactScimExternalId = Just "0307979d-c742-4421-954a-9ceb1f22e58f",
330346
teamContactSso = Just (Sso "https://example.com/issuer/123" "0307979d-c742-4421-954a-9ceb1f22e58f"),
331-
teamContactEmailUnvalidated = Nothing
347+
teamContactEmailUnvalidated = Nothing,
348+
teamContactSearchable = Nothing
332349
}
333350

334351
testObject_TeamContact_user_18 :: TeamContact
@@ -346,7 +363,8 @@ testObject_TeamContact_user_18 =
346363
teamContactRole = Just RoleOwner,
347364
teamContactScimExternalId = Nothing,
348365
teamContactSso = Just (Sso "https://example.com/issuer/123" "0307979d-c742-4421-954a-9ceb1f22e58f"),
349-
teamContactEmailUnvalidated = Nothing
366+
teamContactEmailUnvalidated = Nothing,
367+
teamContactSearchable = Nothing
350368
}
351369

352370
testObject_TeamContact_user_19 :: TeamContact
@@ -364,7 +382,8 @@ testObject_TeamContact_user_19 =
364382
teamContactRole = Just RoleExternalPartner,
365383
teamContactScimExternalId = Nothing,
366384
teamContactSso = Just (Sso "https://example.com/issuer/123" "0307979d-c742-4421-954a-9ceb1f22e58f"),
367-
teamContactEmailUnvalidated = Nothing
385+
teamContactEmailUnvalidated = Nothing,
386+
teamContactSearchable = Nothing
368387
}
369388

370389
testObject_TeamContact_user_20 :: TeamContact
@@ -382,5 +401,6 @@ testObject_TeamContact_user_20 =
382401
teamContactRole = Just RoleOwner,
383402
teamContactScimExternalId = Just "0307979d-c742-4421-954a-9ceb1f22e58f",
384403
teamContactSso = Nothing,
385-
teamContactEmailUnvalidated = Just (unsafeEmailAddress "some" "example")
404+
teamContactEmailUnvalidated = Just (unsafeEmailAddress "some" "example"),
405+
teamContactSearchable = Nothing
386406
}

libs/wire-subsystems/src/Wire/IndexedUserStore/ElasticSearch.hs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ paginateTeamMembersImpl ::
246246
Sem r (SearchResult UserDoc)
247247
paginateTeamMembersImpl cfg BrowseTeamFilters {..} maxResults mPagingState = do
248248
let (IndexQuery q f sortSpecs) =
249-
teamUserSearchQuery teamId mQuery mRoleFilter mSortBy mSortOrder mEmailVerificationFilter
249+
teamUserSearchQuery teamId mQuery mRoleFilter mSortBy mSortOrder mEmailVerificationFilter mSearchable
250250
let search =
251251
(ES.mkSearch (Just q) (Just f))
252252
{ -- we are requesting one more result than the page size to determine if there is a next page
@@ -312,8 +312,9 @@ teamUserSearchQuery ::
312312
Maybe TeamUserSearchSortBy ->
313313
Maybe TeamUserSearchSortOrder ->
314314
Maybe EmailVerificationFilter ->
315+
Maybe Bool ->
315316
IndexQuery TeamContact
316-
teamUserSearchQuery tid mbSearchText mRoleFilter mSortBy mSortOrder mEmailFilter =
317+
teamUserSearchQuery tid mbSearchText mRoleFilter mSortBy mSortOrder mEmailFilter mSearchable =
317318
IndexQuery
318319
( maybe
319320
(ES.MatchAllQuery Nothing)
@@ -365,13 +366,16 @@ teamUserSearchQuery tid mbSearchText mRoleFilter mSortBy mSortOrder mEmailFilter
365366
}
366367

367368
teamFilter :: ES.Filter
368-
teamFilter =
369-
ES.Filter $
370-
ES.QueryBoolQuery
371-
boolQuery
372-
{ ES.boolQueryMustMatch = ES.TermQuery (ES.Term "team" $ idToText tid) Nothing : roleFilter <> emailFilter
373-
}
369+
teamFilter = ES.Filter $ ES.QueryBoolQuery boolQuery { ES.boolQueryMustMatch = mustMatch }
374370
where
371+
mustMatch :: [ES.Query]
372+
mustMatch = ES.TermQuery (ES.Term "team" $ idToText tid) Nothing : roleFilter <> emailFilter <> searchableFilter
373+
374+
searchableFilter :: [ES.Query]
375+
searchableFilter = case mSearchable of
376+
Just b -> [ES.TermQuery (ES.Term "searchable" $ bool "false" "true" b) Nothing]
377+
Nothing -> []
378+
375379
roleFilter :: [ES.Query]
376380
roleFilter =
377381
case mRoleFilter of

libs/wire-subsystems/src/Wire/UserSearch/Types.hs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ userDocToTeamContact UserDoc {..} =
125125
teamContactEmailUnvalidated = udEmailUnvalidated,
126126
teamContactEmail = udEmail,
127127
teamContactCreatedAt = udCreatedAt,
128-
teamContactColorId = fromIntegral . fromColourId <$> udColourId
128+
teamContactColorId = fromIntegral . fromColourId <$> udColourId,
129+
teamContactSearchable = udSearchable
129130
}
130131

131132
-- | Outbound search restrictions configured by team admin of the searcher. This
@@ -204,7 +205,8 @@ data BrowseTeamFilters = BrowseTeamFilters
204205
mRoleFilter :: Maybe RoleFilter,
205206
mSortBy :: Maybe TeamUserSearchSortBy,
206207
mSortOrder :: Maybe TeamUserSearchSortOrder,
207-
mEmailVerificationFilter :: Maybe EmailVerificationFilter
208+
mEmailVerificationFilter :: Maybe EmailVerificationFilter,
209+
mSearchable :: Maybe Bool
208210
}
209211
deriving (Eq, Show)
210212

services/brig/src/Brig/API/Public.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -648,9 +648,10 @@ browseTeamHandler ::
648648
Maybe (Range 1 500 Int) ->
649649
Maybe Public.PagingState ->
650650
Maybe EmailVerificationFilter ->
651+
Maybe Bool ->
651652
Handler r (Public.SearchResult Public.TeamContact)
652-
browseTeamHandler uid tid mQuery mRoleFilter mTeamUserSearchSortBy mTeamUserSearchSortOrder mMaxResults mPagingState mEmailFilter = do
653-
let browseTeamFilters = BrowseTeamFilters tid mQuery mRoleFilter mTeamUserSearchSortBy mTeamUserSearchSortOrder mEmailFilter
653+
browseTeamHandler uid tid mQuery mRoleFilter mTeamUserSearchSortBy mTeamUserSearchSortOrder mMaxResults mPagingState mEmailFilter mSearchable = do
654+
let browseTeamFilters = BrowseTeamFilters tid mQuery mRoleFilter mTeamUserSearchSortBy mTeamUserSearchSortOrder mEmailFilter mSearchable
654655
lift . liftSem $ User.browseTeam uid browseTeamFilters mMaxResults mPagingState
655656

656657
setPropertyH :: (Member PropertySubsystem r) => UserId -> ConnId -> Public.PropertyKey -> Public.RawPropertyValue -> Handler r ()

services/brig/test/integration/API/User/Account.hs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -719,15 +719,14 @@ testUserSearchable brig galley = do
719719
uids = map (^. Team.Member.userId) teamMembers
720720
liftIO $ assertBool "/teams/:tid/members returns searchable and non-searchable users from team" $ all (`elem` uids) $ u1id : map userId [u3, u4]
721721

722-
-- /teams/:tid/members?searchable=false gets only non-searchable members
723-
r :: Team.Member.TeamMembersPage <- parseOrFail "TeamMembersPage" $
724-
get ( galley
725-
. paths ["teams", toByteString' tid, "members"]
722+
-- /teams/:tid/search?searchable=false gets only non-searchable members
723+
r :: SearchResult TeamContact <- parseOrFail "SearchResult TeamContact" $
724+
get ( brig
725+
. paths ["teams", toByteString' tid, "search"]
726726
. queryItem "searchable" "false"
727-
. zUser u1id) <!! const 200 === statusCode
728-
let teamMembers = mtpResults $ Team.Member.unTeamMembersPage r :: [Team.Member.TeamMemberOptPerms]
729-
uids = map (^.Team.Member.userId) teamMembers
730-
liftIO $ assertBool "/teams/:tid/members?searchable=false returns only non-searchable members" $ uids == [userId u4]
727+
. zUser admin) <!! const 200 === statusCode
728+
let uids = map teamContactUserId $ searchResults r
729+
liftIO $ assertBool "/teams/:tid/members?searchable=false returns only non-searchable members" $ userId u4 `elem` uids
731730

732731
where
733732
contactUid :: Contact -> UserId

0 commit comments

Comments
 (0)