@@ -332,10 +332,10 @@ updateTeamH zusr zcon tid updateData = do
332
332
void $ permissionCheckS SSetTeamData zusrMembership
333
333
E. setTeamData tid updateData
334
334
now <- input
335
- memList <- getTeamMembersForFanout tid
335
+ admins <- E. getTeamAdmins tid
336
336
let e = newEvent tid now (EdTeamUpdate updateData)
337
- let r = list1 (userRecipient zusr) (membersToRecipients ( Just zusr) (memList ^. teamMembers ))
338
- E. push1 $ newPushLocal1 (memList ^. teamMemberListType) zusr (TeamEvent e) r & pushConn ?~ zcon
337
+ let r = list1 (userRecipient zusr) (map userRecipient ( filter ( /= zusr) admins ))
338
+ E. push1 $ newPushLocal1 ListComplete zusr (TeamEvent e) r & pushConn ?~ zcon & pushTransient .~ True
339
339
340
340
deleteTeam ::
341
341
forall r .
@@ -737,8 +737,7 @@ addTeamMember lzusr zcon tid nmem = do
737
737
ensureConnectedToLocals zusr [uid]
738
738
(TeamSize sizeBeforeJoin) <- E. getSize tid
739
739
ensureNotTooLargeForLegalHold tid (fromIntegral sizeBeforeJoin + 1 )
740
- memList <- getTeamMembersForFanout tid
741
- void $ addTeamMemberInternal tid (Just zusr) (Just zcon) nmem memList
740
+ void $ addTeamMemberInternal tid (Just zusr) (Just zcon) nmem
742
741
743
742
-- This function is "unchecked" because there is no need to check for user binding (invite only).
744
743
uncheckedAddTeamMember ::
@@ -760,12 +759,11 @@ uncheckedAddTeamMember ::
760
759
NewTeamMember ->
761
760
Sem r ()
762
761
uncheckedAddTeamMember tid nmem = do
763
- mems <- getTeamMembersForFanout tid
764
762
(TeamSize sizeBeforeJoin) <- E. getSize tid
765
763
ensureNotTooLargeForLegalHold tid (fromIntegral sizeBeforeJoin + 1 )
766
- (TeamSize sizeBeforeAdd) <- addTeamMemberInternal tid Nothing Nothing nmem mems
767
- billingUserIds <- E. getBillingTeamMembers tid
768
- Journal. teamUpdate tid (sizeBeforeAdd + 1 ) billingUserIds
764
+ (TeamSize sizeBeforeAdd) <- addTeamMemberInternal tid Nothing Nothing nmem
765
+ owners <- E. getBillingTeamMembers tid
766
+ Journal. teamUpdate tid (sizeBeforeAdd + 1 ) owners
769
767
770
768
uncheckedUpdateTeamMember ::
771
769
forall r .
@@ -804,30 +802,15 @@ uncheckedUpdateTeamMember mlzusr mZcon tid newMember = do
804
802
-- update target in Cassandra
805
803
E. setTeamMemberPermissions (previousMember ^. permissions) tid targetId targetPermissions
806
804
807
- updatedMembers <- getTeamMembersForFanout tid
808
- updateJournal team
809
- updatePeers mZusr targetId targetMember targetPermissions updatedMembers
810
- where
811
- updateJournal :: Team -> Sem r ()
812
- updateJournal team = do
813
- when (team ^. teamBinding == Binding ) $ do
814
- (TeamSize size) <- E. getSize tid
815
- owners <- E. getBillingTeamMembers tid
816
- Journal. teamUpdate tid size owners
817
-
818
- updatePeers :: Maybe UserId -> UserId -> TeamMember -> Permissions -> TeamMemberList -> Sem r ()
819
- updatePeers zusr targetId targetMember targetPermissions updatedMembers = do
820
- -- inform members of the team about the change
821
- -- some (privileged) users will be informed about which change was applied
822
- let privileged = filter (`canSeePermsOf` targetMember) (updatedMembers ^. teamMembers)
823
- mkUpdate = EdMemberUpdate targetId
824
- privilegedUpdate = mkUpdate $ Just targetPermissions
825
- privilegedRecipients = membersToRecipients Nothing privileged
826
- now <- input
827
- let ePriv = newEvent tid now privilegedUpdate
828
- -- push to all members (user is privileged)
829
- let pushPriv = newPush (updatedMembers ^. teamMemberListType) zusr (TeamEvent ePriv) $ privilegedRecipients
830
- for_ pushPriv (\ p -> E. push1 (p & pushConn .~ mZcon))
805
+ when (team ^. teamBinding == Binding ) $ do
806
+ (TeamSize size) <- E. getSize tid
807
+ owners <- E. getBillingTeamMembers tid
808
+ Journal. teamUpdate tid size owners
809
+
810
+ now <- input
811
+ let event = newEvent tid now (EdMemberUpdate targetId (Just targetPermissions))
812
+ let pushPriv = newPush ListComplete mZusr (TeamEvent event) (map userRecipient admins')
813
+ for_ pushPriv (\ p -> E. push1 (p & pushConn .~ mZcon & pushTransient .~ True ))
831
814
832
815
updateTeamMember ::
833
816
forall r .
@@ -967,7 +950,6 @@ deleteTeamMember' lusr zcon tid remove mBody = do
967
950
tm <- noteS @ 'TeamMemberNotFound targetMember
968
951
unless (canDeleteMember dm tm) $ throwS @ 'AccessDenied
969
952
team <- fmap tdTeam $ E. getTeam tid >>= noteS @ 'TeamNotFound
970
- mems <- getTeamMembersForFanout tid
971
953
if team ^. teamBinding == Binding && isJust targetMember
972
954
then do
973
955
body <- mBody & note (InvalidPayload " missing request body" )
@@ -985,7 +967,8 @@ deleteTeamMember' lusr zcon tid remove mBody = do
985
967
Journal. teamUpdate tid sizeAfterDelete $ filter (/= remove) owners
986
968
pure TeamMemberDeleteAccepted
987
969
else do
988
- uncheckedDeleteTeamMember lusr (Just zcon) tid remove mems
970
+ admins <- E. getTeamAdmins tid
971
+ uncheckedDeleteTeamMember lusr (Just zcon) tid remove admins
989
972
pure TeamMemberDeleteCompleted
990
973
991
974
-- This function is "unchecked" because it does not validate that the user has the `RemoveTeamMember` permission.
@@ -1002,47 +985,43 @@ uncheckedDeleteTeamMember ::
1002
985
Maybe ConnId ->
1003
986
TeamId ->
1004
987
UserId ->
1005
- TeamMemberList ->
988
+ [ UserId ] ->
1006
989
Sem r ()
1007
- uncheckedDeleteTeamMember lusr zcon tid remove mems = do
990
+ uncheckedDeleteTeamMember lusr zcon tid remove admins = do
1008
991
now <- input
1009
992
pushMemberLeaveEvent now
1010
993
E. deleteTeamMember tid remove
1011
994
removeFromConvsAndPushConvLeaveEvent now
1012
995
where
1013
- -- notify all team members.
996
+ -- notify team admins
1014
997
pushMemberLeaveEvent :: UTCTime -> Sem r ()
1015
998
pushMemberLeaveEvent now = do
1016
999
let e = newEvent tid now (EdMemberLeave remove)
1017
1000
let r =
1018
- list1
1019
- (userRecipient (tUnqualified lusr))
1020
- (membersToRecipients (Just (tUnqualified lusr)) (mems ^. teamMembers))
1001
+ userRecipient
1002
+ <$> list1
1003
+ (tUnqualified lusr)
1004
+ (filter (/= (tUnqualified lusr)) admins)
1021
1005
E. push1 $
1022
- newPushLocal1 (mems ^. teamMemberListType) (tUnqualified lusr) (TeamEvent e) r & pushConn .~ zcon
1006
+ newPushLocal1 ListComplete (tUnqualified lusr) (TeamEvent e) r & pushConn .~ zcon & pushTransient .~ True
1023
1007
-- notify all conversation members not in this team.
1024
1008
removeFromConvsAndPushConvLeaveEvent :: UTCTime -> Sem r ()
1025
1009
removeFromConvsAndPushConvLeaveEvent now = do
1026
- -- This may not make sense if that list has been truncated. In such cases, we still want to
1027
- -- remove the user from conversations but never send out any events. We assume that clients
1028
- -- handle nicely these missing events, regardless of whether they are in the same team or not
1029
- let tmids = Set. fromList $ map (view userId) (mems ^. teamMembers)
1010
+ let tmids = Set. fromList admins
1030
1011
let edata = Conv. EdMembersLeave Conv. EdReasonDeleted (Conv. QualifiedUserIdList [tUntagged (qualifyAs lusr remove)])
1031
1012
cc <- E. getTeamConversations tid
1032
1013
for_ cc $ \ c ->
1033
1014
E. getConversation (c ^. conversationId) >>= \ conv ->
1034
1015
for_ conv $ \ dc -> when (remove `isMember` Data. convLocalMembers dc) $ do
1035
1016
E. deleteMembers (c ^. conversationId) (UserList [remove] [] )
1036
- -- If the list was truncated, then the tmids list is incomplete so we simply drop these events
1037
- unless (mems ^. teamMemberListType == ListTruncated ) $
1038
- pushEvent tmids edata now dc
1017
+ pushEvent tmids edata now dc
1039
1018
pushEvent :: Set UserId -> Conv. EventData -> UTCTime -> Data. Conversation -> Sem r ()
1040
1019
pushEvent exceptTo edata now dc = do
1041
1020
let qconvId = tUntagged $ qualifyAs lusr (Data. convId dc)
1042
1021
let (bots, users) = localBotsAndUsers (Data. convLocalMembers dc)
1043
1022
let x = filter (\ m -> not (Conv. lmId m `Set.member` exceptTo)) users
1044
1023
let y = Conv. Event qconvId Nothing (tUntagged lusr) now edata
1045
- for_ (newPushLocal (mems ^. teamMemberListType) (tUnqualified lusr) (ConvEvent y) (recipient <$> x)) $ \ p ->
1024
+ for_ (newPushLocal ListComplete (tUnqualified lusr) (ConvEvent y) (recipient <$> x)) $ \ p ->
1046
1025
E. push1 $ p & pushConn .~ zcon
1047
1026
E. deliverAsync (map (,y) bots)
1048
1027
@@ -1264,9 +1243,8 @@ addTeamMemberInternal ::
1264
1243
Maybe UserId ->
1265
1244
Maybe ConnId ->
1266
1245
NewTeamMember ->
1267
- TeamMemberList ->
1268
1246
Sem r TeamSize
1269
- addTeamMemberInternal tid origin originConn (ntmNewTeamMember -> new) memList = do
1247
+ addTeamMemberInternal tid origin originConn (ntmNewTeamMember -> new) = do
1270
1248
P. debug $
1271
1249
Log. field " targets" (toByteString (new ^. userId))
1272
1250
. Log. field " action" (Log. val " Teams.addTeamMemberInternal" )
@@ -1277,22 +1255,17 @@ addTeamMemberInternal tid origin originConn (ntmNewTeamMember -> new) memList =
1277
1255
checkAdminLimit (length admins')
1278
1256
1279
1257
E. createTeamMember tid new
1258
+
1280
1259
now <- input
1281
1260
let e = newEvent tid now (EdMemberJoin (new ^. userId))
1261
+ let rs = case origin of
1262
+ Just o -> userRecipient <$> list1 o (filter (/= o) ((new ^. userId) : admins'))
1263
+ Nothing -> userRecipient <$> list1 (new ^. userId) (admins')
1282
1264
E. push1 $
1283
- newPushLocal1 (memList ^. teamMemberListType) (new ^. userId) (TeamEvent e) (recipients origin new) & pushConn .~ originConn
1265
+ newPushLocal1 ListComplete (new ^. userId) (TeamEvent e) rs & pushConn .~ originConn & pushTransient .~ True
1284
1266
1285
1267
APITeamQueue. pushTeamEvent tid e
1286
1268
pure sizeBeforeAdd
1287
- where
1288
- recipients (Just o) n =
1289
- list1
1290
- (userRecipient o)
1291
- (membersToRecipients (Just o) (n : memList ^. teamMembers))
1292
- recipients Nothing n =
1293
- list1
1294
- (userRecipient (n ^. userId))
1295
- (membersToRecipients Nothing (memList ^. teamMembers))
1296
1269
1297
1270
finishCreateTeam ::
1298
1271
( Member GundeckAccess r ,
0 commit comments