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
6161import Data.Singletons
6262import Data.Time.Clock
6363import 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 )
7564import Galley.Types.Error
7665import Imports hiding ((\\) )
7766import Polysemy
@@ -106,23 +95,41 @@ import Wire.API.Team.LegalHold
10695import Wire.API.Team.Member
10796import Wire.API.Team.Permission (Perm (AddRemoveConvMember , ModifyConvName ))
10897import Wire.API.User as User
98+ import Wire.BackendNotificationQueueAccess
99+ import Wire.BrigAPIAccess
109100import Wire.BrigAPIAccess qualified as E
110101import Wire.CodeStore
111102import Wire.CodeStore qualified as E
103+ import Wire.ConversationStore
112104import 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
115113import Wire.ConversationSubsystem.Util
114+ import Wire.ExternalAccess
116115import Wire.FeaturesConfigSubsystem
116+ import Wire.FederationAPIAccess
117117import Wire.FederationAPIAccess qualified as E
118118import Wire.FederationSubsystem
119+ import Wire.FireAndForget
119120import Wire.FireAndForget qualified as E
121+ import Wire.LegalHoldStore
120122import Wire.NotificationSubsystem
123+ import Wire.ProposalStore
124+ import Wire.ProposalStore qualified as E
121125import Wire.Sem.Now (Now )
122126import Wire.Sem.Now qualified as Now
127+ import Wire.Sem.Random
123128import Wire.StoredConversation
124129import Wire.StoredConversation qualified as Data
125130import Wire.TeamCollaboratorsSubsystem
131+ import Wire.TeamFeatureStore
132+ import Wire.TeamStore
126133import Wire.TeamSubsystem (TeamSubsystem )
127134import Wire.TeamSubsystem qualified as TeamSubsystem
128135import 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 ()
0 commit comments