-- This file is part of the Wire Server implementation.
--
-- Copyright (C) 2023 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 Wire.GalleyAPIAccess.Rpc where

import Bilge hiding (head, options, requestId)
import Data.Aeson hiding (json)
import Data.ByteString.Conversion
import Data.ByteString.Lazy qualified as BL
import Data.Coerce (coerce)
import Data.Currency qualified as Currency
import Data.Id
import Data.Json.Util (UTCTimeMillis)
import Data.Qualified
import Imports
import Network.HTTP.Client qualified as HTTP
import Network.HTTP.Types qualified as HTTP
import Network.HTTP.Types.Method
import Network.HTTP.Types.Status
import Network.Wai.Utilities.Error qualified as Wai
import Polysemy
import Polysemy.Error
import Polysemy.Input
import Polysemy.TinyLog
import Servant.API (toHeader)
import System.Logger.Message
import Util.Options
import Wire.API.Conversation hiding (Member)
import Wire.API.Routes.Internal.Brig.EJPD (EJPDConvInfo)
import Wire.API.Routes.Internal.Galley.TeamsIntra qualified as Team
import Wire.API.Routes.Version
import Wire.API.Team
import Wire.API.Team.Conversation qualified as Conv
import Wire.API.Team.Feature
import Wire.API.Team.LegalHold
import Wire.API.Team.Member as Member
import Wire.API.Team.Role
import Wire.API.Team.SearchVisibility
import Wire.GalleyAPIAccess (GalleyAPIAccess (..), MLSOneToOneEstablished (..), ShowOrHideInvitationUrl (..))
import Wire.ParseException
import Wire.Rpc

interpretGalleyAPIAccessToRpc ::
  ( Member (Error ParseException) r,
    Member Rpc r,
    Member TinyLog r
  ) =>
  Set Version ->
  Endpoint ->
  Sem (GalleyAPIAccess ': r) a ->
  Sem r a
interpretGalleyAPIAccessToRpc :: forall (r :: EffectRow) a.
(Member (Error ParseException) r, Member Rpc r,
 Member TinyLog r) =>
Set Version -> Endpoint -> Sem (GalleyAPIAccess : r) a -> Sem r a
interpretGalleyAPIAccessToRpc Set Version
disabledVersions Endpoint
galleyEndpoint =
  let v :: Version
v = Version -> Maybe Version -> Version
forall a. a -> Maybe a -> a
fromMaybe ([Char] -> Version
forall a. HasCallStack => [Char] -> a
error [Char]
"service can't run with undefined API version") (Maybe Version -> Version) -> Maybe Version -> Version
forall a b. (a -> b) -> a -> b
$ Set Version -> Maybe Version
maxAvailableVersion Set Version
disabledVersions
   in (forall (rInitial :: EffectRow) x.
 GalleyAPIAccess (Sem rInitial) x -> Sem r x)
-> Sem (GalleyAPIAccess : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: EffectRow) a.
FirstOrder e "interpret" =>
(forall (rInitial :: EffectRow) x. e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret ((forall (rInitial :: EffectRow) x.
  GalleyAPIAccess (Sem rInitial) x -> Sem r x)
 -> Sem (GalleyAPIAccess : r) a -> Sem r a)
-> (forall (rInitial :: EffectRow) x.
    GalleyAPIAccess (Sem rInitial) x -> Sem r x)
-> Sem (GalleyAPIAccess : r) a
-> Sem r a
forall a b. (a -> b) -> a -> b
$
        Endpoint -> Sem (Input Endpoint : r) x -> Sem r x
forall i (r :: EffectRow) a. i -> Sem (Input i : r) a -> Sem r a
runInputConst Endpoint
galleyEndpoint (Sem (Input Endpoint : r) x -> Sem r x)
-> (GalleyAPIAccess (Sem rInitial) x -> Sem (Input Endpoint : r) x)
-> GalleyAPIAccess (Sem rInitial) x
-> Sem r x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
          CreateSelfConv UserId
id' -> Version -> UserId -> Sem (Input Endpoint : r) ()
forall (r :: EffectRow).
(Member Rpc r, Member TinyLog r, Member (Input Endpoint) r) =>
Version -> UserId -> Sem r ()
createSelfConv Version
v UserId
id'
          GetConv UserId
id' Local ConvId
id'' -> Version
-> UserId
-> Local ConvId
-> Sem (Input Endpoint : r) (Maybe Conversation)
forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
Version -> UserId -> Local ConvId -> Sem r (Maybe Conversation)
getConv Version
v UserId
id' Local ConvId
id''
          GetTeamConv UserId
id' TeamId
id'' ConvId
id'2 -> Version
-> UserId
-> TeamId
-> ConvId
-> Sem (Input Endpoint : r) (Maybe TeamConversation)
forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
Version
-> UserId -> TeamId -> ConvId -> Sem r (Maybe TeamConversation)
getTeamConv Version
v UserId
id' TeamId
id'' ConvId
id'2
          NewClient UserId
id' ClientId
ci -> UserId -> ClientId -> Sem (Input Endpoint : r) ()
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r, Member TinyLog r) =>
UserId -> ClientId -> Sem r ()
newClient UserId
id' ClientId
ci
          CheckUserCanJoinTeam TeamId
id' -> TeamId -> Sem (Input Endpoint : r) (Maybe Error)
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r (Maybe Error)
checkUserCanJoinTeam TeamId
id'
          AddTeamMember UserId
id' TeamId
id'' Maybe (UserId, UTCTimeMillis)
a Role
b -> UserId
-> TeamId
-> Maybe (UserId, UTCTimeMillis)
-> Role
-> Sem (Input Endpoint : r) Bool
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r, Member TinyLog r) =>
UserId
-> TeamId -> Maybe (UserId, UTCTimeMillis) -> Role -> Sem r Bool
addTeamMember UserId
id' TeamId
id'' Maybe (UserId, UTCTimeMillis)
a Role
b
          CreateTeam UserId
