-- This file is part of the Wire Server implementation.
--
-- Copyright (C) 2022 Wire Swiss GmbH <opensource@wire.com>
--
-- This program is free software: you can redistribute it and/or modify it under
-- the terms of the GNU Affero General Public License as published by the Free
-- Software Foundation, either version 3 of the License, or (at your option) any
-- later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
-- details.
--
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module Galley.API.Public.TeamConversation where

import Galley.API.Teams
import Galley.App
import Wire.API.Federation.API
import Wire.API.Routes.API
import Wire.API.Routes.Public.Galley.TeamConversation

teamConversationAPI :: API TeamConversationAPI GalleyEffects
teamConversationAPI :: API TeamConversationAPI GalleyEffects
teamConversationAPI =
  forall {k} (name :: k) (r0 :: EffectRow) api.
(HasServer api '[Domain],
 ServerEffects (DeclaredErrorEffects api) r0) =>
ServerT api (Sem (Append (DeclaredErrorEffects api) r0))
-> API (Named name api) r0
forall (name :: Symbol) (r0 :: EffectRow) api.
(HasServer api '[Domain],
 ServerEffects (DeclaredErrorEffects api) r0) =>
ServerT api (Sem (Append (DeclaredErrorEffects api) r0))
-> API (Named name api) r0
mkNamedAPI @"get-team-conversation-roles" ServerT
  (Summary "Get existing roles available for the given team"
   :> (CanThrow 'NotATeamMember
       :> (ZUser
           :> ("teams"
               :> (Capture "tid" TeamId
                   :> ("conversations"
                       :> ("roles" :> Get '[JSON] ConversationRolesList)))))))
  (Sem
     (Append
        (DeclaredErrorEffects
           (Summary "Get existing roles available for the given team"
            :> (CanThrow 'NotATeamMember
                :> (ZUser
                    :> ("teams"
                        :> (Capture "tid" TeamId
                            :> ("conversations"
                                :> ("roles" :> Get '[JSON] ConversationRolesList))))))))
        '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
          Rpc, ExternalAccess, FederatorAccess,
          BackendNotificationQueueAccess, BotAccess, FireAndForget,
          ClientStore, CodeStore, ProposalStore, ConversationStore,
          SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
          LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
          TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
          TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
          ListItems CassandraPaging (Remote ConvId),
          ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
          ListItems InternalPaging TeamId, Input AllTeamFeatures,
          Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
          Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
          Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
          Error InvalidInput, Error InternalError, Error FederationError,
          Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
          Final IO]))
UserId
-> TeamId
-> Sem
     '[ErrorS 'NotATeamMember, BrigAccess, SparAccess,
       NotificationSubsystem, GundeckAPIAccess, Rpc, ExternalAccess,
       FederatorAccess, BackendNotificationQueueAccess, BotAccess,
       FireAndForget, ClientStore, CodeStore, ProposalStore,
       ConversationStore, SubConversationStore, Random,
       CustomBackendStore, TeamFeatureStore, LegalHoldStore, MemberStore,
       SearchVisibilityStore, ServiceStore, TeamNotificationStore,
       TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
     ConversationRolesList
forall (r :: EffectRow).
(Member (ErrorS 'NotATeamMember) r, Member TeamStore r) =>
UserId -> TeamId -> Sem r ConversationRolesList
getTeamConversationRoles
    API
  (Named
     "get-team-conversation-roles"
     (Summary "Get existing roles available for the given team"
      :> (CanThrow 'NotATeamMember
          :> (ZUser
              :> ("teams"
                  :> (Capture "tid" TeamId
                      :> ("conversations"
                          :> ("roles" :> Get '[JSON] ConversationRolesList))))))))
  '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
    Rpc, ExternalAccess, FederatorAccess,
    BackendNotificationQueueAccess, BotAccess, FireAndForget,
    ClientStore, CodeStore, ProposalStore, ConversationStore,
    SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
    LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
    TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
    TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
    ListItems CassandraPaging (Remote ConvId),
    ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
    ListItems InternalPaging TeamId, Input AllTeamFeatures,
    Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
    Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
    Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
    Error InvalidInput, Error InternalError, Error FederationError,
    Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
    Final IO]
-> API
     (Named
        "get-team-conversations"
        (Summary "Get team conversations"
         :> (CanThrow OperationDenied
             :> (CanThrow 'NotATeamMember
                 :> (ZUser
                     :> ("teams"
                         :> (Capture "tid" TeamId
                             :> ("conversations" :> Get '[JSON] TeamConversationList)))))))
      :<|> (Named
              "get-team-conversation"
              (Summary "Get one team conversation"
               :> (CanThrow 'ConvNotFound
                   :> (CanThrow OperationDenied
                       :> (CanThrow 'NotATeamMember
                           :> (ZUser
                               :> ("teams"
                                   :> (Capture "tid" TeamId
                                       :> ("conversations"
                                           :> (Capture "cid" ConvId
                                               :> Get '[JSON] TeamConversation)))))))))
            :<|> Named
                   "delete-team-conversation"
                   (Summary "Remove a team conversation"
                    :> (MakesFederatedCall 'Galley "on-conversation-updated"
                        :> (MakesFederatedCall 'Galley "on-mls-message-sent"
                            :> (MakesFederatedCall 'Brig "get-users-by-ids"
                                :> (CanThrow ('ActionDenied 'DeleteConversation)
                                    :> (CanThrow 'ConvNotFound
                                        :> (CanThrow 'InvalidOperation
                                            :> (CanThrow 'NotATeamMember
                                                :> (ZLocalUser
                                                    :> (ZConn
                                                        :> ("teams"
                                                            :> (Capture "tid" TeamId
                                                                :> ("conversations"
                                                                    :> (Capture "cid" ConvId
                                                                        :> MultiVerb
                                                                             'DELETE
                                                                             '[JSON]
                                                                             '[RespondEmpty
                                                                                 200
                                                                                 "Conversation deleted"]
                                                                             ()))))))))))))))))
     '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
       Rpc, ExternalAccess, FederatorAccess,
       BackendNotificationQueueAccess, BotAccess, FireAndForget,
       ClientStore, CodeStore, ProposalStore, ConversationStore,
       SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
       LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
       TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
-> API
     TeamConversationAPI
     '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
       Rpc, ExternalAccess, FederatorAccess,
       BackendNotificationQueueAccess, BotAccess, FireAndForget,
       ClientStore, CodeStore, ProposalStore, ConversationStore,
       SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
       LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
       TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
forall api1 (r :: EffectRow) api2.
API api1 r -> API api2 r -> API (api1 :<|> api2) r
<@> forall {k} (name :: k) (r0 :: EffectRow) api.
(HasServer api '[Domain],
 ServerEffects (DeclaredErrorEffects api) r0) =>
ServerT api (Sem (Append (DeclaredErrorEffects api) r0))
-> API (Named name api) r0
forall (name :: Symbol) (r0 :: EffectRow) api.
(HasServer api '[Domain],
 ServerEffects (DeclaredErrorEffects api) r0) =>
ServerT api (Sem (Append (DeclaredErrorEffects api) r0))
-> API (Named name api) r0
mkNamedAPI @"get-team-conversations" ServerT
  (Summary "Get team conversations"
   :> (CanThrow OperationDenied
       :> (CanThrow 'NotATeamMember
           :> (ZUser
               :> ("teams"
                   :> (Capture "tid" TeamId
                       :> ("conversations" :> Get '[JSON] TeamConversationList)))))))
  (Sem
     (Append
        (DeclaredErrorEffects
           (Summary "Get team conversations"
            :> (CanThrow OperationDenied
                :> (CanThrow 'NotATeamMember
                    :> (ZUser
                        :> ("teams"
                            :> (Capture "tid" TeamId
                                :> ("conversations" :> Get '[JSON] TeamConversationList))))))))
        '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
          Rpc, ExternalAccess, FederatorAccess,
          BackendNotificationQueueAccess, BotAccess, FireAndForget,
          ClientStore, CodeStore, ProposalStore, ConversationStore,
          SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
          LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
          TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
          TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
          ListItems CassandraPaging (Remote ConvId),
          ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
          ListItems InternalPaging TeamId, Input AllTeamFeatures,
          Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
          Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
          Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
          Error InvalidInput, Error InternalError, Error FederationError,
          Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
          Final IO]))
UserId
-> TeamId
-> Sem
     '[Error (Tagged OperationDenied ()), ErrorS 'NotATeamMember,
       BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
       Rpc, ExternalAccess, FederatorAccess,
       BackendNotificationQueueAccess, BotAccess, FireAndForget,
       ClientStore, CodeStore, ProposalStore, ConversationStore,
       SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
       LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
       TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
     TeamConversationList
forall (r :: EffectRow).
(Member (ErrorS 'NotATeamMember) r,
 Member (Error (Tagged OperationDenied ())) r,
 Member TeamStore r) =>
UserId -> TeamId -> Sem r TeamConversationList
getTeamConversations
    API
  (Named
     "get-team-conversations"
     (Summary "Get team conversations"
      :> (CanThrow OperationDenied
          :> (CanThrow 'NotATeamMember
              :> (ZUser
                  :> ("teams"
                      :> (Capture "tid" TeamId
                          :> ("conversations" :> Get '[JSON] TeamConversationList))))))))
  '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
    Rpc, ExternalAccess, FederatorAccess,
    BackendNotificationQueueAccess, BotAccess, FireAndForget,
    ClientStore, CodeStore, ProposalStore, ConversationStore,
    SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
    LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
    TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
    TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
    ListItems CassandraPaging (Remote ConvId),
    ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
    ListItems InternalPaging TeamId, Input AllTeamFeatures,
    Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
    Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
    Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
    Error InvalidInput, Error InternalError, Error FederationError,
    Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
    Final IO]
-> API
     (Named
        "get-team-conversation"
        (Summary "Get one team conversation"
         :> (CanThrow 'ConvNotFound
             :> (CanThrow OperationDenied
                 :> (CanThrow 'NotATeamMember
                     :> (ZUser
                         :> ("teams"
                             :> (Capture "tid" TeamId
                                 :> ("conversations"
                                     :> (Capture "cid" ConvId
                                         :> Get '[JSON] TeamConversation)))))))))
      :<|> Named
             "delete-team-conversation"
             (Summary "Remove a team conversation"
              :> (MakesFederatedCall 'Galley "on-conversation-updated"
                  :> (MakesFederatedCall 'Galley "on-mls-message-sent"
                      :> (MakesFederatedCall 'Brig "get-users-by-ids"
                          :> (CanThrow ('ActionDenied 'DeleteConversation)
                              :> (CanThrow 'ConvNotFound
                                  :> (CanThrow 'InvalidOperation
                                      :> (CanThrow 'NotATeamMember
                                          :> (ZLocalUser
                                              :> (ZConn
                                                  :> ("teams"
                                                      :> (Capture "tid" TeamId
                                                          :> ("conversations"
                                                              :> (Capture "cid" ConvId
                                                                  :> MultiVerb
                                                                       'DELETE
                                                                       '[JSON]
                                                                       '[RespondEmpty
                                                                           200
                                                                           "Conversation deleted"]
                                                                       ())))))))))))))))
     '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
       Rpc, ExternalAccess, FederatorAccess,
       BackendNotificationQueueAccess, BotAccess, FireAndForget,
       ClientStore, CodeStore, ProposalStore, ConversationStore,
       SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
       LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
       TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
-> API
     (Named
        "get-team-conversations"
        (Summary "Get team conversations"
         :> (CanThrow OperationDenied
             :> (CanThrow 'NotATeamMember
                 :> (ZUser
                     :> ("teams"
                         :> (Capture "tid" TeamId
                             :> ("conversations" :> Get '[JSON] TeamConversationList)))))))
      :<|> (Named
              "get-team-conversation"
              (Summary "Get one team conversation"
               :> (CanThrow 'ConvNotFound
                   :> (CanThrow OperationDenied
                       :> (CanThrow 'NotATeamMember
                           :> (ZUser
                               :> ("teams"
                                   :> (Capture "tid" TeamId
                                       :> ("conversations"
                                           :> (Capture "cid" ConvId
                                               :> Get '[JSON] TeamConversation)))))))))
            :<|> Named
                   "delete-team-conversation"
                   (Summary "Remove a team conversation"
                    :> (MakesFederatedCall 'Galley "on-conversation-updated"
                        :> (MakesFederatedCall 'Galley "on-mls-message-sent"
                            :> (MakesFederatedCall 'Brig "get-users-by-ids"
                                :> (CanThrow ('ActionDenied 'DeleteConversation)
                                    :> (CanThrow 'ConvNotFound
                                        :> (CanThrow 'InvalidOperation
                                            :> (CanThrow 'NotATeamMember
                                                :> (ZLocalUser
                                                    :> (ZConn
                                                        :> ("teams"
                                                            :> (Capture "tid" TeamId
                                                                :> ("conversations"
                                                                    :> (Capture "cid" ConvId
                                                                        :> MultiVerb
                                                                             'DELETE
                                                                             '[JSON]
                                                                             '[RespondEmpty
                                                                                 200
                                                                                 "Conversation deleted"]
                                                                             ()))))))))))))))))
     '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
       Rpc, ExternalAccess, FederatorAccess,
       BackendNotificationQueueAccess, BotAccess, FireAndForget,
       ClientStore, CodeStore, ProposalStore, ConversationStore,
       SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
       LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
       TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
forall api1 (r :: EffectRow) api2.
API api1 r -> API api2 r -> API (api1 :<|> api2) r
<@> forall {k} (name :: k) (r0 :: EffectRow) api.
(HasServer api '[Domain],
 ServerEffects (DeclaredErrorEffects api) r0) =>
ServerT api (Sem (Append (DeclaredErrorEffects api) r0))
-> API (Named name api) r0
forall (name :: Symbol) (r0 :: EffectRow) api.
(HasServer api '[Domain],
 ServerEffects (DeclaredErrorEffects api) r0) =>
ServerT api (Sem (Append (DeclaredErrorEffects api) r0))
-> API (Named name api) r0
mkNamedAPI @"get-team-conversation" ServerT
  (Summary "Get one team conversation"
   :> (CanThrow 'ConvNotFound
       :> (CanThrow OperationDenied
           :> (CanThrow 'NotATeamMember
               :> (ZUser
                   :> ("teams"
                       :> (Capture "tid" TeamId
                           :> ("conversations"
                               :> (Capture "cid" ConvId :> Get '[JSON] TeamConversation)))))))))
  (Sem
     (Append
        (DeclaredErrorEffects
           (Summary "Get one team conversation"
            :> (CanThrow 'ConvNotFound
                :> (CanThrow OperationDenied
                    :> (CanThrow 'NotATeamMember
                        :> (ZUser
                            :> ("teams"
                                :> (Capture "tid" TeamId
                                    :> ("conversations"
                                        :> (Capture "cid" ConvId
                                            :> Get '[JSON] TeamConversation))))))))))
        '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
          Rpc, ExternalAccess, FederatorAccess,
          BackendNotificationQueueAccess, BotAccess, FireAndForget,
          ClientStore, CodeStore, ProposalStore, ConversationStore,
          SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
          LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
          TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
          TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
          ListItems CassandraPaging (Remote ConvId),
          ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
          ListItems InternalPaging TeamId, Input AllTeamFeatures,
          Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
          Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
          Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
          Error InvalidInput, Error InternalError, Error FederationError,
          Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
          Final IO]))
UserId
-> TeamId
-> ConvId
-> Sem
     '[ErrorS 'ConvNotFound, Error (Tagged OperationDenied ()),
       ErrorS 'NotATeamMember, BrigAccess, SparAccess,
       NotificationSubsystem, GundeckAPIAccess, Rpc, ExternalAccess,
       FederatorAccess, BackendNotificationQueueAccess, BotAccess,
       FireAndForget, ClientStore, CodeStore, ProposalStore,
       ConversationStore, SubConversationStore, Random,
       CustomBackendStore, TeamFeatureStore, LegalHoldStore, MemberStore,
       SearchVisibilityStore, ServiceStore, TeamNotificationStore,
       TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
     TeamConversation
forall (r :: EffectRow).
(Member (ErrorS 'ConvNotFound) r,
 Member (ErrorS 'NotATeamMember) r,
 Member (Error (Tagged OperationDenied ())) r,
 Member TeamStore r) =>
UserId -> TeamId -> ConvId -> Sem r TeamConversation
getTeamConversation
    API
  (Named
     "get-team-conversation"
     (Summary "Get one team conversation"
      :> (CanThrow 'ConvNotFound
          :> (CanThrow OperationDenied
              :> (CanThrow 'NotATeamMember
                  :> (ZUser
                      :> ("teams"
                          :> (Capture "tid" TeamId
                              :> ("conversations"
                                  :> (Capture "cid" ConvId :> Get '[JSON] TeamConversation))))))))))
  '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
    Rpc, ExternalAccess, FederatorAccess,
    BackendNotificationQueueAccess, BotAccess, FireAndForget,
    ClientStore, CodeStore, ProposalStore, ConversationStore,
    SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
    LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
    TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
    TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
    ListItems CassandraPaging (Remote ConvId),
    ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
    ListItems InternalPaging TeamId, Input AllTeamFeatures,
    Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
    Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
    Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
    Error InvalidInput, Error InternalError, Error FederationError,
    Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
    Final IO]
-> API
     (Named
        "delete-team-conversation"
        (Summary "Remove a team conversation"
         :> (MakesFederatedCall 'Galley "on-conversation-updated"
             :> (MakesFederatedCall 'Galley "on-mls-message-sent"
                 :> (MakesFederatedCall 'Brig "get-users-by-ids"
                     :> (CanThrow ('ActionDenied 'DeleteConversation)
                         :> (CanThrow 'ConvNotFound
                             :> (CanThrow 'InvalidOperation
                                 :> (CanThrow 'NotATeamMember
                                     :> (ZLocalUser
                                         :> (ZConn
                                             :> ("teams"
                                                 :> (Capture "tid" TeamId
                                                     :> ("conversations"
                                                         :> (Capture "cid" ConvId
                                                             :> MultiVerb
                                                                  'DELETE
                                                                  '[JSON]
                                                                  '[RespondEmpty
                                                                      200 "Conversation deleted"]
                                                                  ())))))))))))))))
     '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
       Rpc, ExternalAccess, FederatorAccess,
       BackendNotificationQueueAccess, BotAccess, FireAndForget,
       ClientStore, CodeStore, ProposalStore, ConversationStore,
       SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
       LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
       TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
-> API
     (Named
        "get-team-conversation"
        (Summary "Get one team conversation"
         :> (CanThrow 'ConvNotFound
             :> (CanThrow OperationDenied
                 :> (CanThrow 'NotATeamMember
                     :> (ZUser
                         :> ("teams"
                             :> (Capture "tid" TeamId
                                 :> ("conversations"
                                     :> (Capture "cid" ConvId
                                         :> Get '[JSON] TeamConversation)))))))))
      :<|> Named
             "delete-team-conversation"
             (Summary "Remove a team conversation"
              :> (MakesFederatedCall 'Galley "on-conversation-updated"
                  :> (MakesFederatedCall 'Galley "on-mls-message-sent"
                      :> (MakesFederatedCall 'Brig "get-users-by-ids"
                          :> (CanThrow ('ActionDenied 'DeleteConversation)
                              :> (CanThrow 'ConvNotFound
                                  :> (CanThrow 'InvalidOperation
                                      :> (CanThrow 'NotATeamMember
                                          :> (ZLocalUser
                                              :> (ZConn
                                                  :> ("teams"
                                                      :> (Capture "tid" TeamId
                                                          :> ("conversations"
                                                              :> (Capture "cid" ConvId
                                                                  :> MultiVerb
                                                                       'DELETE
                                                                       '[JSON]
                                                                       '[RespondEmpty
                                                                           200
                                                                           "Conversation deleted"]
                                                                       ())))))))))))))))
     '[BrigAccess, SparAccess, NotificationSubsystem, GundeckAPIAccess,
       Rpc, ExternalAccess, FederatorAccess,
       BackendNotificationQueueAccess, BotAccess, FireAndForget,
       ClientStore, CodeStore, ProposalStore, ConversationStore,
       SubConversationStore, Random, CustomBackendStore, TeamFeatureStore,
       LegalHoldStore, MemberStore, SearchVisibilityStore, ServiceStore,
       TeamNotificationStore, TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
forall api1 (r :: EffectRow) api2.
API api1 r -> API api2 r -> API (api1 :<|> api2) r
<@> forall {k} (name :: k) (r0 :: EffectRow) api.
(HasServer api '[Domain],
 ServerEffects (DeclaredErrorEffects api) r0) =>
ServerT api (Sem (Append (DeclaredErrorEffects api) r0))
-> API (Named name api) r0
forall (name :: Symbol) (r0 :: EffectRow) api.
(HasServer api '[Domain],
 ServerEffects (DeclaredErrorEffects api) r0) =>
ServerT api (Sem (Append (DeclaredErrorEffects api) r0))
-> API (Named name api) r0
mkNamedAPI @"delete-team-conversation" (((HasAnnotation 'Remote "galley" "on-conversation-updated",
  (HasAnnotation 'Remote "galley" "on-mls-message-sent",
   (HasAnnotation 'Remote "brig" "get-users-by-ids",
    () :: Constraint))) =>
 QualifiedWithTag 'QLocal UserId
 -> ConnId
 -> TeamId
 -> ConvId
 -> Sem
      '[Error (Tagged ('ActionDenied 'DeleteConversation) ()),
        ErrorS 'ConvNotFound, Error (Tagged 'InvalidOperation ()),
        ErrorS 'NotATeamMember, BrigAccess, SparAccess,
        NotificationSubsystem, GundeckAPIAccess, Rpc, ExternalAccess,
        FederatorAccess, BackendNotificationQueueAccess, BotAccess,
        FireAndForget, ClientStore, CodeStore, ProposalStore,
        ConversationStore, SubConversationStore, Random,
        CustomBackendStore, TeamFeatureStore, LegalHoldStore, MemberStore,
        SearchVisibilityStore, ServiceStore, TeamNotificationStore,
        TeamStore, TeamMemberStore InternalPaging,
        TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
        ListItems CassandraPaging (Remote ConvId),
        ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
        ListItems InternalPaging TeamId, Input AllTeamFeatures,
        Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
        Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
        Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
        Error InvalidInput, Error InternalError, Error FederationError,
        Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
        Final IO]
      ())
-> Dict (HasAnnotation 'Remote "galley" "on-conversation-updated")
-> Dict (HasAnnotation 'Remote "galley" "on-mls-message-sent")
-> Dict (HasAnnotation 'Remote "brig" "get-users-by-ids")
-> QualifiedWithTag 'QLocal UserId
-> ConnId
-> TeamId
-> ConvId
-> Sem
     '[Error (Tagged ('ActionDenied 'DeleteConversation) ()),
       ErrorS 'ConvNotFound, Error (Tagged 'InvalidOperation ()),
       ErrorS 'NotATeamMember, BrigAccess, SparAccess,
       NotificationSubsystem, GundeckAPIAccess, Rpc, ExternalAccess,
       FederatorAccess, BackendNotificationQueueAccess, BotAccess,
       FireAndForget, ClientStore, CodeStore, ProposalStore,
       ConversationStore, SubConversationStore, Random,
       CustomBackendStore, TeamFeatureStore, LegalHoldStore, MemberStore,
       SearchVisibilityStore, ServiceStore, TeamNotificationStore,
       TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
     ()
forall (c :: Constraint) r a. SolveCallsFed c r a => (c => r) -> a
callsFed ((QualifiedWithTag 'QLocal UserId
 -> ConnId
 -> TeamId
 -> ConvId
 -> Sem
      '[Error (Tagged ('ActionDenied 'DeleteConversation) ()),
        ErrorS 'ConvNotFound, Error (Tagged 'InvalidOperation ()),
        ErrorS 'NotATeamMember, BrigAccess, SparAccess,
        NotificationSubsystem, GundeckAPIAccess, Rpc, ExternalAccess,
        FederatorAccess, BackendNotificationQueueAccess, BotAccess,
        FireAndForget, ClientStore, CodeStore, ProposalStore,
        ConversationStore, SubConversationStore, Random,
        CustomBackendStore, TeamFeatureStore, LegalHoldStore, MemberStore,
        SearchVisibilityStore, ServiceStore, TeamNotificationStore,
        TeamStore, TeamMemberStore InternalPaging,
        TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
        ListItems CassandraPaging (Remote ConvId),
        ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
        ListItems InternalPaging TeamId, Input AllTeamFeatures,
        Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
        Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
        Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
        Error InvalidInput, Error InternalError, Error FederationError,
        Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
        Final IO]
      ())
-> QualifiedWithTag 'QLocal UserId
-> ConnId
-> TeamId
-> ConvId
-> Sem
     '[Error (Tagged ('ActionDenied 'DeleteConversation) ()),
       ErrorS 'ConvNotFound, Error (Tagged 'InvalidOperation ()),
       ErrorS 'NotATeamMember, BrigAccess, SparAccess,
       NotificationSubsystem, GundeckAPIAccess, Rpc, ExternalAccess,
       FederatorAccess, BackendNotificationQueueAccess, BotAccess,
       FireAndForget, ClientStore, CodeStore, ProposalStore,
       ConversationStore, SubConversationStore, Random,
       CustomBackendStore, TeamFeatureStore, LegalHoldStore, MemberStore,
       SearchVisibilityStore, ServiceStore, TeamNotificationStore,
       TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
     ()
forall x a. ToHasAnnotations x => a -> a
exposeAnnotations QualifiedWithTag 'QLocal UserId
-> ConnId
-> TeamId
-> ConvId
-> Sem
     '[Error (Tagged ('ActionDenied 'DeleteConversation) ()),
       ErrorS 'ConvNotFound, Error (Tagged 'InvalidOperation ()),
       ErrorS 'NotATeamMember, BrigAccess, SparAccess,
       NotificationSubsystem, GundeckAPIAccess, Rpc, ExternalAccess,
       FederatorAccess, BackendNotificationQueueAccess, BotAccess,
       FireAndForget, ClientStore, CodeStore, ProposalStore,
       ConversationStore, SubConversationStore, Random,
       CustomBackendStore, TeamFeatureStore, LegalHoldStore, MemberStore,
       SearchVisibilityStore, ServiceStore, TeamNotificationStore,
       TeamStore, TeamMemberStore InternalPaging,
       TeamMemberStore CassandraPaging, ListItems CassandraPaging ConvId,
       ListItems CassandraPaging (Remote ConvId),
       ListItems LegacyPaging ConvId, ListItems LegacyPaging TeamId,
       ListItems InternalPaging TeamId, Input AllTeamFeatures,
       Input (Maybe [TeamId], FeatureDefaults LegalholdConfig),
       Input (Local ()), Input Opts, Input UTCTime, Queue DeleteItem,
       Logger (Msg -> Msg), Error DynError, Input ClientState, Input Env,
       Error InvalidInput, Error InternalError, Error FederationError,
       Async, Delay, Fail, Embed IO, Error JSONResponse, Resource,
       Final IO]
     ()
forall (r :: EffectRow).
(Member BackendNotificationQueueAccess r, Member BrigAccess r,
 Member CodeStore r, Member ConversationStore r,
 Member (Error FederationError) r, Member (ErrorS 'ConvNotFound) r,
 Member (Error (Tagged 'InvalidOperation ())) r,
 Member (ErrorS 'NotATeamMember) r,
 Member (Error (Tagged ('ActionDenied 'DeleteConversation) ())) r,
 Member FederatorAccess r, Member MemberStore r,
 Member ProposalStore r, Member ExternalAccess r,
 Member NotificationSubsystem r, Member (Input UTCTime) r,
 Member SubConversationStore r, Member TeamStore r) =>
QualifiedWithTag 'QLocal UserId
-> ConnId -> TeamId -> ConvId -> Sem r ()
deleteTeamConversation))