@@ -50,6 +50,7 @@ interpretUserGroupSubsystem = interpret $ \case
5050 AddUsers adder groupId addeeIds -> addUsers adder groupId addeeIds
5151 UpdateUsers updater groupId uids -> updateUsers updater groupId uids
5252 RemoveUser remover groupId removeeId -> removeUser remover groupId removeeId
53+ RemoveUserFromAllGroups uid tid -> removeUserFromAllGroups uid tid
5354
5455data UserGroupSubsystemError
5556 = UserGroupNotATeamAdmin
@@ -328,3 +329,38 @@ removeUser remover groupId removeeId = do
328329 pushNotifications
329330 [ mkEvent remover (UserGroupUpdated groupId) admins
330331 ]
332+
333+ removeUserFromAllGroups ::
334+ ( Member Store. UserGroupStore r ,
335+ Member TeamSubsystem r ,
336+ Member (Error UserGroupSubsystemError ) r
337+ ) =>
338+ UserId ->
339+ TeamId ->
340+ Sem r ()
341+ removeUserFromAllGroups uid tid = do
342+ void $ internalGetTeamMember uid tid >>= note UserGroupMemberIsNotInTheSameTeam
343+ nextPage Nothing >>= go
344+ where
345+ go (ug : ugs) = do
346+ Store. removeUser ug. id_ uid
347+ -- when we get to the last item, get a new page
348+ ugs' <- case ugs of
349+ [] -> nextPage (Just ug)
350+ _ -> pure ugs
351+ go ugs'
352+ -- no more items, terminate
353+ go [] = pure ()
354+
355+ nextPage mug =
356+ Store. getUserGroups $
357+ UserGroupPageRequest
358+ { pageSize = def,
359+ sortOrder = Desc ,
360+ paginationState =
361+ PaginationSortByCreatedAt $
362+ fmap Store. userGroupCreatedAtPaginationState mug,
363+ team = tid,
364+ searchString = Nothing ,
365+ includeMemberCount = False
366+ }
0 commit comments