Skip to content

Commit 52ea4d5

Browse files
committed
WPB-21964: Move Conversation-related code to wire-subsystems
1 parent 7801836 commit 52ea4d5

56 files changed

Lines changed: 460 additions & 393 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

changelog.d/5-internal/WPB-21964-delete-conv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
- Moved conversation deletion logic from `Galley.API.Action` to `Wire.ConversationSubsystem.Interpreter`
1+
- Moved conversation deletion logic from `Wire.ConversationSubsystem.Action` to `Wire.ConversationSubsystem.Interpreter`
22
- Relocated remote member deletion utilities:
3-
- `Galley.API.Action.deleteMembersInRemoteConversation` → `Wire.ConversationSubsystem.Util.deleteMembersInRemoteConversation`
3+
- `Wire.ConversationSubsystem.Action.deleteMembersInRemoteConversation` → `Wire.ConversationSubsystem.Util.deleteMembersInRemoteConversation`
44
- Updated conversation deletion implementation to handle:
55
- MLS group cleanup (clients and proposals)
66
- Sub-conversation removal

libs/wire-subsystems/default.nix

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
, bytestring-conversion
2424
, case-insensitive
2525
, cassandra-util
26+
, comonad
2627
, conduit
2728
, constraints
2829
, containers
@@ -66,6 +67,7 @@
6667
, imports
6768
, iproute
6869
, iso639
70+
, kan-extensions
6971
, lens
7072
, lib
7173
, lrucaching
@@ -158,6 +160,7 @@ mkDerivation {
158160
bytestring-conversion
159161
case-insensitive
160162
cassandra-util
163+
comonad
161164
conduit
162165
constraints
163166
containers
@@ -197,6 +200,7 @@ mkDerivation {
197200
imports
198201
iproute
199202
iso639
203+
kan-extensions
200204
lens
201205
lrucaching
202206
memory
@@ -279,6 +283,7 @@ mkDerivation {
279283
bytestring-conversion
280284
case-insensitive
281285
cassandra-util
286+
comonad
282287
conduit
283288
constraints
284289
containers
@@ -319,6 +324,7 @@ mkDerivation {
319324
imports
320325
iproute
321326
iso639
327+
kan-extensions
322328
lens
323329
lrucaching
324330
memory

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,6 @@ data ConversationSubsystem m a where
6868
UserId ->
6969
ConversationSubsystem m (Maybe LocalMember)
7070
DeleteConversation :: ConvId -> ConversationSubsystem m ()
71+
InternalDeleteConversation :: ConvId -> ConversationSubsystem m ()
7172

7273
makeSem ''ConversationSubsystem

services/galley/src/Galley/API/Action.hs renamed to libs/wire-subsystems/src/Wire/ConversationSubsystem/Action.hs

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
-- You should have received a copy of the GNU Affero General Public License along
1616
-- with this program. If not, see <https://www.gnu.org/licenses/>.
1717

18-
module Galley.API.Action
18+
module Wire.ConversationSubsystem.Action
1919
( -- * Conversation action types
2020
ConversationActionTag (..),
2121
ConversationJoin (..),
@@ -61,17 +61,6 @@ import Data.Set qualified as Set
6161
import Data.Singletons
6262
import Data.Time.Clock
6363
import GHC.TypeLits (KnownNat)
64-
import Galley.API.Action.Kick
65-
import Galley.API.Action.Leave
66-
import Galley.API.Action.Notify
67-
import Galley.API.Action.Reset
68-
import Galley.API.MLS.Conversation
69-
import Galley.API.MLS.Migration
70-
import Galley.API.MLS.Removal
71-
import Galley.API.Teams.Features.Get
72-
import Galley.Effects
73-
import Galley.Env (Env)
74-
import Galley.Options (Opts)
7564
import Galley.Types.Error
7665
import Imports hiding ((\\))
7766
import Polysemy
@@ -106,23 +95,41 @@ import Wire.API.Team.LegalHold
10695
import Wire.API.Team.Member
10796
import Wire.API.Team.Permission (Perm (AddRemoveConvMember, ModifyConvName))
10897
import Wire.API.User as User
98+
import Wire.BackendNotificationQueueAccess
99+
import Wire.BrigAPIAccess
109100
import Wire.BrigAPIAccess qualified as E
110101
import Wire.CodeStore
111102
import Wire.CodeStore qualified as E
103+
import Wire.ConversationStore
112104
import Wire.ConversationStore qualified as E
113-
import Wire.ConversationSubsystem (ConversationSubsystem)
114-
import Wire.ConversationSubsystem qualified as ConversationSubsystem
105+
import Wire.ConversationSubsystem
106+
import Wire.ConversationSubsystem.Action.Kick
107+
import Wire.ConversationSubsystem.Action.Leave
108+
import Wire.ConversationSubsystem.Action.Notify
109+
import Wire.ConversationSubsystem.Action.Reset
110+
import Wire.ConversationSubsystem.MLS.Conversation
111+
import Wire.ConversationSubsystem.MLS.Migration
112+
import Wire.ConversationSubsystem.MLS.Removal
115113
import Wire.ConversationSubsystem.Util
114+
import Wire.ExternalAccess
116115
import Wire.FeaturesConfigSubsystem
116+
import Wire.FederationAPIAccess
117117
import Wire.FederationAPIAccess qualified as E
118118
import Wire.FederationSubsystem
119+
import Wire.FireAndForget
119120
import Wire.FireAndForget qualified as E
121+
import Wire.LegalHoldStore
120122
import Wire.NotificationSubsystem
123+
import Wire.ProposalStore
124+
import Wire.ProposalStore qualified as E
121125
import Wire.Sem.Now (Now)
122126
import Wire.Sem.Now qualified as Now
127+
import Wire.Sem.Random
123128
import Wire.StoredConversation
124129
import Wire.StoredConversation qualified as Data
125130
import Wire.TeamCollaboratorsSubsystem
131+
import Wire.TeamFeatureStore
132+
import Wire.TeamStore
126133
import Wire.TeamSubsystem (TeamSubsystem)
127134
import Wire.TeamSubsystem qualified as TeamSubsystem
128135
import Wire.UserList
@@ -166,7 +173,6 @@ type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Con
166173
Member (FederationAPIAccess FederatorClient) r,
167174
Member NotificationSubsystem r,
168175
Member Now r,
169-
Member (Input Env) r,
170176
Member (Input ConversationSubsystemConfig) r,
171177
Member ProposalStore r,
172178
Member ConversationStore r,
@@ -177,7 +183,6 @@ type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Con
177183
( Member (Error NoChanges) r,
178184
Member ConversationStore r,
179185
Member ProposalStore r,
180-
Member (Input Env) r,
181186
Member (Input ConversationSubsystemConfig) r,
182187
Member Now r,
183188
Member ExternalAccess r,
@@ -220,7 +225,6 @@ type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Con
220225
Member (FederationAPIAccess FederatorClient) r,
221226
Member FireAndForget r,
222227
Member NotificationSubsystem r,
223-
Member (Input Env) r,
224228
Member (Input ConversationSubsystemConfig) r,
225229
Member ProposalStore r,
226230
Member TeamStore r,
@@ -251,8 +255,6 @@ type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Con
251255
Member ExternalAccess r,
252256
Member (FederationAPIAccess FederatorClient) r,
253257
Member NotificationSubsystem r,
254-
Member (Input Env) r,
255-
Member (Input Opts) r,
256258
Member Now r,
257259
Member ProposalStore r,
258260
Member Random r,
@@ -266,8 +268,7 @@ type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Con
266268
Member (ErrorS 'InvalidTargetAccess) r
267269
)
268270
HasConversationActionEffects 'ConversationResetTag r =
269-
( Member (Input Env) r,
270-
Member Now r,
271+
( Member Now r,
271272
Member (ErrorS ConvNotFound) r,
272273
Member (ErrorS InvalidOperation) r,
273274
Member ConversationStore r,
@@ -311,7 +312,7 @@ type family HasConversationActionGalleyErrors (tag :: ConversationActionTag) ::
311312
ErrorS 'ConvMemberNotFound
312313
]
313314
HasConversationActionGalleyErrors 'ConversationDeleteTag =
314-
'[ ErrorS ('ActionDenied 'DeleteConversation),
315+
'[ ErrorS ('ActionDenied Wire.API.Conversation.Role.DeleteConversation),
315316
ErrorS 'NotATeamMember,
316317
ErrorS 'InvalidOperation,
317318
ErrorS 'ConvNotFound
@@ -497,7 +498,25 @@ performAction tag origUser lconv action = do
497498
E.setOtherMember lcnv (cmuTarget action) (cmuUpdate action)
498499
pure $ mkPerformActionResult action
499500
SConversationDeleteTag -> do
500-
ConversationSubsystem.deleteConversation (tUnqualified lcnv)
501+
let deleteGroup groupId = do
502+
E.removeAllMLSClients groupId
503+
E.deleteAllProposals groupId
504+
505+
let cid = storedConv.id_
506+
for_ (storedConv & mlsMetadata <&> cnvmlsGroupId . fst) $ \gidParent -> do
507+
sconvs <- E.listSubConversations cid
508+
for_ (Map.assocs sconvs) $ \(subid, mlsData) -> do
509+
let gidSub = cnvmlsGroupId mlsData
510+
E.deleteSubConversation cid subid
511+
deleteGroup gidSub
512+
deleteGroup gidParent
513+
514+
key <- E.makeKey (tUnqualified lcnv)
515+
E.deleteCode key
516+
case convTeam storedConv of
517+
Nothing -> E.deleteConversation (tUnqualified lcnv)
518+
Just tid -> E.deleteTeamConversation tid (tUnqualified lcnv)
519+
501520
pure $ mkPerformActionResult action
502521
SConversationRenameTag -> do
503522
zusrMembership <- join <$> forM storedConv.metadata.cnvmTeam (TeamSubsystem.internalGetTeamMember (qUnqualified origUser))
@@ -643,7 +662,7 @@ performConversationJoin qusr lconv (ConversationJoin invited role joinType) = do
643662
-- - ensure that a consented conv admin exists
644663
-- - and kick all existing members that do not consent to LH from the conversation
645664
-- See also: "Brig.API.Connection.checkLegalholdPolicyConflict"
646-
-- and "Galley.API.LegalHold.Conflicts.guardLegalholdPolicyConflictsUid".
665+
-- and "Wire.LegalHoldStore.Conflicts.guardLegalholdPolicyConflictsUid".
647666
checkLHPolicyConflictsLocal ::
648667
[UserId] ->
649668
Sem r ()

services/galley/src/Galley/API/Action/Kick.hs renamed to libs/wire-subsystems/src/Wire/ConversationSubsystem/Action/Kick.hs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,12 @@
1515
-- You should have received a copy of the GNU Affero General Public License along
1616
-- with this program. If not, see <https://www.gnu.org/licenses/>.
1717

18-
module Galley.API.Action.Kick where
18+
module Wire.ConversationSubsystem.Action.Kick where
1919

2020
import Data.Default
2121
import Data.Id
2222
import Data.Qualified
2323
import Data.Singletons
24-
import Galley.API.Action.Leave
25-
import Galley.API.Action.Notify
26-
import Galley.Effects
2724
import Imports hiding ((\\))
2825
import Polysemy
2926
import Polysemy.Error
@@ -34,10 +31,17 @@ import Wire.API.Conversation.Action
3431
import Wire.API.Conversation.Config (ConversationSubsystemConfig)
3532
import Wire.API.Event.LeaveReason
3633
import Wire.API.Federation.Error
34+
import Wire.BackendNotificationQueueAccess
35+
import Wire.ConversationStore
3736
import Wire.ConversationSubsystem
37+
import Wire.ConversationSubsystem.Action.Leave
38+
import Wire.ConversationSubsystem.Action.Notify
3839
import Wire.ConversationSubsystem.Util
40+
import Wire.ExternalAccess
3941
import Wire.NotificationSubsystem
42+
import Wire.ProposalStore
4043
import Wire.Sem.Now (Now)
44+
import Wire.Sem.Random
4145
import Wire.StoredConversation
4246

4347
-- | Kick a user from a conversation and send notifications.

services/galley/src/Galley/API/Action/Leave.hs renamed to libs/wire-subsystems/src/Wire/ConversationSubsystem/Action/Leave.hs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,28 @@
1515
-- You should have received a copy of the GNU Affero General Public License along
1616
-- with this program. If not, see <https://www.gnu.org/licenses/>.
1717

18-
module Galley.API.Action.Leave (leaveConversation) where
18+
module Wire.ConversationSubsystem.Action.Leave (leaveConversation) where
1919

2020
import Control.Lens
2121
import Data.Id
2222
import Data.Qualified
23-
import Galley.API.MLS.Removal
24-
import Galley.Effects
23+
-- import Galley.Effects
2524
import Imports hiding ((\\))
2625
import Polysemy
2726
import Polysemy.Error
2827
import Polysemy.Input
2928
import Polysemy.TinyLog
3029
import Wire.API.Conversation.Config (ConversationSubsystemConfig)
3130
import Wire.API.Federation.Error
31+
import Wire.BackendNotificationQueueAccess
32+
import Wire.ConversationStore
33+
import Wire.ConversationSubsystem.MLS.Removal
3234
import Wire.ConversationSubsystem.Util
35+
import Wire.ExternalAccess
3336
import Wire.NotificationSubsystem
37+
import Wire.ProposalStore
3438
import Wire.Sem.Now (Now)
39+
import Wire.Sem.Random
3540
import Wire.StoredConversation
3641
import Wire.UserList
3742

services/galley/src/Galley/API/Action/Notify.hs renamed to libs/wire-subsystems/src/Wire/ConversationSubsystem/Action/Notify.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
-- You should have received a copy of the GNU Affero General Public License along
1616
-- with this program. If not, see <https://www.gnu.org/licenses/>.
1717

18-
module Galley.API.Action.Notify where
18+
module Wire.ConversationSubsystem.Action.Notify where
1919

2020
import Data.Id
2121
import Data.Qualified
2222
import Data.Singletons
23-
import Galley.Effects
23+
-- import Galley.Effects
2424
import Imports hiding ((\\))
2525
import Polysemy
2626
import Wire.API.Conversation hiding (Conversation, Member)

services/galley/src/Galley/API/Action/Reset.hs renamed to libs/wire-subsystems/src/Wire/ConversationSubsystem/Action/Reset.hs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,13 @@
1515
-- You should have received a copy of the GNU Affero General Public License along
1616
-- with this program. If not, see <https://www.gnu.org/licenses/>.
1717

18-
module Galley.API.Action.Reset (resetLocalMLSMainConversation) where
18+
module Wire.ConversationSubsystem.Action.Reset (resetLocalMLSMainConversation) where
1919

2020
import Control.Monad.Codensity hiding (reset)
2121
import Data.Aeson qualified as A
2222
import Data.ByteString.Conversion (toByteString')
2323
import Data.Id
2424
import Data.Qualified
25-
import Galley.API.Action.Kick
26-
import Galley.API.MLS.Util
27-
import Galley.Effects
2825
import Imports
2926
import Polysemy
3027
import Polysemy.Error
@@ -46,12 +43,18 @@ import Wire.API.MLS.Group.Serialisation qualified as Group
4643
import Wire.API.MLS.SubConversation
4744
import Wire.API.Routes.Public.Galley.MLS
4845
import Wire.API.VersionInfo
46+
import Wire.BackendNotificationQueueAccess
4947
import Wire.ConversationStore
5048
import Wire.ConversationSubsystem
49+
import Wire.ConversationSubsystem.Action.Kick
50+
import Wire.ConversationSubsystem.MLS.Util
5151
import Wire.ConversationSubsystem.Util
52+
import Wire.ExternalAccess
5253
import Wire.FederationAPIAccess
5354
import Wire.NotificationSubsystem
55+
import Wire.ProposalStore
5456
import Wire.Sem.Now (Now)
57+
import Wire.Sem.Random
5558
import Wire.StoredConversation as Data
5659

5760
resetLocalMLSMainConversation ::

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ interpretConversationSubsystem = interpret $ \case
155155
ConvStore.getLocalMember cid uid
156156
ConversationSubsystem.DeleteConversation cid ->
157157
deleteConversationImpl cid
158+
ConversationSubsystem.InternalDeleteConversation cid ->
159+
internalDeleteConversationImpl cid
158160

159161
createGroupConversationGeneric ::
160162
forall r.
@@ -839,6 +841,16 @@ deleteConversationImpl ::
839841
ConvId ->
840842
Sem r ()
841843
deleteConversationImpl cid = do
844+
internalDeleteConversationImpl cid
845+
846+
internalDeleteConversationImpl ::
847+
( Member ConversationStore r,
848+
Member CodeStore r,
849+
Member ProposalStore r
850+
) =>
851+
ConvId ->
852+
Sem r ()
853+
internalDeleteConversationImpl cid = do
842854
mConv <- ConvStore.getConversation cid
843855
forM_ mConv $ \storedConv -> do
844856
let deleteGroup groupId = do

services/galley/src/Galley/API/MLS.hs renamed to libs/wire-subsystems/src/Wire/ConversationSubsystem/MLS.hs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
-- You should have received a copy of the GNU Affero General Public License along
1616
-- with this program. If not, see <https://www.gnu.org/licenses/>.
1717

18-
module Galley.API.MLS
18+
module Wire.ConversationSubsystem.MLS
1919
( isMLSEnabled,
2020
assertMLSEnabled,
2121
postMLSMessage,
@@ -27,9 +27,6 @@ module Galley.API.MLS
2727
where
2828

2929
import Data.Default
30-
import Galley.API.MLS.Enabled
31-
import Galley.API.MLS.Message
32-
import Galley.Env
3330
import Galley.Types.Error
3431
import Imports
3532
import Polysemy
@@ -38,9 +35,11 @@ import Polysemy.Input
3835
import Wire.API.Error
3936
import Wire.API.Error.Galley
4037
import Wire.API.MLS.Keys
38+
import Wire.ConversationSubsystem.MLS.Enabled
39+
import Wire.ConversationSubsystem.MLS.Message
4140

4241
getMLSPublicKeys ::
43-
( Member (Input Env) r,
42+
( Member (Input (Maybe (MLSKeysByPurpose MLSPrivateKeys))) r,
4443
Member (ErrorS 'MLSNotEnabled) r,
4544
Member (Error InternalError) r
4645
) =>

0 commit comments

Comments
 (0)