id' NewTeam
bnt TeamId
id'' -> UserId -> NewTeam -> TeamId -> Sem (Input Endpoint : r) ()
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r, Member TinyLog r) =>
UserId -> NewTeam -> TeamId -> Sem r ()
createTeam UserId
id' NewTeam
bnt TeamId
id''
          GetTeamMember UserId
id' TeamId
id'' -> UserId -> TeamId -> Sem (Input Endpoint : r) (Maybe TeamMember)
forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
UserId -> TeamId -> Sem r (Maybe TeamMember)
getTeamMember UserId
id' TeamId
id''
          GetTeamMembers TeamId
id' -> TeamId -> Sem (Input Endpoint : r) (TeamMemberList' 'Required)
forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r (TeamMemberList' 'Required)
getTeamMembers TeamId
id'
          GetTeamId UserId
id' -> UserId -> Sem (Input Endpoint : r) (Maybe TeamId)
forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
UserId -> Sem r (Maybe TeamId)
getTeamId UserId
id'
          GetTeam TeamId
id' -> TeamId -> Sem (Input Endpoint : r) TeamData
forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r TeamData
getTeam TeamId
id'
          GetTeamName TeamId
id' -> TeamId -> Sem (Input Endpoint : r) TeamName
forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r TeamName
getTeamName TeamId
id'
          GetTeamLegalHoldStatus TeamId
id' -> TeamId
-> Sem (Input Endpoint : r) (LockableFeature LegalholdConfig)
forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r (LockableFeature LegalholdConfig)
getTeamLegalHoldStatus TeamId
id'
          GetTeamSearchVisibility TeamId
id' -> TeamId -> Sem (Input Endpoint : r) TeamSearchVisibility
forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r TeamSearchVisibility
getTeamSearchVisibility TeamId
id'
          GetFeatureConfigForTeam TeamId
tid -> TeamId -> Sem (Input Endpoint : r) (LockableFeature feature)
forall feature (r :: EffectRow).
(IsFeatureConfig feature, Typeable feature, Member TinyLog r,
 Member Rpc r, Member (Error ParseException) r) =>
TeamId -> Sem (Input Endpoint : r) (LockableFeature feature)
getFeatureConfigForTeam TeamId
tid
          GetUserLegalholdStatus Local UserId
id' TeamId
tid -> Local UserId
-> TeamId -> Sem (Input Endpoint : r) UserLegalHoldStatusResponse
forall (r :: EffectRow).
(Member TinyLog r, Member (Error ParseException) r,
 Member Rpc r) =>
Local UserId
-> TeamId -> Sem (Input Endpoint : r) UserLegalHoldStatusResponse
getUserLegalholdStatus Local UserId
id' TeamId
tid
          ChangeTeamStatus TeamId
id' TeamStatus
ts Maybe Alpha
m_al -> TeamId -> TeamStatus -> Maybe Alpha -> Sem (Input Endpoint : r) ()
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> TeamStatus -> Maybe Alpha -> Sem r ()
changeTeamStatus TeamId
id' TeamStatus
ts Maybe Alpha
m_al
          MemberIsTeamOwner TeamId
id' UserId
id'' -> TeamId -> UserId -> Sem (Input Endpoint : r) Bool
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
TeamId -> UserId -> Sem r Bool
memberIsTeamOwner TeamId
id' UserId
id''
          GetAllTeamFeaturesForUser Maybe UserId
m_id' -> Maybe UserId
-> Sem (Input Endpoint : r) (NP LockableFeature Features)
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
Maybe UserId -> Sem r (NP LockableFeature Features)
getAllTeamFeaturesForUser Maybe UserId
m_id'
          GetVerificationCodeEnabled TeamId
id' -> TeamId -> Sem (Input Endpoint : r) Bool
forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r Bool
getVerificationCodeEnabled TeamId
id'
          GetExposeInvitationURLsToTeamAdmin TeamId
id' -> TeamId -> Sem (Input Endpoint : r) ShowOrHideInvitationUrl
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r,
 Member (Error ParseException) r, Member TinyLog r) =>
TeamId -> Sem r ShowOrHideInvitationUrl
getTeamExposeInvitationURLsToTeamAdmin TeamId
id'
          IsMLSOne2OneEstablished Local UserId
lusr Qualified UserId
qother -> Local UserId
-> Qualified UserId
-> Sem (Input Endpoint : r) MLSOneToOneEstablished
forall (r :: EffectRow).
(Member (Error ParseException) r, Member (Input Endpoint) r,
 Member Rpc r, Member TinyLog r) =>
Local UserId -> Qualified UserId -> Sem r MLSOneToOneEstablished
checkMLSOne2OneEstablished Local UserId
lusr Qualified UserId
qother
          UnblockConversation Local UserId
lusr Maybe ConnId
mconn Qualified ConvId
qcnv -> Version
-> Local UserId
-> Maybe ConnId
-> Qualified ConvId
-> Sem (Input Endpoint : r) Conversation
forall (r :: EffectRow).
(Member (Error ParseException) r, Member (Input Endpoint) r,
 Member Rpc r, Member TinyLog r) =>
Version
-> Local UserId
-> Maybe ConnId
-> Qualified ConvId
-> Sem r Conversation
unblockConversation Version
v Local UserId
lusr Maybe ConnId
mconn Qualified ConvId
qcnv
          GetEJPDConvInfo UserId
uid -> UserId -> Sem (Input Endpoint : r) [EJPDConvInfo]
forall (r :: EffectRow).
(Member TinyLog r, Member (Error ParseException) r,
 Member (Input Endpoint) r, Member Rpc r) =>
UserId -> Sem r [EJPDConvInfo]
getEJPDConvInfo UserId
uid

getUserLegalholdStatus ::
  ( Member TinyLog r,
    Member (Error ParseException) r,
    Member Rpc r
  ) =>
  Local UserId ->
  TeamId ->
  Sem (Input Endpoint : r) UserLegalHoldStatusResponse
getUserLegalholdStatus :: forall (r :: EffectRow).
(Member TinyLog r, Member (Error ParseException) r,
 Member Rpc r) =>
