Skip to content

Commit 778a1a9

Browse files
authored
WPB-19716: Batch create Channels and Map them to User Groups (#4790)
1 parent e77e1f9 commit 778a1a9

File tree

27 files changed

+2831
-22
lines changed

27 files changed

+2831
-22
lines changed

cabal.project

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ packages:
6060
, tools/stern/
6161
, tools/mlsstats/
6262
, tools/test-stats/
63+
, tools/entreprise-provisioning/
6364

6465
tests: True
6566
benchmarks: True

changelog.d/2-features/WPB-19716

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add `entreprise-provisioning`, a CLI to batch provision various entities, currently, creates and associate channels to existing user-groups.

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,7 @@ type UserGroupAPI =
427427
:> "user-groups"
428428
:> Capture "gid" UserGroupId
429429
:> "channels"
430+
:> QueryFlag "append_only"
430431
:> ReqBody '[JSON] UpdateUserGroupChannels
431432
:> MultiVerb1 'PUT '[JSON] (RespondEmpty 200 "User group channels updated")
432433
)

libs/wire-subsystems/src/Wire/UserGroupStore.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ data UserGroupStore m a where
4141
AddUser :: UserGroupId -> UserId -> UserGroupStore m ()
4242
UpdateUsers :: UserGroupId -> Vector UserId -> UserGroupStore m ()
4343
RemoveUser :: UserGroupId -> UserId -> UserGroupStore m ()
44+
AddUserGroupChannels :: UserGroupId -> Vector ConvId -> UserGroupStore m ()
4445
UpdateUserGroupChannels :: UserGroupId -> Vector ConvId -> UserGroupStore m ()
4546
GetUserGroupIdsForUsers :: [UserId] -> UserGroupStore m (Map UserId [UserGroupId])
4647

libs/wire-subsystems/src/Wire/UserGroupStore/Postgres.hs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ interpretUserGroupStoreToPostgres =
5353
AddUser gid uid -> addUser gid uid
5454
UpdateUsers gid uids -> updateUsers gid uids
5555
RemoveUser gid uid -> removeUser gid uid
56-
UpdateUserGroupChannels gid convIds -> updateUserGroupChannels gid convIds
56+
AddUserGroupChannels gid convIds -> updateUserGroupChannels True gid convIds
57+
UpdateUserGroupChannels gid convIds -> updateUserGroupChannels False gid convIds
5758
GetUserGroupIdsForUsers uids -> getUserGroupIdsForUsers uids
5859

5960
getUserGroupIdsForUsers :: (UserGroupStorePostgresEffectConstraints r) => [UserId] -> Sem r (Map UserId [UserGroupId])
@@ -413,17 +414,19 @@ removeUser =
413414
updateUserGroupChannels ::
414415
forall r.
415416
(UserGroupStorePostgresEffectConstraints r) =>
417+
Bool ->
416418
UserGroupId ->
417419
Vector ConvId ->
418420
Sem r ()
419-
updateUserGroupChannels gid convIds = do
421+
updateUserGroupChannels appendOnly gid convIds = do
420422
pool <- input
421423
eitherErrorOrUnit <- liftIO $ use pool session
422424
either throw pure eitherErrorOrUnit
423425
where
424426
session :: Session ()
425427
session = TxSessions.transaction TxSessions.Serializable TxSessions.Write $ do
426-
Tx.statement (gid, convIds) deleteStatement
428+
unless appendOnly $
429+
Tx.statement (gid, convIds) deleteStatement
427430
Tx.statement (gid, convIds) insertStatement
428431

429432
deleteStatement :: Statement (UserGroupId, Vector ConvId) ()

libs/wire-subsystems/src/Wire/UserGroupSubsystem.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ data UserGroupSubsystem m a where
5050
UpdateUsers :: UserId -> UserGroupId -> Vector UserId -> UserGroupSubsystem m ()
5151
RemoveUser :: UserId -> UserGroupId -> UserId -> UserGroupSubsystem m ()
5252
RemoveUserFromAllGroups :: UserId -> TeamId -> UserGroupSubsystem m ()
53+
AddChannels :: UserId -> UserGroupId -> Vector ConvId -> UserGroupSubsystem m ()
5354
UpdateChannels :: UserId -> UserGroupId -> Vector ConvId -> UserGroupSubsystem m ()
5455

5556
makeSem ''UserGroupSubsystem

libs/wire-subsystems/src/Wire/UserGroupSubsystem/Interpreter.hs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ interpretUserGroupSubsystem = interpret $ \case
5454
UpdateUsers updater groupId uids -> updateUsers updater groupId uids
5555
RemoveUser remover groupId removeeId -> removeUser remover groupId removeeId
5656
RemoveUserFromAllGroups uid tid -> removeUserFromAllGroups uid tid
57-
UpdateChannels performer groupId channelIds -> updateChannels performer groupId channelIds
57+
AddChannels performer groupId channelIds -> updateChannels True performer groupId channelIds
58+
UpdateChannels performer groupId channelIds -> updateChannels False performer groupId channelIds
5859

