galley-0.83.0: Conversations
Safe HaskellSafe-Inferred
LanguageGHC2021

Galley.API.Action

Synopsis

Conversation action types

data ConversationActionTag Source #

Instances

Instances details
Arbitrary ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

FromJSON ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

ToJSON ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

Bounded ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

Enum ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

Generic ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

Associated Types

type Rep ConversationActionTag :: Type -> Type #

Show ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

Eq ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

ToSchema ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

ToSchema ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

SingKind ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

Associated Types

type Demote ConversationActionTag = (r :: Type) Source #

SDecide ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

Methods

(%~) :: forall (a :: ConversationActionTag) (b :: ConversationActionTag). Sing a -> Sing b -> Decision (a :~: b) Source #

TestCoercion SConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

Methods

testCoercion :: forall (a :: k) (b :: k). SConversationActionTag a -> SConversationActionTag b -> Maybe (Coercion a b) #

TestEquality SConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

Methods

testEquality :: forall (a :: k) (b :: k). SConversationActionTag a -> SConversationActionTag b -> Maybe (a :~: b) #

SingI 'ConversationAccessDataTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

SingI 'ConversationDeleteTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

SingI 'ConversationJoinTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

SingI 'ConversationLeaveTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

SingI 'ConversationMemberUpdateTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

SingI 'ConversationMessageTimerUpdateTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

SingI 'ConversationReceiptModeUpdateTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

SingI 'ConversationRemoveMembersTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

SingI 'ConversationRenameTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

SingI 'ConversationUpdateProtocolTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

SingI ConversationActionPermissionSym0 
Instance details

Defined in Wire.API.Conversation.Action

Methods

sing :: Sing ConversationActionPermissionSym0 Source #

SuppressUnusedWarnings ConversationActionPermissionSym0 
Instance details

Defined in Wire.API.Conversation.Action

type Rep ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

type Rep ConversationActionTag = D1 ('MetaData "ConversationActionTag" "Wire.API.Conversation.Action.Tag" "wire-api-0.1.0-3915FetN8WgFcCGrbk6Vve" 'False) (((C1 ('MetaCons "ConversationJoinTag" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ConversationLeaveTag" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "ConversationRemoveMembersTag" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "ConversationMemberUpdateTag" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ConversationDeleteTag" 'PrefixI 'False) (U1 :: Type -> Type)))) :+: ((C1 ('MetaCons "ConversationRenameTag" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ConversationMessageTimerUpdateTag" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "ConversationReceiptModeUpdateTag" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "ConversationAccessDataTag" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ConversationUpdateProtocolTag" 'PrefixI 'False) (U1 :: Type -> Type)))))
type Demote ConversationActionTag 
Instance details

Defined in Wire.API.Conversation.Action.Tag

type Sing 
Instance details

Defined in Wire.API.Conversation.Action.Tag

type Apply ConversationActionPermissionSym0 (a6989586621683296686 :: ConversationActionTag) 
Instance details

Defined in Wire.API.Conversation.Action

type Apply ConversationActionPermissionSym0 (a6989586621683296686 :: ConversationActionTag) = ConversationActionPermission a6989586621683296686

data ConversationJoin Source #

Instances

Instances details
Arbitrary ConversationJoin 
Instance details

Defined in Wire.API.Conversation

FromJSON ConversationJoin 
Instance details

Defined in Wire.API.Conversation

ToJSON ConversationJoin 
Instance details

Defined in Wire.API.Conversation

Generic ConversationJoin 
Instance details

Defined in Wire.API.Conversation

Associated Types

type Rep ConversationJoin :: Type -> Type #

Show ConversationJoin 
Instance details

Defined in Wire.API.Conversation

Eq ConversationJoin 
Instance details

Defined in Wire.API.Conversation

ToSchema ConversationJoin 
Instance details

Defined in Wire.API.Conversation

ToSchema ConversationJoin 
Instance details

Defined in Wire.API.Conversation

type Rep ConversationJoin 
Instance details

Defined in Wire.API.Conversation

