6
6
import Cassandra
7
7
import Cassandra.Exec
8
8
import Conduit
9
+ import Data.Bifoldable
9
10
import Data.Id
11
+ import Galley.Cassandra.Conversation (deleteConversation )
10
12
import Galley.Cassandra.Queries qualified as Cql
11
13
import Galley.Cassandra.Store (embedClient )
12
14
import Galley.Cassandra.Util (logEffect )
13
15
import Imports
14
16
import Polysemy
15
17
import Polysemy.Input
16
18
import Polysemy.TinyLog (TinyLog )
19
+ import Wire.API.Conversation (ConvType (.. ))
17
20
import Wire.ConversationsSubsystem
18
21
import Wire.Sem.Paging.Cassandra (InternalPage (InternalPage ), mkInternalPage )
19
22
@@ -35,19 +38,21 @@ closeConversationsFromImpl tid uid =
35
38
runConduit $
36
39
paginateWithStateC listConversationsIds
37
40
.| mapMC performFilter
38
- .| mapM_C performUpdate
41
+ .| mapM_C (bimapM_ ( mapM_ deleteConversation) performConversationsRemoveUser)
39
42
where
40
43
listConversationsIds pagingState =
41
44
fmap runIdentity <$> paginateWithState Cql. selectUserConvs (paramsPagingState LocalQuorum (Identity uid) 32 pagingState)
42
- performFilter :: [ConvId ] -> Client [ConvId ]
45
+ performFilter :: [ConvId ] -> Client ( [ConvId ], [ ConvId ])
43
46
performFilter convIds = do
44
47
page <- paginate conversationsFilter (params LocalQuorum (Identity convIds))
45
48
InternalPage (_, _, filteredConvIds) <- mkInternalPage page pure
49
+ let extractConv = map (\ (convId, _team, _convType) -> convId)
46
50
pure $
47
- map (\ (convId, _team, _mCreator) -> convId) $
48
- filter (\ (_convId, team, mCreator) -> team == Just tid && mCreator == Just uid) filteredConvIds
49
- conversationsFilter :: PrepQuery R (Identity [ConvId ]) (ConvId , Maybe TeamId , Maybe UserId )
50
- conversationsFilter = " select conv, team, creator from conversation where conv in ?"
51
- performUpdate convIds = retry x5 $ write conversationsUpdate (params LocalQuorum (Identity convIds))
52
- conversationsUpdate :: PrepQuery W (Identity [ConvId ]) ()
53
- conversationsUpdate = " update conversation set deleted = true where conv in ?"
51
+ bimap extractConv extractConv $
52
+ partition (\ (_convId, _team, convType) -> convType == One2OneConv ) $
53
+ filter (\ (_convId, team, _convType) -> team == Just tid) filteredConvIds
54
+ conversationsFilter :: PrepQuery R (Identity [ConvId ]) (ConvId , Maybe TeamId , ConvType )
55
+ conversationsFilter = " select conv, team, type from conversation where conv in ?"
56
+ performConversationsRemoveUser convIds = retry x5 $ write conversationsRemoveUser (params LocalQuorum (uid, convIds))
57
+ conversationsRemoveUser :: PrepQuery W (UserId , [ConvId ]) ()
58
+ conversationsRemoveUser = " delete from user where user = ? and conv in ?"
0 commit comments