5960
data UserGroupSubsystemError
6061
= UserGroupNotATeamAdmin
@@ -379,19 +380,22 @@ updateChannels ::
379380
Member NotificationSubsystem r,
380381
Member GalleyAPIAccess r
381382
) =>
383+
Bool ->
382384
UserId ->
383385
UserGroupId ->
384386
Vector ConvId ->
385387
Sem r ()
386-
updateChannels performer groupId channelIds = do
388+
updateChannels appendOnly performer groupId channelIds = do
387389
void $ getUserGroup performer groupId False >>= note UserGroupNotFound
388390
teamId <- getTeamAsAdmin performer >>= note UserGroupNotATeamAdmin
389391
for_ channelIds $ \channelId -> do
390392
conv <- internalGetConversation channelId >>= note UserGroupChannelNotFound
391393
let meta = conv.metadata
392394
unless (meta.cnvmTeam == Just teamId && meta.cnvmGroupConvType == Just Conversation.Channel) $
393395
throw UserGroupChannelNotFound
394-
Store.updateUserGroupChannels groupId channelIds
396+
if appendOnly
397+
then Store.addUserGroupChannels groupId channelIds
398+
else Store.updateUserGroupChannels groupId channelIds
395399

396400
admins <- fmap (^. TM.userId) . (^. teamMembers) <$> internalGetTeamAdmins teamId
397401
pushNotifications

libs/wire-subsystems/test/unit/Wire/MockInterpreters/UserGroupStore.hs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ userGroupStoreTestInterpreter =
6868
AddUser gid uid -> addUserImpl gid uid
6969
UpdateUsers gid uids -> updateUsersImpl gid uids
7070
RemoveUser gid uid -> removeUserImpl gid uid
71-
UpdateUserGroupChannels gid convIds -> updateUserGroupChannelsImpl gid convIds
71+
AddUserGroupChannels gid convIds -> updateUserGroupChannelsImpl True gid convIds
72+
UpdateUserGroupChannels gid convIds -> updateUserGroupChannelsImpl False gid convIds
7273
GetUserGroupIdsForUsers uids -> getUserGroupIdsForUsersImpl uids
7374

7475
getUserGroupIdsForUsersImpl :: (UserGroupStoreInMemEffectConstraints r) => [UserId] -> Sem r (Map UserId [UserGroupId])
@@ -205,23 +206,24 @@ removeUserImpl gid uid = do
205206

206207
updateUserGroupChannelsImpl ::
207208
(UserGroupStoreInMemEffectConstraints r, Member (Input (Local ())) r) =>
209+
Bool ->
208210
UserGroupId ->
209211
Vector ConvId ->
210212
Sem r ()
211-
updateUserGroupChannelsImpl gid convIds = do
213+
updateUserGroupChannelsImpl appendOnly gid convIds = do
212214
qualifyLocal <- qualifyAs <$> input
213-
let f :: Maybe UserGroup -> Maybe UserGroup
214-
f Nothing = Nothing
215-
f (Just g) =
216-
Just
217-
( g
218-
{ channels = Just $ tUntagged . qualifyLocal <$> convIds,
219-
channelsCount = Nothing
220-
} ::
221-
UserGroup
222-
)
223-
224-
modifyUserGroupsGidOnly gid (Map.alter f)
215+
let f :: UserGroup -> UserGroup
216+
f g =
217+
g
218+
{ channels =
219+
Just $
220+
newQualifiedConvIds <> if appendOnly then fromMaybe mempty g.channels else mempty,
221+
channelsCount = Just $ length convIds
222+
} ::
223+
UserGroup
224+
newQualifiedConvIds = tUntagged . qualifyLocal <$> convIds
225+
226+
modifyUserGroupsGidOnly gid (Map.alter $ fmap f)
225227

226228
listUserGroupChannelsImpl ::
227229
(UserGroupStoreInMemEffectConstraints r) =>

nix/local-haskell-packages.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
repair-handles = hself.callPackage ../tools/db/repair-handles/default.nix { inherit gitignoreSource; };
5757
service-backfill = hself.callPackage ../tools/db/service-backfill/default.nix { inherit gitignoreSource; };
5858
team-info = hself.callPackage ../tools/db/team-info/default.nix { inherit gitignoreSource; };
59+
entreprise-provisioning = hself.callPackage ../tools/entreprise-provisioning/default.nix { inherit gitignoreSource; };
5960
mlsstats = hself.callPackage ../tools/mlsstats/default.nix { inherit gitignoreSource; };
6061
rabbitmq-consumer = hself.callPackage ../tools/rabbitmq-consumer/default.nix { inherit gitignoreSource; };
6162
rex = hself.callPackage ../tools/rex/default.nix { inherit gitignoreSource; };

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1728,8 +1728,12 @@ removeUserFromGroup lusr gid mid = lift . liftSem $ UserGroup.removeUser (tUnqua
17281728
updateUserGroupMembers :: (_) => Local UserId -> UserGroupId -> UpdateUserGroupMembers -> Handler r ()
17291729
updateUserGroupMembers lusr gid gupd = lift . liftSem $ UserGroup.updateUsers (tUnqualified lusr) gid gupd.members
17301730

1731-
updateUserGroupChannels :: (_) => Local UserId -> UserGroupId -> UpdateUserGroupChannels -> Handler r ()
1732-
updateUserGroupChannels lusr gid upd = lift . liftSem $ UserGroup.updateChannels (tUnqualified lusr) gid upd.channels
1731+
updateUserGroupChannels :: (_) => Local UserId -> UserGroupId -> Bool -> UpdateUserGroupChannels -> Handler r ()
1732+
updateUserGroupChannels lusr gid appendOnly upd =
1733+
lift . liftSem $
1734+
if appendOnly
1735+
then UserGroup.addChannels (tUnqualified lusr) gid upd.channels
1736+
else UserGroup.updateChannels (tUnqualified lusr) gid upd.channels
17331737

17341738
checkUserGroupNameAvailable :: Local UserId -> CheckUserGroupName -> Handler r UserGroupNameAvailability
17351739
checkUserGroupNameAvailable _ _ = pure $ UserGroupNameAvailability True

0 commit comments

Comments
 (0)