type Rep ConversationJoin = D1 ('MetaData "ConversationJoin" "Wire.API.Conversation" "wire-api-0.1.0-3915FetN8WgFcCGrbk6Vve" 'False) (C1 ('MetaCons "ConversationJoin" 'PrefixI 'True) (S1 ('MetaSel ('Just "cjUsers") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 (NonEmpty (Qualified UserId))) :*: S1 ('MetaSel ('Just "cjRole") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 RoleName)))

data ConversationMemberUpdate Source #

Instances

Instances details
Arbitrary ConversationMemberUpdate 
Instance details

Defined in Wire.API.Conversation

FromJSON ConversationMemberUpdate 
Instance details

Defined in Wire.API.Conversation

ToJSON ConversationMemberUpdate 
Instance details

Defined in Wire.API.Conversation

Generic ConversationMemberUpdate 
Instance details

Defined in Wire.API.Conversation

Associated Types

type Rep ConversationMemberUpdate :: Type -> Type #

Show ConversationMemberUpdate 
Instance details

Defined in Wire.API.Conversation

Eq ConversationMemberUpdate 
Instance details

Defined in Wire.API.Conversation

ToSchema ConversationMemberUpdate 
Instance details

Defined in Wire.API.Conversation

ToSchema ConversationMemberUpdate 
Instance details

Defined in Wire.API.Conversation

type Rep ConversationMemberUpdate 
Instance details

Defined in Wire.API.Conversation

type Rep ConversationMemberUpdate = D1 ('MetaData "ConversationMemberUpdate" "Wire.API.Conversation" "wire-api-0.1.0-3915FetN8WgFcCGrbk6Vve" 'False) (C1 ('MetaCons "ConversationMemberUpdate" 'PrefixI 'True) (S1 ('MetaSel ('Just "cmuTarget") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 (Qualified UserId)) :*: S1 ('MetaSel ('Just "cmuUpdate") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 OtherMemberUpdate)))

type family HasConversationActionEffects (tag :: ConversationActionTag) r :: Constraint where ... Source #

Equations

HasConversationActionEffects 'ConversationJoinTag r = (Member BrigAccess r, Member (Error FederationError) r, Member (Error InternalError) r, Member (ErrorS 'NotATeamMember) r, Member (ErrorS 'NotConnected) r, Member (ErrorS ('ActionDenied 'LeaveConversation)) r, Member (ErrorS ('ActionDenied 'AddConversationMember)) r, Member (ErrorS 'InvalidOperation) r, Member (ErrorS 'ConvAccessDenied) r, Member (ErrorS 'ConvNotFound) r, Member (ErrorS 'TooManyMembers) r, Member (ErrorS 'MissingLegalholdConsent) r, Member (Error NonFederatingBackends) r, Member (Error UnreachableBackends) r, Member ExternalAccess r, Member FederatorAccess r, Member NotificationSubsystem r, Member (Input Env) r, Member (Input Opts) r, Member (Input UTCTime) r, Member LegalHoldStore r, Member MemberStore r, Member ProposalStore r, Member Random r, Member SubConversationStore r, Member TeamStore r, Member TinyLog r, Member ConversationStore r, Member (Error NoChanges) r) 
HasConversationActionEffects 'ConversationLeaveTag r = (Member MemberStore r, Member (Error InternalError) r, Member (Error NoChanges) r, Member ExternalAccess r, Member FederatorAccess r, Member NotificationSubsystem r, Member (Input UTCTime) r, Member (Input Env) r, Member ProposalStore r, Member SubConversationStore r, Member Random r, Member TinyLog r) 
HasConversationActionEffects 'ConversationRemoveMembersTag r = (Member MemberStore r, Member (Error NoChanges) r, Member SubConversationStore r, Member ProposalStore r, Member (Input Env) r, Member (Input UTCTime) r, Member ExternalAccess r, Member FederatorAccess r, Member NotificationSubsystem r, Member (Error InternalError) r, Member Random r, Member TinyLog r, Member (Error NoChanges) r) 
HasConversationActionEffects 'ConversationMemberUpdateTag r = (Member MemberStore r, Member (ErrorS 'ConvMemberNotFound) r) 
HasConversationActionEffects 'ConversationDeleteTag r = (Member BrigAccess r, Member CodeStore r, Member ConversationStore r, Member (Error FederationError) r, Member (ErrorS 'NotATeamMember) r, Member FederatorAccess r, Member MemberStore r, Member ProposalStore r, Member SubConversationStore r, Member TeamStore r) 
HasConversationActionEffects 'ConversationRenameTag r = (Member (Error InvalidInput) r, Member ConversationStore r, Member TeamStore r, Member (ErrorS InvalidOperation) r) 
HasConversationActionEffects 'ConversationAccessDataTag r = (Member BotAccess r, Member BrigAccess r, Member CodeStore r, Member (Error InternalError) r, Member (Error InvalidInput) r, Member (Error NoChanges) r, Member (ErrorS 'InvalidTargetAccess) r, Member (ErrorS ('ActionDenied 'RemoveConversationMember)) r, Member ExternalAccess r, Member FederatorAccess r, Member FireAndForget r, Member NotificationSubsystem r, Member (Input Env) r, Member MemberStore r, Member ProposalStore r, Member TeamStore r, Member TinyLog r, Member (Input UTCTime) r, Member ConversationStore r, Member SubConversationStore r, Member Random r) 
HasConversationActionEffects 'ConversationMessageTimerUpdateTag r = (Member ConversationStore r, Member (Error NoChanges) r) 
HasConversationActionEffects 'ConversationReceiptModeUpdateTag r = (Member ConversationStore r, Member (Error NoChanges) r) 
HasConversationActionEffects 'ConversationUpdateProtocolTag r = (Member ConversationStore r, Member (ErrorS 'ConvInvalidProtocolTransition) r, Member (ErrorS 'MLSMigrationCriteriaNotSatisfied) r, Member (Error NoChanges) r, Member BrigAccess r, Member ExternalAccess r, Member FederatorAccess r, Member NotificationSubsystem r, Member (Input Env) r, Member (Input Opts) r, Member (Input UTCTime) r, Member MemberStore r, Member ProposalStore r, Member Random r, Member SubConversationStore r, Member TeamFeatureStore r, Member TinyLog r) 

type family HasConversationActionGalleyErrors (tag :: ConversationActionTag) :: EffectRow where ... Source #

Equations

HasConversationActionGalleyErrors 'ConversationJoinTag = '[ErrorS ('ActionDenied 'LeaveConversation), ErrorS ('ActionDenied 'AddConversationMember), ErrorS 'NotATeamMember, ErrorS 'InvalidOperation, ErrorS 'ConvNotFound, ErrorS 'NotConnected, ErrorS 'ConvAccessDenied, ErrorS 'TooManyMembers, ErrorS 'MissingLegalholdConsent] 
HasConversationActionGalleyErrors 'ConversationLeaveTag = '[ErrorS ('ActionDenied 'LeaveConversation), ErrorS 'InvalidOperation, ErrorS 'ConvNotFound] 
HasConversationActionGalleyErrors 'ConversationRemoveMembersTag = '[ErrorS ('ActionDenied 'RemoveConversationMember), ErrorS 'InvalidOperation, ErrorS 'ConvNotFound] 
HasConversationActionGalleyErrors 'ConversationMemberUpdateTag = '[ErrorS ('ActionDenied 'ModifyOtherConversationMember), ErrorS 'InvalidOperation, ErrorS 'ConvNotFound, ErrorS 'ConvMemberNotFound] 
HasConversationActionGalleyErrors 'ConversationDeleteTag = '[ErrorS ('ActionDenied 'DeleteConversation), ErrorS 'NotATeamMember, ErrorS 'InvalidOperation, ErrorS 'ConvNotFound] 
HasConversationActionGalleyErrors 'ConversationRenameTag = '[ErrorS ('ActionDenied 'ModifyConversationName), ErrorS 'InvalidOperation, ErrorS 'ConvNotFound] 
HasConversationActionGalleyErrors 'ConversationMessageTimerUpdateTag = '[ErrorS ('ActionDenied 'ModifyConversationMessageTimer), ErrorS 'InvalidOperation, ErrorS 'ConvNotFound] 
HasConversationActionGalleyErrors 'ConversationReceiptModeUpdateTag = '[ErrorS ('ActionDenied 'ModifyConversationReceiptMode), ErrorS 'InvalidOperation, ErrorS 'ConvNotFound] 
HasConversationActionGalleyErrors 'ConversationAccessDataTag = '[ErrorS ('ActionDenied 'RemoveConversationMember), ErrorS ('ActionDenied 'ModifyConversationAccess), ErrorS 'InvalidOperation, ErrorS 'InvalidTargetAccess, ErrorS 'ConvNotFound] 
HasConversationActionGalleyErrors 'ConversationUpdateProtocolTag = '[ErrorS ('ActionDenied 'LeaveConversation), ErrorS 'InvalidOperation, ErrorS 'ConvNotFound, ErrorS 'ConvInvalidProtocolTransition, ErrorS 'MLSMigrationCriteriaNotSatisfied, ErrorS 'NotATeamMember, ErrorS OperationDenied, ErrorS 'TeamNotFound] 

Performing actions

updateLocalConversationUnchecked :: forall tag r. (SingI tag, Member BackendNotificationQueueAccess r, Member (Error FederationError) r, Member (ErrorS ('ActionDenied (ConversationActionPermission tag))) r, Member (ErrorS 'ConvNotFound) r, Member (ErrorS 'InvalidOperation) r, Member ExternalAccess r, Member NotificationSubsystem r, Member (Input UTCTime) r, HasConversationActionEffects tag r) => Local Conversation -> Qualified UserId -> Maybe ConnId -> ConversationAction tag -> Sem r LocalConversationUpdate Source #

Similar to updateLocalConversationWithLocalUser, but takes a Conversation value directly, instead of a ConvId, and skips protocol checks. All the other checks are still performed.

This is intended to be used by protocol-aware code, once all the protocol-specific checks and updates have been performed, to finally apply the changes to the conversation as seen by the backend.

data NoChanges Source #

Constructors

NoChanges 

Utilities

addMembersToLocalConversation :: (Member MemberStore r, Member (Error NoChanges) r) => Local ConvId -> UserList UserId -> RoleName -> Sem r (BotsAndMembers, ConversationJoin) Source #

Add users to a conversation without performing any checks. Return extra notification targets and the action performed.

updateLocalStateOfRemoteConv :: (Member BrigAccess r, Member NotificationSubsystem r, Member ExternalAccess r, Member (Input (Local ())) r, Member MemberStore r, Member TinyLog r) => Remote ConversationUpdate -> Maybe ConnId -> Sem r (Maybe Event) Source #

Update the local database with information on conversation members joining or leaving. Finally, push out notifications to local users.

data ConversationUpdate Source #

Instances

Instances details
FromJSON ConversationUpdate 
Instance details

Defined in Wire.API.Federation.API.Galley.Notifications

ToJSON ConversationUpdate 
Instance details

Defined in Wire.API.Federation.API.Galley.Notifications

Generic ConversationUpdate 
Instance details

Defined in Wire.API.Federation.API.Galley.Notifications

Associated Types

type Rep ConversationUpdate :: Type -> Type #

Show ConversationUpdate 
Instance details

Defined in Wire.API.Federation.API.Galley.Notifications

Eq ConversationUpdate 
Instance details

Defined in Wire.API.Federation.API.Galley.Notifications

ToSchema ConversationUpdate 
Instance details

Defined in Wire.API.Federation.API.Galley.Notifications

type Rep ConversationUpdate 
Instance details

Defined in Wire.API.Federation.API.Galley.Notifications

type Rep ConversationUpdate = D1 ('MetaData "ConversationUpdate" "Wire.API.Federation.API.Galley.Notifications" "wire-api-federation-0.1.0-ARZyNQKMq4lCWdaEdWVlig" 'False) (C1 ('MetaCons "ConversationUpdate" 'PrefixI 'True) ((S1 ('MetaSel ('Just "time") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 UTCTime) :*: S1 ('MetaSel ('Just "origUserId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Qualified UserId))) :*: (S1 ('MetaSel ('Just "convId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ConvId) :*: (S1 ('MetaSel ('Just "alreadyPresentUsers") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [UserId]) :*: S1 ('MetaSel ('Just "action") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 SomeConversationAction)))))

firstConflictOrFullyConnected :: [Remote NonConnectedBackends] -> FederationStatus Source #

"conflict" here means two remote domains that we are connected to but are not connected to each other.