Local UserId
-> TeamId -> Sem (Input Endpoint : r) UserLegalHoldStatusResponse
getUserLegalholdStatus Local UserId
luid TeamId
tid = do
  (Msg -> Msg) -> Sem (Input Endpoint : r) ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem (Input Endpoint : r) ())
-> (Msg -> Msg) -> Sem (Input Endpoint : r) ()
forall a b. (a -> b) -> a -> b
$
    ByteString -> Msg -> Msg
remote ByteString
"galley"
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"get legalhold user status")
  Text
-> Response (Maybe ByteString)
-> Sem (Input Endpoint : r) UserLegalHoldStatusResponse
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley" (Response (Maybe ByteString)
 -> Sem (Input Endpoint : r) UserLegalHoldStatusResponse)
-> Sem (Input Endpoint : r) (Response (Maybe ByteString))
-> Sem (Input Endpoint : r) UserLegalHoldStatusResponse
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Request -> Request)
-> Sem (Input Endpoint : r) (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest do
    StdMethod -> Request -> Request
method StdMethod
GET
      (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"legalhold", UserId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' (Local UserId -> UserId
forall (t :: QTag) a. QualifiedWithTag t a -> a
tUnqualified Local UserId
luid)]
      (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> Request -> Request
zUser (Local UserId -> UserId
forall (t :: QTag) a. QualifiedWithTag t a -> a
tUnqualified Local UserId
luid)
      (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

galleyRequest :: (Member Rpc r, Member (Input Endpoint) r) => (Request -> Request) -> Sem r (Response (Maybe LByteString))
galleyRequest :: forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req = do
  Endpoint
ep <- Sem r Endpoint
forall i (r :: EffectRow). Member (Input i) r => Sem r i
input
  ServiceName
-> Endpoint
-> (Request -> Request)
-> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
Member Rpc r =>
ServiceName
-> Endpoint
-> (Request -> Request)
-> Sem r (Response (Maybe ByteString))
rpcWithRetries ServiceName
"galley" Endpoint
ep Request -> Request
req

-- | Calls 'Galley.API.createSelfConversationH'.
createSelfConv ::
  ( Member Rpc r,
    Member TinyLog r,
    Member (Input Endpoint) r
  ) =>
  Version ->
  UserId ->
  Sem r ()
createSelfConv :: forall (r :: EffectRow).
(Member Rpc r, Member TinyLog r, Member (Input Endpoint) r) =>
Version -> UserId -> Sem r ()
createSelfConv Version
v UserId
u = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    ByteString -> Msg -> Msg
remote ByteString
"galley"
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Creating self conversation")
  Sem r (Response (Maybe ByteString)) -> Sem r ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem r (Response (Maybe ByteString)) -> Sem r ())
-> Sem r (Response (Maybe ByteString)) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest ((Request -> Request) -> Sem r (Response (Maybe ByteString)))
-> (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall a b. (a -> b) -> a -> b
$
      StdMethod -> Request -> Request
method StdMethod
POST
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [Version -> ByteString
forall a. ToHttpApiData a => a -> ByteString
toHeader Version
v, ByteString
"conversations", ByteString
"self"]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> Request -> Request
zUser UserId
u
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

-- | Calls 'Galley.API.getConversationH'.
getConv ::
  ( Member (Error ParseException) r,
    Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  Version ->
  UserId ->
  Local ConvId ->
  Sem r (Maybe Conversation)
getConv :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
Version -> UserId -> Local ConvId -> Sem r (Maybe Conversation)
getConv Version
v UserId
usr Local ConvId
lcnv = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    ByteString -> Msg -> Msg
remote ByteString
"galley"
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString -> Msg -> Msg
forall a. ToBytes a => ByteString -> a -> Msg -> Msg
field ByteString
"domain" (Domain -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString (Local ConvId -> Domain
forall (t :: QTag) a. QualifiedWithTag t a -> Domain
tDomain Local ConvId
lcnv))
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString -> Msg -> Msg
forall a. ToBytes a => ByteString -> a -> Msg -> Msg
field ByteString
"conv" (ConvId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString (Local ConvId -> ConvId
forall (t :: QTag) a. QualifiedWithTag t a -> a
tUnqualified Local ConvId
lcnv))
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Getting conversation")
  Response (Maybe ByteString)
rs <- (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req
  case Response (Maybe ByteString) -> Int
forall a. Response a -> Int
Bilge.statusCode Response (Maybe ByteString)
rs of
    Int
200 -> Conversation -> Maybe Conversation
forall a. a -> Maybe a
Just (Conversation -> Maybe Conversation)
-> Sem r Conversation -> Sem r (Maybe Conversation)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Response (Maybe ByteString) -> Sem r Conversation
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley" Response (Maybe ByteString)
rs
    Int
_ -> Maybe Conversation -> Sem r (Maybe Conversation)
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Conversation
forall a. Maybe a
Nothing
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths
          [ Version -> ByteString
forall a. ToHttpApiData a => a -> ByteString
toHeader Version
v,
            ByteString
"conversations",
            Domain -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' (Local ConvId -> Domain
forall (t :: QTag) a. QualifiedWithTag t a -> Domain
tDomain Local ConvId
lcnv),
            ConvId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' (Local ConvId -> ConvId
forall (t :: QTag) a. QualifiedWithTag t a -> a
tUnqualified Local ConvId
lcnv)
          ]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> Request -> Request
zUser UserId
usr
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Status] -> Request -> Request
expect [Status
status200, Status
status404]

-- | Calls 'Galley.API.getTeamConversationH'.
getTeamConv ::
  ( Member (Error ParseException) r,
    Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  Version ->
  UserId ->
  TeamId ->
  ConvId ->
  Sem r (Maybe Conv.TeamConversation)
getTeamConv :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
Version
-> UserId -> TeamId -> ConvId -> Sem r (Maybe TeamConversation)
getTeamConv Version
v UserId
usr TeamId
tid ConvId
cnv = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    ByteString -> Msg -> Msg
remote ByteString
"galley"
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString -> Msg -> Msg
forall a. ToBytes a => ByteString -> a -> Msg -> Msg
field ByteString
"conv" (ConvId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString ConvId
cnv)
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Getting team conversation")
  Response (Maybe ByteString)
rs <- (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req
  case Response (Maybe ByteString) -> Int
forall a. Response a -> Int
Bilge.statusCode Response (Maybe ByteString)
rs of
    Int
200 -> TeamConversation -> Maybe TeamConversation
forall a. a -> Maybe a
Just (TeamConversation -> Maybe TeamConversation)
-> Sem r TeamConversation -> Sem r (Maybe TeamConversation)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Response (Maybe ByteString) -> Sem r TeamConversation
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley" Response (Maybe ByteString)
rs
    Int
_ -> Maybe TeamConversation -> Sem r (Maybe TeamConversation)
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe TeamConversation
forall a. Maybe a
Nothing
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths
          [ Version -> ByteString
forall a. ToHttpApiData a => a -> ByteString
toHeader Version
v,
            ByteString
"teams",
            TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid,
            ByteString
"conversations",
            ConvId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' ConvId
cnv
          ]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> Request -> Request
zUser UserId
usr
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Status] -> Request -> Request
expect [Status
status200, Status
status404]

-- | Calls 'Galley.API.addClientH'.
newClient ::
  ( Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  UserId ->
  ClientId ->
  Sem r ()
newClient :: forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r, Member TinyLog r) =>
UserId -> ClientId -> Sem r ()
newClient UserId
u ClientId
c = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    ByteString -> Msg -> Msg
remote ByteString
"galley"
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString -> Msg -> Msg
forall a. ToBytes a => ByteString -> a -> Msg -> Msg
field ByteString
"user" (UserId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString UserId
u)
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString -> Msg -> Msg
forall a. ToBytes a => ByteString -> a -> Msg -> Msg
field ByteString
"client" (ClientId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString ClientId
c)
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"new client")
  Sem r (Response (Maybe ByteString)) -> Sem r ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem r (Response (Maybe ByteString)) -> Sem r ())
