Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/3-bug-fixes/WPB-6351
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Intra-service calls from brig to galley's public API are now aware of disabled API versions
7 changes: 6 additions & 1 deletion libs/wire-api/src/Wire/API/Routes/Version.hs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ module Wire.API.Routes.Version
isDevelopmentVersion,
developmentVersions,
expandVersionExp,
maxAvailableVersion,

-- * Servant combinators
Until,
Expand All @@ -58,12 +59,13 @@ import Data.ByteString.Lazy qualified as LBS
import Data.Domain
import Data.OpenApi qualified as S
import Data.Schema
import Data.Set ((\\))
import Data.Set qualified as Set
import Data.Singletons.Base.TH
import Data.Text qualified as Text
import Data.Text.Encoding as Text
import GHC.TypeLits
import Imports
import Imports hiding ((\\))
import Servant
import Servant.API.Extended.RawM
import Wire.API.Deprecated
Expand Down Expand Up @@ -103,6 +105,9 @@ versionInt V6 = 6
supportedVersions :: [Version]
supportedVersions = [minBound .. maxBound]

maxAvailableVersion :: Set Version -> Maybe Version
maxAvailableVersion disabled = Set.lookupMax $ Set.fromList supportedVersions \\ disabled

----------------------------------------------------------------------

versionText :: Version -> Text
Expand Down
8 changes: 8 additions & 0 deletions libs/wire-api/test/unit/Test/Wire/API/Routes/Version.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module Test.Wire.API.Routes.Version where
import Data.Aeson as Aeson
import Data.Binary.Builder
import Data.ByteString.Conversion
import Data.Set as Set
import Imports
import Servant.API
import Test.Tasty
Expand Down Expand Up @@ -34,6 +35,13 @@ tests =
testCase "toEncodedUrlPiece" $ tail . show . fromVersionNumber <$> allVersionNumbers @=? cs . toLazyByteString . toEncodedUrlPiece <$> allVersionNumbers,
testCase "toHeader" $ tail . show . fromVersionNumber <$> allVersionNumbers @=? cs . toHeader <$> allVersionNumbers,
testCase "toQueryParam" $ tail . show . fromVersionNumber <$> allVersionNumbers @=? cs . toQueryParam <$> allVersionNumbers
],
testGroup "Version: maxAvailableVersion" $
[ testCase "no version disable" $ maxAvailableVersion mempty @=? Just (maximum allVersions),
testCase "all versions disabled" $ maxAvailableVersion (Set.fromList allVersions) @=? Nothing,
testCase "all but the min version disabled" $ maxAvailableVersion (Set.fromList (tail allVersions)) @=? Just (minimum allVersions),
testCase "all but the max version disabled" $ maxAvailableVersion (Set.fromList (init allVersions)) @=? Just (maximum allVersions),
testCase "highest version disabled" $ maxAvailableVersion (Set.singleton (last allVersions)) @=? Just (maximum (init allVersions))
]
]