-> ((Request -> Request) -> Sem r (Response (Maybe ByteString)))
-> (Request -> Request)
-> Sem r ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest ((Request -> Request) -> Sem r ())
-> (Request -> Request) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    StdMethod -> Request -> Request
method StdMethod
POST
      (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"clients", ClientId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' ClientId
c]
      (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> Request -> Request
zUser UserId
u
      (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

-- | Calls 'Galley.API.canUserJoinTeamH'.
checkUserCanJoinTeam ::
  ( Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  TeamId ->
  Sem r (Maybe Wai.Error)
checkUserCanJoinTeam :: forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r (Maybe Error)
checkUserCanJoinTeam TeamId
tid = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    ByteString -> Msg -> Msg
remote ByteString
"galley"
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Check if can add member to team")
  Response (Maybe ByteString)
rs <- (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req
  Maybe Error -> Sem r (Maybe Error)
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Error -> Sem r (Maybe Error))
-> Maybe Error -> Sem r (Maybe Error)
forall a b. (a -> b) -> a -> b
$ case Response (Maybe ByteString) -> Int
forall a. Response a -> Int
Bilge.statusCode Response (Maybe ByteString)
rs of
    Int
200 -> Maybe Error
forall a. Maybe a
Nothing
    Int
_ -> case Response (Maybe ByteString) -> Maybe Error
forall a.
(HasCallStack, Typeable a, FromJSON a) =>
Response (Maybe ByteString) -> Maybe a
responseJsonMaybe Response (Maybe ByteString)
rs of
      Just (Error
e :: Wai.Error) -> Error -> Maybe Error
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Error
e
      Maybe Error
Nothing -> [Char] -> Maybe Error
forall a. HasCallStack => [Char] -> a
error ([Char]
"Invalid response from galley: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> Response (Maybe ByteString) -> [Char]
forall a. Show a => a -> [Char]
show Response (Maybe ByteString)
rs)
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"members", ByteString
"check"]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HeaderName -> ByteString -> Request -> Request
header HeaderName
"Content-Type" ByteString
"application/json"

-- | Calls 'Galley.API.uncheckedAddTeamMemberH'.
addTeamMember ::
  ( Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  UserId ->
  TeamId ->
  Maybe (UserId, UTCTimeMillis) ->
  Role ->
  Sem r Bool
addTeamMember :: forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r, Member TinyLog r) =>
UserId
-> TeamId -> Maybe (UserId, UTCTimeMillis) -> Role -> Sem r Bool
addTeamMember UserId
u TeamId
tid Maybe (UserId, UTCTimeMillis)
minvmeta Role
role = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    ByteString -> Msg -> Msg
remote ByteString
"galley"
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Adding member to team")
  Response (Maybe ByteString)
rs <- (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req
  Bool -> Sem r Bool
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> Sem r Bool) -> Bool -> Sem r Bool
forall a b. (a -> b) -> a -> b
$ case Response (Maybe ByteString) -> Int
forall a. Response a -> Int
Bilge.statusCode Response (Maybe ByteString)
rs of
    Int
200 -> Bool
True
    Int
_ -> Bool
False
  where
    prm :: Permissions
prm = Role -> Permissions
Member.rolePermissions Role
role
    bdy :: NewTeamMember
bdy = UserId
-> PermissionType 'Required
-> Maybe (UserId, UTCTimeMillis)
-> NewTeamMember
Member.mkNewTeamMember UserId
u Permissions
PermissionType 'Required
prm Maybe (UserId, UTCTimeMillis)
minvmeta
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
POST
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"members"]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HeaderName -> ByteString -> Request -> Request
header HeaderName
"Content-Type" ByteString
"application/json"
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> Request -> Request
zUser UserId
u
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Status] -> Request -> Request
expect [Status
status200, Status
status403]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Request -> Request
lbytes (NewTeamMember -> ByteString
forall a. ToJSON a => a -> ByteString
encode NewTeamMember
bdy)