Expand Down
2 changes: 1 addition & 1 deletion services/brig/src/Brig/CanonicalInterpreter.hs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ runBrigToIO e (AppT ma) = do
. interpretClientToIO (e ^. casClient)
. interpretRpcToIO (e ^. httpManager) (e ^. requestId)
. interpretServiceRpcToRpc @'Galley "galley" (e ^. galley)
. interpretGalleyProviderToRPC
. interpretGalleyProviderToRPC (e ^. disabledVersions)
. codeStoreToCassandra @Cas.Client
. nowToIOAction (e ^. currentTime)
. userPendingActivationStoreToCassandra
Expand Down
58 changes: 32 additions & 26 deletions services/brig/src/Brig/Effects/GalleyProvider/RPC.hs
Original file line number Diff line number Diff line change
Expand Up @@ -62,44 +62,48 @@ interpretGalleyProviderToRPC ::
Member (ServiceRPC 'Galley) r,
Member (Logger (Msg -> Msg)) r
) =>
Set Version ->
Sem (GalleyProvider ': r) a ->
Sem r a
interpretGalleyProviderToRPC = interpret $ \case
CreateSelfConv id' -> createSelfConv id'
GetConv id' id'' -> getConv id' id''
GetTeamConv id' id'' id'2 -> getTeamConv id' id'' id'2
NewClient id' ci -> newClient id' ci
CheckUserCanJoinTeam id' -> checkUserCanJoinTeam id'
AddTeamMember id' id'' x0 -> addTeamMember id' id'' x0
CreateTeam id' bnt id'' -> createTeam id' bnt id''
GetTeamMember id' id'' -> getTeamMember id' id''
GetTeamMembers id' -> getTeamMembers id'
GetTeamId id' -> getTeamId id'
GetTeam id' -> getTeam id'
GetTeamName id' -> getTeamName id'
GetTeamLegalHoldStatus id' -> getTeamLegalHoldStatus id'
GetTeamSearchVisibility id' -> getTeamSearchVisibility id'
ChangeTeamStatus id' ts m_al -> changeTeamStatus id' ts m_al
MemberIsTeamOwner id' id'' -> memberIsTeamOwner id' id''
GetAllFeatureConfigsForUser m_id' -> getAllFeatureConfigsForUser m_id'
GetVerificationCodeEnabled id' -> getVerificationCodeEnabled id'
GetExposeInvitationURLsToTeamAdmin id' -> getTeamExposeInvitationURLsToTeamAdmin id'
interpretGalleyProviderToRPC disabledVersions =
let v = fromMaybe (error "service can't run with undefined API version") $ maxAvailableVersion disabledVersions
in interpret $ \case
CreateSelfConv id' -> createSelfConv v id'
GetConv id' id'' -> getConv v id' id''
GetTeamConv id' id'' id'2 -> getTeamConv v id' id'' id'2
NewClient id' ci -> newClient id' ci
CheckUserCanJoinTeam id' -> checkUserCanJoinTeam id'
AddTeamMember id' id'' x0 -> addTeamMember id' id'' x0
CreateTeam id' bnt id'' -> createTeam id' bnt id''
GetTeamMember id' id'' -> getTeamMember id' id''
GetTeamMembers id' -> getTeamMembers id'
GetTeamId id' -> getTeamId id'
GetTeam id' -> getTeam id'
GetTeamName id' -> getTeamName id'
GetTeamLegalHoldStatus id' -> getTeamLegalHoldStatus id'
GetTeamSearchVisibility id' -> getTeamSearchVisibility id'
ChangeTeamStatus id' ts m_al -> changeTeamStatus id' ts m_al
MemberIsTeamOwner id' id'' -> memberIsTeamOwner id' id''
GetAllFeatureConfigsForUser m_id' -> getAllFeatureConfigsForUser m_id'
GetVerificationCodeEnabled id' -> getVerificationCodeEnabled id'
GetExposeInvitationURLsToTeamAdmin id' -> getTeamExposeInvitationURLsToTeamAdmin id'

-- | Calls 'Galley.API.createSelfConversationH'.
createSelfConv ::
( Member (ServiceRPC 'Galley) r,
Member (Logger (Msg -> Msg)) r
) =>
Version ->
UserId ->
Sem r ()
createSelfConv u = do
createSelfConv v u = do
debug $
remote "galley"
. msg (val "Creating self conversation")
void $ ServiceRPC.request @'Galley POST req
where
req =
paths [toHeader (maxBound :: Version), "conversations", "self"]
paths [toHeader v, "conversations", "self"]
. zUser u
. expect2xx

Expand All @@ -109,10 +113,11 @@ getConv ::
Member (ServiceRPC 'Galley) r,
Member (Logger (Msg -> Msg)) r
) =>
Version ->
UserId ->
Local ConvId ->
Sem r (Maybe Conversation)
getConv usr lcnv = do
getConv v usr lcnv = do
debug $
remote "galley"
. field "domain" (toByteString (tDomain lcnv))
Expand All @@ -125,7 +130,7 @@ getConv usr lcnv = do
where
req =
paths
[ toHeader (maxBound :: Version),
[ toHeader v,
"conversations",
toByteString' (tDomain lcnv),
toByteString' (tUnqualified lcnv)
Expand All @@ -139,11 +144,12 @@ getTeamConv ::
Member (ServiceRPC 'Galley) r,
Member (Logger (Msg -> Msg)) r
) =>
Version ->
UserId ->
TeamId ->
ConvId ->
Sem r (Maybe Conv.TeamConversation)
getTeamConv usr tid cnv = do
getTeamConv v usr tid cnv = do
debug $
remote "galley"
. field "conv" (toByteString cnv)
Expand All @@ -155,7 +161,7 @@ getTeamConv usr tid cnv = do
where
req =
paths
[ toHeader (maxBound :: Version),
[ toHeader v,
"teams",
toByteString' tid,
"conversations",
Expand Down