-- | Calls 'Galley.API.createBindingTeamH'.
createTeam ::
  ( Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  UserId ->
  NewTeam ->
  TeamId ->
  Sem r ()
createTeam :: forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r, Member TinyLog r) =>
UserId -> NewTeam -> TeamId -> Sem r ()
createTeam UserId
u NewTeam
t TeamId
teamid = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    ByteString -> Msg -> Msg
remote ByteString
"galley"
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Creating Team")
  Sem r (Response (Maybe ByteString)) -> Sem r ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem r (Response (Maybe ByteString)) -> Sem r ())
-> Sem r (Response (Maybe ByteString)) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest ((Request -> Request) -> Sem r (Response (Maybe ByteString)))
-> (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall a b. (a -> b) -> a -> b
$ TeamId -> Request -> Request
req TeamId
teamid
  where
    req :: TeamId -> Request -> Request
req TeamId
tid =
      StdMethod -> Request -> Request
method StdMethod
PUT
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HeaderName -> ByteString -> Request -> Request
header HeaderName
"Content-Type" ByteString
"application/json"
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> Request -> Request
zUser UserId
u
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Request -> Request
lbytes (NewTeam -> ByteString
forall a. ToJSON a => a -> ByteString
encode NewTeam
t)

-- | Calls 'Galley.API.uncheckedGetTeamMemberH'.
getTeamMember ::
  ( Member (Error ParseException) r,
    Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  UserId ->
  TeamId ->
  Sem r (Maybe TeamMember)
getTeamMember :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
UserId -> TeamId -> Sem r (Maybe TeamMember)
getTeamMember UserId
u TeamId
tid = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    ByteString -> Msg -> Msg
remote ByteString
"galley"
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Get team member")
  Response (Maybe ByteString)
rs <- (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req
  case Response (Maybe ByteString) -> Int
forall a. Response a -> Int
Bilge.statusCode Response (Maybe ByteString)
rs of
    Int
200 -> TeamMember -> Maybe TeamMember
forall a. a -> Maybe a
Just (TeamMember -> Maybe TeamMember)
-> Sem r TeamMember -> Sem r (Maybe TeamMember)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Response (Maybe ByteString) -> Sem r TeamMember
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley" Response (Maybe ByteString)
rs
    Int
_ -> Maybe TeamMember -> Sem r (Maybe TeamMember)
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe TeamMember
forall a. Maybe a
Nothing
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"members", UserId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' UserId
u]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> Request -> Request
zUser UserId
u
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Status] -> Request -> Request
expect [Status
status200, Status
status404]

-- | Calls 'Galley.API.uncheckedGetTeamMembersH'.
--
-- | TODO: is now truncated.  this is (only) used for team suspension / unsuspension, which
-- means that only the first 2000 members of a team (according to some arbitrary order) will
-- be suspended, and the rest will remain active.
getTeamMembers ::
  ( Member (Error ParseException) r,
    Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  TeamId ->
  Sem r TeamMemberList
getTeamMembers :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r (TeamMemberList' 'Required)
getTeamMembers TeamId
tid = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Msg -> Msg
remote ByteString
"galley" (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Get team members")
  (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req Sem r (Response (Maybe ByteString))
-> (Response (Maybe ByteString)
    -> Sem r (TeamMemberList' 'Required))
-> Sem r (TeamMemberList' 'Required)
forall a b. Sem r a -> (a -> Sem r b) -> Sem r b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text
-> Response (Maybe ByteString) -> Sem r (TeamMemberList' 'Required)
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley"
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"members"]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

memberIsTeamOwner ::
  (Member Rpc r, Member (Input Endpoint) r) =>
  TeamId ->
  UserId ->
  Sem r Bool
memberIsTeamOwner :: forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
TeamId -> UserId -> Sem r Bool
memberIsTeamOwner TeamId
tid UserId
uid = do
  Response (Maybe ByteString)
r <-
    (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest ((Request -> Request) -> Sem r (Response (Maybe ByteString)))
-> (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall a b. (a -> b) -> a -> b
$
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"is-team-owner", UserId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' UserId
uid]
  Bool -> Sem r Bool
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> Sem r Bool) -> Bool -> Sem r Bool
forall a b. (a -> b) -> a -> b
$ Response (Maybe ByteString) -> Status
forall body. Response body -> Status
responseStatus Response (Maybe ByteString)
r Status -> Status -> Bool
forall a. Eq a => a -> a -> Bool
/= Status
status403

-- | Calls 'Galley.API.getBindingTeamIdH'.
getTeamId ::
  ( Member (Error ParseException) r,
    Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  UserId ->
  Sem r (Maybe TeamId)
getTeamId :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
UserId -> Sem r (Maybe TeamId)
getTeamId UserId
u = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Msg -> Msg
remote ByteString
"galley" (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Get team from user")
  Response (Maybe ByteString)
rs <- (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req
  case Response (Maybe ByteString) -> Int
forall a. Response a -> Int
Bilge.statusCode Response (Maybe ByteString)
rs of
    Int
200 -> TeamId -> Maybe TeamId
forall a. a -> Maybe a
Just (TeamId -> Maybe TeamId) -> Sem r TeamId -> Sem r (Maybe TeamId)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Response (Maybe ByteString) -> Sem r TeamId
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley" Response (Maybe ByteString)
rs
    Int
_ -> Maybe TeamId -> Sem r (Maybe TeamId)
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe TeamId
forall a. Maybe a
Nothing
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"users", UserId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' UserId
u, ByteString
"team"]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Status] -> Request -> Request
expect [Status
status200, Status
status404]

-- | Calls 'Galley.API.getTeamInternalH'.
getTeam ::
  ( Member (Error ParseException) r,
    Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  TeamId ->
  Sem r Team.TeamData
getTeam :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r TeamData
getTeam TeamId
tid = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Msg -> Msg
remote ByteString
"galley" (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Get team info")
  (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req Sem r (Response (Maybe ByteString))
-> (Response (Maybe ByteString) -> Sem r TeamData)
-> Sem r TeamData
forall a b. Sem r a -> (a -> Sem r b) -> Sem r b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text -> Response (Maybe ByteString) -> Sem r TeamData
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley"
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

-- | Calls 'Galley.API.getTeamInternalH'.
getTeamName ::
  ( Member (Error ParseException) r,
    Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  TeamId ->
  Sem r Team.TeamName
getTeamName :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r TeamName
getTeamName TeamId
tid = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Msg -> Msg
remote ByteString
"galley" (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Get team info")
  (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req Sem r (Response (Maybe ByteString))
-> (Response (Maybe ByteString) -> Sem r TeamName)
-> Sem r TeamName
forall a b. Sem r a -> (a -> Sem r b) -> Sem r b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text -> Response (Maybe ByteString) -> Sem r TeamName
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley"
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"name"]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

-- | Calls 'Galley.API.getTeamFeatureStatusH'.
getTeamLegalHoldStatus ::
  ( Member (Error ParseException) r,
    Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  TeamId ->
  Sem r (LockableFeature LegalholdConfig)
getTeamLegalHoldStatus :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r (LockableFeature LegalholdConfig)
getTeamLegalHoldStatus TeamId
tid = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Msg -> Msg
remote ByteString
"galley" (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Get legalhold settings")
  (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req Sem r (Response (Maybe ByteString))
-> (Response (Maybe ByteString)
    -> Sem r (LockableFeature LegalholdConfig))
-> Sem r (LockableFeature LegalholdConfig)
forall a b. Sem r a -> (a -> Sem r b) -> Sem r b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text
-> Response (Maybe ByteString)
-> Sem r (LockableFeature LegalholdConfig)
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley"
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"features", forall cfg. IsFeatureConfig cfg => ByteString
featureNameBS @LegalholdConfig]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

-- | Calls 'Galley.API.getSearchVisibilityInternalH'.
getTeamSearchVisibility ::
  ( Member (Error ParseException) r,
    Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  TeamId ->
  Sem r TeamSearchVisibility
getTeamSearchVisibility :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r TeamSearchVisibility
getTeamSearchVisibility TeamId
tid =
  forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @TeamSearchVisibilityView @TeamSearchVisibility (TeamSearchVisibilityView -> TeamSearchVisibility)
-> Sem r TeamSearchVisibilityView -> Sem r TeamSearchVisibility
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
    (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Msg -> Msg
remote ByteString
"galley" (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Get search visibility settings")
    (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req Sem r (Response (Maybe ByteString))
-> (Response (Maybe ByteString) -> Sem r TeamSearchVisibilityView)
-> Sem r TeamSearchVisibilityView
forall a b. Sem r a -> (a -> Sem r b) -> Sem r b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text
-> Response (Maybe ByteString) -> Sem r TeamSearchVisibilityView
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley"
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"search-visibility"]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

getFeatureConfigForTeam ::
  forall feature r.
  ( IsFeatureConfig feature,
    Typeable feature,
    Member TinyLog r,
    Member Rpc r,
    Member (Error ParseException) r
  ) =>
  TeamId ->
  Sem (Input Endpoint : r) (LockableFeature feature)
getFeatureConfigForTeam :: forall feature (r :: EffectRow).
(IsFeatureConfig feature, Typeable feature, Member TinyLog r,
 Member Rpc r, Member (Error ParseException) r) =>
TeamId -> Sem (Input Endpoint : r) (LockableFeature feature)
getFeatureConfigForTeam TeamId
tid = do
  (Msg -> Msg) -> Sem (Input Endpoint : r) ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem (Input Endpoint : r) ())
-> (Msg -> Msg) -> Sem (Input Endpoint : r) ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Msg -> Msg
remote ByteString
"galley" (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Get feature config for team")
  (Request -> Request)
-> Sem (Input Endpoint : r) (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req Sem (Input Endpoint : r) (Response (Maybe ByteString))
-> (Response (Maybe ByteString)
    -> Sem (Input Endpoint : r) (LockableFeature feature))
-> Sem (Input Endpoint : r) (LockableFeature feature)
forall a b.
Sem (Input Endpoint : r) a
-> (a -> Sem (Input Endpoint : r) b) -> Sem (Input Endpoint : r) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text
-> Response (Maybe ByteString)
-> Sem (Input Endpoint : r) (LockableFeature feature)
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley"
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"features", forall cfg. IsFeatureConfig cfg => ByteString
featureNameBS @feature]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

getVerificationCodeEnabled ::
  ( Member (Error ParseException) r,
    Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  TeamId ->
  Sem r Bool
getVerificationCodeEnabled :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member Rpc r,
 Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> Sem r Bool
getVerificationCodeEnabled TeamId
tid = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Msg -> Msg
remote ByteString
"galley" (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Get snd factor password challenge settings")
  Response (Maybe ByteString)
response <- (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req
  FeatureStatus
status <- (.status) (LockableFeature SndFactorPasswordChallengeConfig -> FeatureStatus)
-> Sem r (LockableFeature SndFactorPasswordChallengeConfig)
-> Sem r FeatureStatus
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow @(LockableFeature SndFactorPasswordChallengeConfig) Text
"galley" Response (Maybe ByteString)
response
  case FeatureStatus
status of
    FeatureStatus
FeatureStatusEnabled -> Bool -> Sem r Bool
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
    FeatureStatus
FeatureStatusDisabled -> Bool -> Sem r Bool
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"features", forall cfg. IsFeatureConfig cfg => ByteString
featureNameBS @SndFactorPasswordChallengeConfig]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

decodeBodyOrThrow :: forall a r. (Typeable a, FromJSON a, Member (Error ParseException) r) => Text -> Response (Maybe BL.ByteString) -> Sem r a
decodeBodyOrThrow :: forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
ctx Response (Maybe ByteString)
r = ([Char] -> Sem r a) -> (a -> Sem r a) -> Either [Char] a -> Sem r a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (ParseException -> Sem r a
forall e (r :: EffectRow) a. Member (Error e) r => e -> Sem r a
throw (ParseException -> Sem r a)
-> ([Char] -> ParseException) -> [Char] -> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Char] -> ParseException
ParseException Text
ctx) a -> Sem r a
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Response (Maybe ByteString) -> Either [Char] a
forall a.
(HasCallStack, Typeable a, FromJSON a) =>
Response (Maybe ByteString) -> Either [Char] a
responseJsonEither Response (Maybe ByteString)
r)

getAllTeamFeaturesForUser ::
  (Member Rpc r, Member (Input Endpoint) r) =>
  Maybe UserId ->
  Sem r AllTeamFeatures
getAllTeamFeaturesForUser :: forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
Maybe UserId -> Sem r (NP LockableFeature Features)
getAllTeamFeaturesForUser Maybe UserId
mbUserId =
  Response (Maybe ByteString) -> NP LockableFeature Features
forall a.
(HasCallStack, Typeable a, FromJSON a) =>
Response (Maybe ByteString) -> a
responseJsonUnsafe
    (Response (Maybe ByteString) -> NP LockableFeature Features)
-> Sem r (Response (Maybe ByteString))
-> Sem r (NP LockableFeature Features)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest
      ( StdMethod -> Request -> Request
method StdMethod
GET
          (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"feature-configs"]
          (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Request -> Request)
-> (UserId -> Request -> Request)
-> Maybe UserId
-> Request
-> Request
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Request -> Request
forall a. a -> a
id (ByteString -> ByteString -> Request -> Request
queryItem ByteString
"user_id" (ByteString -> Request -> Request)
-> (UserId -> ByteString) -> UserId -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString') Maybe UserId
mbUserId
      )

-- | Calls 'Galley.API.updateTeamStatusH'.
changeTeamStatus ::
  ( Member Rpc r,
    Member (Input Endpoint) r,
    Member TinyLog r
  ) =>
  TeamId ->
  Team.TeamStatus ->
  Maybe Currency.Alpha ->
  Sem r ()
changeTeamStatus :: forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r, Member TinyLog r) =>
TeamId -> TeamStatus -> Maybe Alpha -> Sem r ()
changeTeamStatus TeamId
tid TeamStatus
s Maybe Alpha
cur = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Msg -> Msg
remote ByteString
"galley" (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Change Team status")
  Sem r (Response (Maybe ByteString)) -> Sem r ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem r (Response (Maybe ByteString)) -> Sem r ())
-> Sem r (Response (Maybe ByteString)) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
PUT
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"status"]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HeaderName -> ByteString -> Request -> Request
header HeaderName
"Content-Type" ByteString
"application/json"
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Request -> Request
lbytes (TeamStatusUpdate -> ByteString
forall a. ToJSON a => a -> ByteString
encode (TeamStatusUpdate -> ByteString) -> TeamStatusUpdate -> ByteString
forall a b. (a -> b) -> a -> b
$ TeamStatus -> Maybe Alpha -> TeamStatusUpdate
Team.TeamStatusUpdate TeamStatus
s Maybe Alpha
cur)

getTeamExposeInvitationURLsToTeamAdmin ::
  ( Member Rpc r,
    Member (Input Endpoint) r,
    Member (Error ParseException) r,
    Member TinyLog r
  ) =>
  TeamId ->
  Sem r ShowOrHideInvitationUrl
getTeamExposeInvitationURLsToTeamAdmin :: forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r,
 Member (Error ParseException) r, Member TinyLog r) =>
TeamId -> Sem r ShowOrHideInvitationUrl
getTeamExposeInvitationURLsToTeamAdmin TeamId
tid = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Msg -> Msg
remote ByteString
"galley" (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Get expose invitation URLs to team admin settings")
  Response (Maybe ByteString)
response <- (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req
  FeatureStatus
status <- (.status) (LockableFeature ExposeInvitationURLsToTeamAdminConfig
 -> FeatureStatus)
-> Sem r (LockableFeature ExposeInvitationURLsToTeamAdminConfig)
-> Sem r FeatureStatus
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow @(LockableFeature ExposeInvitationURLsToTeamAdminConfig) Text
"galley" Response (Maybe ByteString)
response
  case FeatureStatus
status of
    FeatureStatus
FeatureStatusEnabled -> ShowOrHideInvitationUrl -> Sem r ShowOrHideInvitationUrl
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ShowOrHideInvitationUrl
ShowInvitationUrl
    FeatureStatus
FeatureStatusDisabled -> ShowOrHideInvitationUrl -> Sem r ShowOrHideInvitationUrl
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ShowOrHideInvitationUrl
HideInvitationUrl
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"teams", TeamId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' TeamId
tid, ByteString
"features", forall cfg. IsFeatureConfig cfg => ByteString
featureNameBS @ExposeInvitationURLsToTeamAdminConfig]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

checkMLSOne2OneEstablished ::
  ( Member (Error ParseException) r,
    Member (Input Endpoint) r,
    Member Rpc r,
    Member TinyLog r
  ) =>
  Local UserId ->
  Qualified UserId ->
  Sem r MLSOneToOneEstablished
checkMLSOne2OneEstablished :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member (Input Endpoint) r,
 Member Rpc r, Member TinyLog r) =>
Local UserId -> Qualified UserId -> Sem r MLSOneToOneEstablished
checkMLSOne2OneEstablished Local UserId
self (Qualified UserId
other Domain
otherDomain) = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Msg -> Msg
remote ByteString
"galley" (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Get the MLS one-to-one conversation")
  Response (Maybe ByteString)
responseSelf <- (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
req
  case Status -> Int
HTTP.statusCode (Response (Maybe ByteString) -> Status
forall body. Response body -> Status
HTTP.responseStatus Response (Maybe ByteString)
responseSelf) of
    Int
200 -> do
      Bool
established <- forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow @Bool Text
"galley" Response (Maybe ByteString)
responseSelf
      MLSOneToOneEstablished -> Sem r MLSOneToOneEstablished
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MLSOneToOneEstablished -> Sem r MLSOneToOneEstablished)
-> MLSOneToOneEstablished -> Sem r MLSOneToOneEstablished
forall a b. (a -> b) -> a -> b
$ if Bool
established then MLSOneToOneEstablished
Established else MLSOneToOneEstablished
NotEstablished
    Int
403 -> MLSOneToOneEstablished -> Sem r MLSOneToOneEstablished
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MLSOneToOneEstablished
NotAMember
    Int
400 -> MLSOneToOneEstablished -> Sem r MLSOneToOneEstablished
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MLSOneToOneEstablished
NotEstablished
    Int
_ -> MLSOneToOneEstablished -> Sem r MLSOneToOneEstablished
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MLSOneToOneEstablished
NotEstablished
  where
    req :: Request -> Request
req =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths
          [ ByteString
"i",
            ByteString
"conversations",
            ByteString
"mls-one2one",
            Domain -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' Domain
otherDomain,
            UserId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' UserId
other,
            ByteString
"established"
          ]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> Request -> Request
zUser (Local UserId -> UserId
forall (t :: QTag) a. QualifiedWithTag t a -> a
tUnqualified Local UserId
self)

unblockConversation ::
  ( Member (Error ParseException) r,
    Member (Input Endpoint) r,
    Member Rpc r,
    Member TinyLog r
  ) =>
  Version ->
  Local UserId ->
  Maybe ConnId ->
  Qualified ConvId ->
  Sem r Conversation
unblockConversation :: forall (r :: EffectRow).
(Member (Error ParseException) r, Member (Input Endpoint) r,
 Member Rpc r, Member TinyLog r) =>
Version
-> Local UserId
-> Maybe ConnId
-> Qualified ConvId
-> Sem r Conversation
unblockConversation Version
v Local UserId
lusr Maybe ConnId
mconn (Qualified ConvId
cnv Domain
cdom) = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    ByteString -> Msg -> Msg
remote ByteString
"galley"
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString -> Msg -> Msg
forall a. ToBytes a => ByteString -> a -> Msg -> Msg
field ByteString
"conv" (ConvId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString ConvId
cnv)
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString -> Msg -> Msg
forall a. ToBytes a => ByteString -> a -> Msg -> Msg
field ByteString
"domain" (Domain -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString Domain
cdom)
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"Unblocking conversation")
  Sem r (Response (Maybe ByteString)) -> Sem r ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem r (Response (Maybe ByteString)) -> Sem r ())
-> Sem r (Response (Maybe ByteString)) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
putReq
  (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
getReq Sem r (Response (Maybe ByteString))
-> (Response (Maybe ByteString) -> Sem r Conversation)
-> Sem r Conversation
forall a b. Sem r a -> (a -> Sem r b) -> Sem r b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow @Conversation Text
"galley"
  where
    putReq :: Request -> Request
putReq =
      StdMethod -> Request -> Request
method StdMethod
PUT
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"conversations", Domain -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' Domain
cdom, ConvId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' ConvId
cnv, ByteString
"unblock"]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> Request -> Request
zUser (Local UserId -> UserId
forall (t :: QTag) a. QualifiedWithTag t a -> a
tUnqualified Local UserId
lusr)
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Request -> Request)
-> (ConnId -> Request -> Request)
-> Maybe ConnId
-> Request
-> Request
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Request -> Request
forall a. a -> a
id (HeaderName -> ByteString -> Request -> Request
header HeaderName
"Z-Connection" (ByteString -> Request -> Request)
-> (ConnId -> ByteString) -> ConnId -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConnId -> ByteString
fromConnId) Maybe ConnId
mconn
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx
    getReq :: Request -> Request
getReq =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [Version -> ByteString
forall a. ToHttpApiData a => a -> ByteString
toHeader Version
v, ByteString
"conversations", Domain -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' Domain
cdom, ConvId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' ConvId
cnv]
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserId -> Request -> Request
zUser (Local UserId -> UserId
forall (t :: QTag) a. QualifiedWithTag t a -> a
tUnqualified Local UserId
lusr)
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
expect2xx

remote :: ByteString -> Msg -> Msg
remote :: ByteString -> Msg -> Msg
remote = ByteString -> ByteString -> Msg -> Msg
forall a. ToBytes a => ByteString -> a -> Msg -> Msg
field ByteString
"remote"

getEJPDConvInfo ::
  forall r.
  ( Member TinyLog r,
    Member (Error ParseException) r,
    Member (Input Endpoint) r,
    Member Rpc r
  ) =>
  UserId ->
  Sem r [EJPDConvInfo]
getEJPDConvInfo :: forall (r :: EffectRow).
(Member TinyLog r, Member (Error ParseException) r,
 Member (Input Endpoint) r, Member Rpc r) =>
UserId -> Sem r [EJPDConvInfo]
getEJPDConvInfo UserId
uid = do
  (Msg -> Msg) -> Sem r ()
forall msg (r :: EffectRow).
Member (Logger msg) r =>
msg -> Sem r ()
debug ((Msg -> Msg) -> Sem r ()) -> (Msg -> Msg) -> Sem r ()
forall a b. (a -> b) -> a -> b
$
    ByteString -> Msg -> Msg
remote ByteString
"galley"
      (Msg -> Msg) -> (Msg -> Msg) -> Msg -> Msg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Msg -> Msg
forall a. ToBytes a => a -> Msg -> Msg
msg (ByteString -> Builder
val ByteString
"get conversation info for ejpd")
  Text -> Response (Maybe ByteString) -> Sem r [EJPDConvInfo]
forall a (r :: EffectRow).
(Typeable a, FromJSON a, Member (Error ParseException) r) =>
Text -> Response (Maybe ByteString) -> Sem r a
decodeBodyOrThrow Text
"galley" (Response (Maybe ByteString) -> Sem r [EJPDConvInfo])
-> Sem r (Response (Maybe ByteString)) -> Sem r [EJPDConvInfo]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Request -> Request) -> Sem r (Response (Maybe ByteString))
forall (r :: EffectRow).
(Member Rpc r, Member (Input Endpoint) r) =>
(Request -> Request) -> Sem r (Response (Maybe ByteString))
galleyRequest Request -> Request
getReq
  where
    getReq :: Request -> Request
getReq =
      StdMethod -> Request -> Request
method StdMethod
GET
        (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> Request -> Request
paths [ByteString
"i", ByteString
"user", UserId -> ByteString
forall a. ToByteString a => a -> ByteString
toByteString' UserId
uid, ByteString
"all-conversations"]