diff --git a/Makefile b/Makefile
index e422703c453..9f2f6767fc3 100644
--- a/Makefile
+++ b/Makefile
@@ -607,4 +607,10 @@ upload-bombon:
.PHONY: openapi-validate
openapi-validate:
@echo -e "Make sure you are running the backend in another terminal (make cr)\n"
- vacuum lint -a -d -w <(curl http://localhost:8082/v7/api/swagger.json)
+ vacuum lint -a -d -e <(curl http://localhost:8082/v7/api/swagger.json)
+# vacuum lint -a -d -e <(curl http://localhost:8082/api-internal/swagger-ui/cannon-swagger.json)
+# vacuum lint -a -d -e <(curl http://localhost:8082/api-internal/swagger-ui/cargohold-swagger.json)
+# vacuum lint -a -d -e <(curl http://localhost:8082/api-internal/swagger-ui/spar-swagger.json)
+# vacuum lint -a -d -e <(curl http://localhost:8082/api-internal/swagger-ui/gundeck-swagger.json)
+# vacuum lint -a -d -e <(curl http://localhost:8082/api-internal/swagger-ui/brig-swagger.json)
+# vacuum lint -a -d -e <(curl http://localhost:8082/api-internal/swagger-ui/galley-swagger.json)
diff --git a/changelog.d/4-docs/openapi-validation b/changelog.d/4-docs/openapi-validation
index a70ca12d5e5..21512f1387d 100644
--- a/changelog.d/4-docs/openapi-validation
+++ b/changelog.d/4-docs/openapi-validation
@@ -1 +1 @@
-Fix openapi validation errors
+Fix openapi validation errors (#4295, ##)
diff --git a/changelog.d/5-internal/openapi-validation b/changelog.d/5-internal/openapi-validation
new file mode 100644
index 00000000000..02263c5c73d
--- /dev/null
+++ b/changelog.d/5-internal/openapi-validation
@@ -0,0 +1 @@
+Add openapi validation test to integration
diff --git a/charts/nginz/values.yaml b/charts/nginz/values.yaml
index 12d6708f8d9..c9d97e90ff6 100644
--- a/charts/nginz/values.yaml
+++ b/charts/nginz/values.yaml
@@ -156,6 +156,10 @@ nginx_conf:
envs:
- all
doc: true
+ - path: /handles
+ envs:
+ - all
+ doc: true
- path: /list-users
envs:
- all
@@ -291,9 +295,6 @@ nginx_conf:
- path: /bot/users
envs:
- all
- - path: /conversations/([^/]*)/bots
- envs:
- - all
- path: /invitations/info
envs:
- all
@@ -479,7 +480,7 @@ nginx_conf:
- all
max_body_size: 40m
body_buffer_size: 256k
- - path: /conversations/one2one/
+ - path: /one2one-conversations/
envs:
- all
# During MLS migration, this endpoint gets called _a lot_.
diff --git a/integration/test/API/Brig.hs b/integration/test/API/Brig.hs
index c2c085d069f..d084bdf542d 100644
--- a/integration/test/API/Brig.hs
+++ b/integration/test/API/Brig.hs
@@ -682,7 +682,7 @@ getCallsConfigV2 user = do
addBot :: (HasCallStack, MakesValue user) => user -> String -> String -> String -> App Response
addBot user providerId serviceId convId = do
- req <- baseRequest user Brig Versioned $ joinHttpPath ["conversations", convId, "bots"]
+ req <- baseRequest user Brig Versioned $ joinHttpPath ["bot", "conversations", convId]
submit "POST" $
req
& zType "access"
diff --git a/integration/test/API/Galley.hs b/integration/test/API/Galley.hs
index 6299fc97f8f..d1c4066ae70 100644
--- a/integration/test/API/Galley.hs
+++ b/integration/test/API/Galley.hs
@@ -327,6 +327,18 @@ deleteTeamConv team conv user = do
req <- baseRequest user Galley Versioned (joinHttpPath ["teams", teamId, "conversations", convId])
submit "DELETE" req
+getMLSOne2OneConversationLegacy ::
+ (HasCallStack, MakesValue self, MakesValue other) =>
+ self ->
+ other ->
+ App Response
+getMLSOne2OneConversationLegacy self other = do
+ (domain, uid) <- objQid other
+ req <-
+ baseRequest self Galley Versioned
+ $ joinHttpPath ["conversations", "one2one", domain, uid]
+ submit "GET" req
+
getMLSOne2OneConversation ::
(HasCallStack, MakesValue self, MakesValue other) =>
self ->
@@ -336,7 +348,7 @@ getMLSOne2OneConversation self other = do
(domain, uid) <- objQid other
req <-
baseRequest self Galley Versioned
- $ joinHttpPath ["conversations", "one2one", domain, uid]
+ $ joinHttpPath ["one2one-conversations", domain, uid]
submit "GET" req
getGroupClients ::
diff --git a/integration/test/Test/Bot.hs b/integration/test/Test/Bot.hs
index b635b9e0acd..8cf199ee9db 100644
--- a/integration/test/Test/Bot.hs
+++ b/integration/test/Test/Bot.hs
@@ -146,7 +146,6 @@ onBotCreate chan _headers _req k = do
onBotMessage chan _headers req k = do
body <- liftIO $ Wai.strictRequestBody req
writeChan chan (BotMessage (cs body))
- liftIO $ putStrLn $ cs body
k (responseLBS status200 mempty mempty)
onBotAlive _chan _headers _req k = do
k (responseLBS status200 mempty (cs "success"))
diff --git a/integration/test/Test/MLS/One2One.hs b/integration/test/Test/MLS/One2One.hs
index 5c11247ebec..cbc4c1339e2 100644
--- a/integration/test/Test/MLS/One2One.hs
+++ b/integration/test/Test/MLS/One2One.hs
@@ -41,7 +41,7 @@ testGetMLSOne2OneLocalV5 = withVersion5 Version5 $ do
conv %. "cipher_suite" `shouldMatchInt` 1
convId <-
- getMLSOne2OneConversation alice bob `bindResponse` \resp -> do
+ getMLSOne2OneConversationLegacy alice bob `bindResponse` \resp -> do
conv <- getJSON 200 resp
conv %. "type" `shouldMatchInt` 2
shouldBeEmpty (conv %. "members.others")
@@ -53,7 +53,7 @@ testGetMLSOne2OneLocalV5 = withVersion5 Version5 $ do
conv %. "qualified_id"
-- check that the conversation has the same ID on the other side
- conv2 <- bindResponse (getMLSOne2OneConversation bob alice) $ \resp -> do
+ conv2 <- bindResponse (getMLSOne2OneConversationLegacy bob alice) $ \resp -> do
resp.status `shouldMatchInt` 200
resp.json
@@ -64,11 +64,11 @@ testGetMLSOne2OneLocalV5 = withVersion5 Version5 $ do
testGetMLSOne2OneRemoteV5 :: (HasCallStack) => App ()
testGetMLSOne2OneRemoteV5 = withVersion5 Version5 $ do
[alice, bob] <- createAndConnectUsers [OwnDomain, OtherDomain]
- getMLSOne2OneConversation alice bob `bindResponse` \resp -> do
+ getMLSOne2OneConversationLegacy alice bob `bindResponse` \resp -> do
resp.status `shouldMatchInt` 400
resp.jsonBody %. "label" `shouldMatch` "mls-federated-one2one-not-supported"
- getMLSOne2OneConversation bob alice `bindResponse` \resp -> do
+ getMLSOne2OneConversationLegacy bob alice `bindResponse` \resp -> do
resp.status `shouldMatchInt` 400
resp.jsonBody %. "label" `shouldMatch` "mls-federated-one2one-not-supported"
@@ -149,7 +149,7 @@ testMLSOne2OneOtherMember scenario = do
testMLSOne2OneRemoveClientLocalV5 :: App ()
testMLSOne2OneRemoveClientLocalV5 = withVersion5 Version5 $ do
[alice, bob] <- createAndConnectUsers [OwnDomain, OwnDomain]
- conv <- getMLSOne2OneConversation alice bob >>= getJSON 200
+ conv <- getMLSOne2OneConversationLegacy alice bob >>= getJSON 200
[alice1, bob1] <- traverse (createMLSClient def) [alice, bob]
traverse_ uploadNewKeyPackage [bob1]
@@ -416,7 +416,7 @@ testMLSFederationV1ConvOnOldBackend = do
fedError <- getJSON 533 resp
fedError %. "label" `shouldMatch` "federation-version-error"
- conv <- getMLSOne2OneConversation bob alice >>= getJSON 200
+ conv <- getMLSOne2OneConversationLegacy bob alice >>= getJSON 200
keys <- getMLSPublicKeys bob >>= getJSON 200
resetOne2OneGroupGeneric bob1 conv keys
@@ -464,7 +464,7 @@ testMLSFederationV1ConvOnNewBackend = do
-- Bob cannot start this conversation because it would exist on Alice's
-- backend and Bob cannot get the MLS public keys of that backend.
- getMLSOne2OneConversation bob alice `bindResponse` \resp -> do
+ getMLSOne2OneConversationLegacy bob alice `bindResponse` \resp -> do
fedError <- getJSON 533 resp
fedError %. "label" `shouldMatch` "federation-remote-error"
diff --git a/integration/test/Test/Swagger.hs b/integration/test/Test/Swagger.hs
index b7f7618092c..514bf532299 100644
--- a/integration/test/Test/Swagger.hs
+++ b/integration/test/Test/Swagger.hs
@@ -1,11 +1,16 @@
module Test.Swagger where
import qualified API.Brig as BrigP
+import qualified Data.ByteString as B
import qualified Data.Set as Set
import Data.String.Conversions
import GHC.Stack
+import System.Exit
+import System.FilePath
+import System.Process
import Testlib.Assertions
import Testlib.Prelude
+import UnliftIO.Temporary
existingVersions :: Set Int
existingVersions = Set.fromList [0, 1, 2, 3, 4, 5, 6, 7]
@@ -80,3 +85,25 @@ testSwaggerToc = do
html :: String
html = "
please pick an api version
/v0/api/swagger-ui/
/v1/api/swagger-ui/
/v2/api/swagger-ui/
/v3/api/swagger-ui/
/v4/api/swagger-ui/
/v5/api/swagger-ui/
/v6/api/swagger-ui/
/v7/api/swagger-ui/
"
+
+-- | This runs the swagger linter [vacuum](https://quobix.com/vacuum/).
+--
+-- The reason for adding the linter in the integration tests, and not in the lint job, is that
+-- it calls brig for the swagger docs it validates, but no running brig during linting.
+--
+-- There is also a make rule that does this, for convenience in your develop
+-- flow. Make sure that brig is running before using the make rule.
+testSwaggerLint :: (HasCallStack) => App ()
+testSwaggerLint = do
+ withSystemTempDirectory "swagger" $ \tmp -> do
+ req <- baseRequest OwnDomain Brig Versioned $ joinHttpPath ["api", "swagger.json"]
+ swagger <- submit "GET" req >>= getBody 200
+ liftIO $ B.writeFile (tmp > "swagger.json") swagger
+ let cmd = shell $ "vacuum lint -a -d -e " <> (tmp > "swagger.json")
+ (exitCode, out, err) <- liftIO $ readCreateProcessWithExitCode cmd ""
+ case exitCode of
+ ExitSuccess -> pure ()
+ _ -> do
+ liftIO $ putStrLn out
+ liftIO $ putStrLn err
+ assertFailure "swagger validation errors"
diff --git a/libs/wire-api/src/Wire/API/Routes/Internal/Brig.hs b/libs/wire-api/src/Wire/API/Routes/Internal/Brig.hs
index 144b8db270f..0c294f7a00d 100644
--- a/libs/wire-api/src/Wire/API/Routes/Internal/Brig.hs
+++ b/libs/wire-api/src/Wire/API/Routes/Internal/Brig.hs
@@ -34,13 +34,14 @@ module Wire.API.Routes.Internal.Brig
GetAccountConferenceCallingConfig,
PutAccountConferenceCallingConfig,
DeleteAccountConferenceCallingConfig,
+ GetRichInfoMultiResponse (..),
swaggerDoc,
module Wire.API.Routes.Internal.Brig.EJPD,
FoundInvitationCode (..),
)
where
-import Control.Lens ((.~))
+import Control.Lens ((.~), (?~))
import Data.Aeson (FromJSON, ToJSON)
import Data.Code qualified as Code
import Data.CommaSeparatedList
@@ -71,7 +72,6 @@ import Wire.API.Routes.Internal.Brig.EJPD
import Wire.API.Routes.Internal.Brig.OAuth (OAuthAPI)
import Wire.API.Routes.Internal.Brig.SearchIndex (ISearchIndexAPI)
import Wire.API.Routes.Internal.Galley.TeamFeatureNoConfigMulti qualified as Multi
-import Wire.API.Routes.Internal.LegalHold qualified as LegalHoldInternalAPI
import Wire.API.Routes.MultiVerb
import Wire.API.Routes.Named
import Wire.API.Routes.Public (ZUser)
@@ -90,22 +90,25 @@ import Wire.API.User.Client
import Wire.API.User.RichInfo
type EJPDRequest =
- Summary
- "Identify users for law enforcement. Wire has legal requirements to cooperate \
- \with the authorities. The wire backend operations team uses this to answer \
- \identification requests manually. It is our best-effort representation of the \
- \minimum required information we need to hand over about targets and (in some \
- \cases) their communication peers. For more information, consult ejpd.admin.ch."
- :> "ejpd-request"
- :> QueryParam'
- [ Optional,
- Strict,
- Description "Also provide information about all contacts of the identified users"
- ]
- "include_contacts"
- Bool
- :> Servant.ReqBody '[Servant.JSON] EJPDRequestBody
- :> Post '[Servant.JSON] EJPDResponseBody
+ Named
+ "ejpd-request"
+ ( Summary
+ "Identify users for law enforcement. Wire has legal requirements to cooperate \
+ \with the authorities. The wire backend operations team uses this to answer \
+ \identification requests manually. It is our best-effort representation of the \
+ \minimum required information we need to hand over about targets and (in some \
+ \cases) their communication peers. For more information, consult ejpd.admin.ch."
+ :> "ejpd-request"
+ :> QueryParam'
+ [ Optional,
+ Strict,
+ Description "Also provide information about all contacts of the identified users"
+ ]
+ "include_contacts"
+ Bool
+ :> Servant.ReqBody '[Servant.JSON] EJPDRequestBody
+ :> Post '[Servant.JSON] EJPDResponseBody
+ )
type GetAccountConferenceCallingConfig =
Summary
@@ -159,10 +162,10 @@ type GetAllConnections =
type AccountAPI =
Named "get-account-conference-calling-config" GetAccountConferenceCallingConfig
- :<|> PutAccountConferenceCallingConfig
- :<|> DeleteAccountConferenceCallingConfig
- :<|> GetAllConnectionsUnqualified
- :<|> GetAllConnections
+ :<|> Named "i-put-account-conference-calling-config" PutAccountConferenceCallingConfig
+ :<|> Named "i-delete-account-conference-calling-config" DeleteAccountConferenceCallingConfig
+ :<|> Named "i-get-all-connections-unqualified" GetAllConnectionsUnqualified
+ :<|> Named "i-get-all-connections" GetAllConnections
:<|> Named
"createUserNoVerify"
-- This endpoint can lead to the following events being sent:
@@ -373,12 +376,11 @@ type AccountAPI =
( "users"
:> "rich-info"
:> QueryParam' '[Optional, Strict] "ids" (CommaSeparatedList UserId)
- :> Get '[Servant.JSON] [(UserId, RichInfo)]
+ :> Get '[Servant.JSON] GetRichInfoMultiResponse
)
:<|> Named
"iHeadHandle"
( CanThrow 'InvalidHandle
- :> "users"
:> "handles"
:> Capture "handle" Handle
:> MultiVerb
@@ -466,23 +468,29 @@ instance ToSchema NewKeyPackageRef where
type MLSAPI = "mls" :> GetMLSClients
type GetMLSClients =
- Summary "Return all clients and all MLS-capable clients of a user"
- :> "clients"
- :> CanThrow 'UserNotFound
- :> Capture "user" UserId
- :> QueryParam' '[Required, Strict] "ciphersuite" CipherSuite
- :> MultiVerb1
- 'GET
- '[Servant.JSON]
- (Respond 200 "MLS clients" (Set ClientInfo))
+ Named
+ "get-mls-clients"
+ ( Summary "Return all clients and all MLS-capable clients of a user"
+ :> "clients"
+ :> CanThrow 'UserNotFound
+ :> Capture "user" UserId
+ :> QueryParam' '[Required, Strict] "ciphersuite" CipherSuite
+ :> MultiVerb1
+ 'GET
+ '[Servant.JSON]
+ (Respond 200 "MLS clients" (Set ClientInfo))
+ )
type GetVerificationCode =
- Summary "Get verification code for a given email and action"
- :> "users"
- :> Capture "uid" UserId
- :> "verification-code"
- :> Capture "action" VerificationAction
- :> Get '[Servant.JSON] (Maybe Code.Value)
+ Named
+ "get-verification-code"
+ ( Summary "Get verification code for a given email and action"
+ :> "users"
+ :> Capture "uid" UserId
+ :> "verification-code"
+ :> Capture "action" VerificationAction
+ :> Get '[Servant.JSON] (Maybe Code.Value)
+ )
type API =
"i"
@@ -594,9 +602,9 @@ type TeamInvitations =
)
type UserAPI =
- UpdateUserLocale
- :<|> DeleteUserLocale
- :<|> GetDefaultLocale
+ Named "i-update-user-locale" UpdateUserLocale
+ :<|> Named "i-delete-user-locale" DeleteUserLocale
+ :<|> Named "i-get-default-locale" GetDefaultLocale
:<|> Named
"get-user-export-data"
( Summary "Get user export data"
@@ -745,10 +753,19 @@ type ProviderAPI =
type FederationRemotesAPIDescription =
"See https://docs.wire.com/understand/federation/backend-communication.html#configuring-remote-connections for background. "
+newtype GetRichInfoMultiResponse
+ = GetRichInfoMultiResponse
+ [(UserId, RichInfo)]
+ deriving newtype (FromJSON, ToJSON)
+
+instance S.ToSchema GetRichInfoMultiResponse where
+ declareNamedSchema _ =
+ pure $
+ S.NamedSchema (Just $ "GetRichInfoMultiResponse") $
+ mempty & S.description ?~ "List of pairs of UserId and RichInfo"
+
swaggerDoc :: OpenApi
-swaggerDoc =
- brigSwaggerDoc
- <> LegalHoldInternalAPI.swaggerDoc
+swaggerDoc = brigSwaggerDoc
brigSwaggerDoc :: OpenApi
brigSwaggerDoc =
diff --git a/libs/wire-api/src/Wire/API/Routes/Internal/Cargohold.hs b/libs/wire-api/src/Wire/API/Routes/Internal/Cargohold.hs
index 592e72dc61a..75cc7caa714 100644
--- a/libs/wire-api/src/Wire/API/Routes/Internal/Cargohold.hs
+++ b/libs/wire-api/src/Wire/API/Routes/Internal/Cargohold.hs
@@ -28,8 +28,8 @@ import Wire.API.Routes.Named
type InternalAPI =
"i"
- :> ( "status" :> MultiVerb 'GET '() '[RespondEmpty 200 "OK"] ()
- :<|> Named "iGetAsset" ("assets" :> Capture "key" AssetKey :> Get '[Servant.JSON] Text)
+ :> ( Named "i_status" ("status" :> MultiVerb 'GET '() '[RespondEmpty 200 "OK"] ())
+ :<|> Named "i_get_asset" ("assets" :> Capture "key" AssetKey :> Get '[Servant.JSON] Text)
)
swaggerDoc :: OpenApi
diff --git a/libs/wire-api/src/Wire/API/Routes/Internal/Gundeck.hs b/libs/wire-api/src/Wire/API/Routes/Internal/Gundeck.hs
index 9287611a5e9..c786d1c3020 100644
--- a/libs/wire-api/src/Wire/API/Routes/Internal/Gundeck.hs
+++ b/libs/wire-api/src/Wire/API/Routes/Internal/Gundeck.hs
@@ -22,6 +22,7 @@ import Servant.Server.Internal.ErrorFormatter
import Wire.API.CannonId
import Wire.API.Presence
import Wire.API.Push.V2
+import Wire.API.Routes.Named
import Wire.API.Routes.Public
-- | this can be replaced by `ReqBody '[JSON] Presence` once the fix in cannon from
@@ -82,18 +83,18 @@ instance (HasOpenApi sub) => HasOpenApi (ReqBodyHack :> sub) where
type InternalAPI =
"i"
- :> ( ("status" :> Get '[JSON] NoContent)
- :<|> ("push" :> "v2" :> ReqBody '[JSON] [Push] :> Post '[JSON] NoContent)
+ :> ( Named "i-status" ("status" :> Get '[JSON] NoContent)
+ :<|> Named "i-push" ("push" :> "v2" :> ReqBody '[JSON] [Push] :> Post '[JSON] NoContent)
:<|> ( "presences"
- :> ( (QueryParam' [Required, Strict] "ids" (CommaSeparatedList UserId) :> Get '[JSON] [Presence])
- :<|> (Capture "uid" UserId :> Get '[JSON] [Presence])
- :<|> (ReqBodyHack :> Verb 'POST 201 '[JSON] (Headers '[Header "Location" URI] NoContent))
- :<|> (Capture "uid" UserId :> "devices" :> Capture "did" ConnId :> "cannons" :> Capture "cannon" CannonId :> Delete '[JSON] NoContent)
+ :> ( Named "i-presences-get-for-users" (QueryParam' [Required, Strict] "ids" (CommaSeparatedList UserId) :> Get '[JSON] [Presence])
+ :<|> Named "i-presences-get-for-user" (Capture "uid" UserId :> Get '[JSON] [Presence])
+ :<|> Named "i-presences-post" (ReqBodyHack :> Verb 'POST 201 '[JSON] (Headers '[Header "Location" URI] NoContent))
+ :<|> Named "i-presences-delete" (Capture "uid" UserId :> "devices" :> Capture "did" ConnId :> "cannons" :> Capture "cannon" CannonId :> Delete '[JSON] NoContent)
)
)
- :<|> (ZUser :> "clients" :> Capture "cid" ClientId :> Delete '[JSON] NoContent)
- :<|> (ZUser :> "user" :> Delete '[JSON] NoContent)
- :<|> ("push-tokens" :> Capture "uid" UserId :> Get '[JSON] PushTokenList)
+ :<|> Named "i-clients-delete" (ZUser :> "clients" :> Capture "cid" ClientId :> Delete '[JSON] NoContent)
+ :<|> Named "i-user-delete" (ZUser :> "user" :> Delete '[JSON] NoContent)
+ :<|> Named "i-push-tokens-get" ("push-tokens" :> Capture "uid" UserId :> Get '[JSON] PushTokenList)
)
swaggerDoc :: S.OpenApi
diff --git a/libs/wire-api/src/Wire/API/Routes/Internal/LegalHold.hs b/libs/wire-api/src/Wire/API/Routes/Internal/LegalHold.hs
deleted file mode 100644
index 73087b78ea3..00000000000
--- a/libs/wire-api/src/Wire/API/Routes/Internal/LegalHold.hs
+++ /dev/null
@@ -1,45 +0,0 @@
--- This file is part of the Wire Server implementation.
---
--- Copyright (C) 2022 Wire Swiss GmbH
---
--- 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 .
-
-module Wire.API.Routes.Internal.LegalHold where
-
-import Control.Lens
-import Data.Id
-import Data.OpenApi (OpenApi)
-import Data.OpenApi.Lens
-import Data.Proxy
-import Imports
-import Servant.API
-import Servant.OpenApi
-import Wire.API.Team.Feature
-
-type InternalLegalHoldAPI =
- "i"
- :> "teams"
- :> ( Capture "tid" TeamId
- :> "legalhold"
- :> Get '[JSON] (LockableFeature LegalholdConfig)
- :<|> Capture "tid" TeamId
- :> "legalhold"
- :> ReqBody '[JSON] (Feature LegalholdConfig)
- :> Put '[] NoContent
- )
-
-swaggerDoc :: OpenApi
-swaggerDoc =
- toOpenApi (Proxy @InternalLegalHoldAPI)
- & info . title .~ "Wire-Server internal legalhold API"
diff --git a/libs/wire-api/src/Wire/API/Routes/Internal/Spar.hs b/libs/wire-api/src/Wire/API/Routes/Internal/Spar.hs
index b5bc7b34380..0cd59f6d22b 100644
--- a/libs/wire-api/src/Wire/API/Routes/Internal/Spar.hs
+++ b/libs/wire-api/src/Wire/API/Routes/Internal/Spar.hs
@@ -23,15 +23,16 @@ import Data.OpenApi
import Imports
import Servant
import Servant.OpenApi
+import Wire.API.Routes.Named
import Wire.API.User
import Wire.API.User.Saml
type InternalAPI =
"i"
- :> ( "status" :> Get '[JSON] NoContent
- :<|> "teams" :> Capture "team" TeamId :> DeleteNoContent
- :<|> "sso" :> "settings" :> ReqBody '[JSON] SsoSettings :> Put '[JSON] NoContent
- :<|> "scim" :> "userinfo" :> Capture "user" UserId :> Post '[JSON] ScimUserInfo
+ :> ( Named "i_status" ("status" :> Get '[JSON] NoContent)
+ :<|> Named "i_delete_team" ("teams" :> Capture "team" TeamId :> DeleteNoContent)
+ :<|> Named "i_put_sso_settings" ("sso" :> "settings" :> ReqBody '[JSON] SsoSettings :> Put '[JSON] NoContent)
+ :<|> Named "i_post_scim_user_info" ("scim" :> "userinfo" :> Capture "user" UserId :> Post '[JSON] ScimUserInfo)
)
swaggerDoc :: OpenApi
diff --git a/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs b/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs
index 424ac403d81..d377fc79835 100644
--- a/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs
+++ b/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs
@@ -425,8 +425,9 @@ type SelfAPI =
type UserHandleAPI =
Named
- "check-user-handles"
+ "check-user-handles@v6"
( Summary "Check availability of user handles"
+ :> Until V7
:> ZUser
:> "users"
:> "handles"
@@ -438,8 +439,22 @@ type UserHandleAPI =
[Handle]
)
:<|> Named
- "check-user-handle"
+ "check-user-handles"
+ ( Summary "Check availability of user handles"
+ :> From V7
+ :> ZUser
+ :> "handles"
+ :> ReqBody '[JSON] CheckHandles
+ :> MultiVerb
+ 'POST
+ '[JSON]
+ '[Respond 200 "List of free handles" [Handle]]
+ [Handle]
+ )
+ :<|> Named
+ "check-user-handle@v6"
( Summary "Check whether a user handle can be taken"
+ :> Until V7
:> CanThrow 'InvalidHandle
:> CanThrow 'HandleNotFound
:> ZUser
@@ -452,6 +467,21 @@ type UserHandleAPI =
'[Respond 200 "Handle is taken" ()]
()
)
+ :<|> Named
+ "check-user-handle"
+ ( Summary "Check whether a user handle can be taken"
+ :> From V7
+ :> CanThrow 'InvalidHandle
+ :> CanThrow 'HandleNotFound
+ :> ZUser
+ :> "handles"
+ :> Capture "handle" Text
+ :> MultiVerb
+ 'HEAD
+ '[JSON]
+ '[Respond 200 "Handle is taken" ()]
+ ()
+ )
type AccountAPI =
Named
diff --git a/libs/wire-api/src/Wire/API/Routes/Public/Brig/Bot.hs b/libs/wire-api/src/Wire/API/Routes/Public/Brig/Bot.hs
index 782e29fbb59..4c072cf0210 100644
--- a/libs/wire-api/src/Wire/API/Routes/Public/Brig/Bot.hs
+++ b/libs/wire-api/src/Wire/API/Routes/Public/Brig/Bot.hs
@@ -43,8 +43,9 @@ type DeleteResponses =
type BotAPI =
Named
- "add-bot"
+ "add-bot@v6"
( Summary "Add bot"
+ :> Until V7
:> CanThrow 'AccessDenied
:> CanThrow 'InvalidConversation
:> CanThrow 'TooManyConversationMembers
@@ -58,8 +59,25 @@ type BotAPI =
:> MultiVerb1 'POST '[JSON] (Respond 201 "" AddBotResponse)
)
:<|> Named
- "remove-bot"
+ "add-bot"
+ ( Summary "Add bot"
+ :> From V7
+ :> CanThrow 'AccessDenied
+ :> CanThrow 'InvalidConversation
+ :> CanThrow 'TooManyConversationMembers
+ :> CanThrow 'ServiceDisabled
+ :> ZAccess
+ :> ZConn
+ :> "bot"
+ :> "conversations"
+ :> Capture "conv" ConvId
+ :> ReqBody '[JSON] AddBot
+ :> MultiVerb1 'POST '[JSON] (Respond 201 "" AddBotResponse)
+ )
+ :<|> Named
+ "remove-bot@v6"
( Summary "Remove bot"
+ :> Until V7
:> CanThrow 'AccessDenied
:> CanThrow 'InvalidConversation
:> ZAccess
@@ -70,6 +88,20 @@ type BotAPI =
:> Capture "bot" BotId
:> MultiVerb 'DELETE '[JSON] DeleteResponses (Maybe RemoveBotResponse)
)
+ :<|> Named
+ "remove-bot"
+ ( Summary "Remove bot"
+ :> From V7
+ :> CanThrow 'AccessDenied
+ :> CanThrow 'InvalidConversation
+ :> ZAccess
+ :> ZConn
+ :> "bot"
+ :> "conversations"
+ :> Capture "conv" ConvId
+ :> Capture "bot" BotId
+ :> MultiVerb 'DELETE '[JSON] DeleteResponses (Maybe RemoveBotResponse)
+ )
:<|> Named
"bot-get-self"
( Summary "Get self"
diff --git a/libs/wire-api/src/Wire/API/Routes/Public/Galley/Conversation.hs b/libs/wire-api/src/Wire/API/Routes/Public/Galley/Conversation.hs
index 7cbc9adeb16..60802b1c5bc 100644
--- a/libs/wire-api/src/Wire/API/Routes/Public/Galley/Conversation.hs
+++ b/libs/wire-api/src/Wire/API/Routes/Public/Galley/Conversation.hs
@@ -621,9 +621,10 @@ type ConversationAPI =
:> ConversationVerb 'V2 Conversation
)
:<|> Named
- "create-one-to-one-conversation"
+ "create-one-to-one-conversation@v6"
( Summary "Create a 1:1 conversation"
:> From 'V3
+ :> Until 'V7
:> CanThrow 'ConvAccessDenied
:> CanThrow 'InvalidOperation
:> CanThrow 'NoBindingTeamMembers
@@ -641,6 +642,26 @@ type ConversationAPI =
:> ReqBody '[JSON] NewConv
:> ConversationVerb 'V3 Conversation
)
+ :<|> Named
+ "create-one-to-one-conversation"
+ ( Summary "Create a 1:1 conversation"
+ :> From 'V7
+ :> CanThrow 'ConvAccessDenied
+ :> CanThrow 'InvalidOperation
+ :> CanThrow 'NoBindingTeamMembers
+ :> CanThrow 'NonBindingTeam
+ :> CanThrow 'NotATeamMember
+ :> CanThrow 'NotConnected
+ :> CanThrow OperationDenied
+ :> CanThrow 'TeamNotFound
+ :> CanThrow 'MissingLegalholdConsent
+ :> CanThrow UnreachableBackendsLegacy
+ :> ZLocalUser
+ :> ZConn
+ :> "one2one-conversations"
+ :> ReqBody '[JSON] NewConv
+ :> ConversationVerb 'V3 Conversation
+ )
:<|> Named
"get-one-to-one-mls-conversation@v5"
( Summary "Get an MLS 1:1 conversation"
@@ -675,8 +696,7 @@ type ConversationAPI =
:> ZLocalUser
:> CanThrow 'MLSNotEnabled
:> CanThrow 'NotConnected
- :> "conversations"
- :> "one2one"
+ :> "one2one-conversations"
:> QualifiedCapture "usr" UserId
:> QueryParam "format" MLSPublicKeyFormat
:> MultiVerb1 'GET '[JSON] (Respond 200 "MLS 1-1 conversation" (MLSOne2OneConversation SomeKey))
@@ -964,6 +984,7 @@ type ConversationAPI =
:<|> Named
"update-other-member-unqualified"
( Summary "Update membership of the specified user (deprecated)"
+ :> Until V7
:> Deprecated
:> Description "Use `PUT /conversations/:cnv_domain/:cnv/members/:usr_domain/:usr` instead"
:> ZLocalUser
diff --git a/libs/wire-api/wire-api.cabal b/libs/wire-api/wire-api.cabal
index f5eac2bf6d2..fb0f3f2bb2d 100644
--- a/libs/wire-api/wire-api.cabal
+++ b/libs/wire-api/wire-api.cabal
@@ -169,7 +169,6 @@ library
Wire.API.Routes.Internal.Galley.TeamFeatureNoConfigMulti
Wire.API.Routes.Internal.Galley.TeamsIntra
Wire.API.Routes.Internal.Gundeck
- Wire.API.Routes.Internal.LegalHold
Wire.API.Routes.Internal.Spar
Wire.API.Routes.LowLevelStream
Wire.API.Routes.MultiTablePaging
diff --git a/nix/wire-server.nix b/nix/wire-server.nix
index e3ee19364cc..370397a809f 100644
--- a/nix/wire-server.nix
+++ b/nix/wire-server.nix
@@ -293,6 +293,7 @@ let
pkgs.nginz
pkgs.mls-test-cli
pkgs.awscli2
+ pkgs.vacuum-go
integration-dynamic-backends-db-schemas
integration-dynamic-backends-brig-index
integration-dynamic-backends-ses
diff --git a/services/brig/src/Brig/API/Internal.hs b/services/brig/src/Brig/API/Internal.hs
index 21d73c16e99..ea9c2f26f20 100644
--- a/services/brig/src/Brig/API/Internal.hs
+++ b/services/brig/src/Brig/API/Internal.hs
@@ -157,7 +157,7 @@ servantSitemap =
:<|> ejpdAPI
:<|> accountAPI
:<|> mlsAPI
- :<|> getVerificationCode
+ :<|> Named @"get-verification-code" getVerificationCode
:<|> teamsAPI
:<|> userAPI
:<|> clientAPI
@@ -177,11 +177,10 @@ ejpdAPI ::
Member Rpc r
) =>
ServerT BrigIRoutes.EJPDRequest (Handler r)
-ejpdAPI =
- Brig.User.EJPD.ejpdRequest
+ejpdAPI = Named @"ejpd-request" Brig.User.EJPD.ejpdRequest
mlsAPI :: ServerT BrigIRoutes.MLSAPI (Handler r)
-mlsAPI = getMLSClients
+mlsAPI = Named @"get-mls-clients" getMLSClients
accountAPI ::
( Member BlockListStore r,
@@ -209,10 +208,10 @@ accountAPI ::
ServerT BrigIRoutes.AccountAPI (Handler r)
accountAPI =
Named @"get-account-conference-calling-config" getAccountConferenceCallingConfig
- :<|> putAccountConferenceCallingConfig
- :<|> deleteAccountConferenceCallingConfig
- :<|> getConnectionsStatusUnqualified
- :<|> getConnectionsStatus
+ :<|> Named @"i-put-account-conference-calling-config" putAccountConferenceCallingConfig
+ :<|> Named @"i-delete-account-conference-calling-config" deleteAccountConferenceCallingConfig
+ :<|> Named @"i-get-all-connections-unqualified" getConnectionsStatusUnqualified
+ :<|> Named @"i-get-all-connections" getConnectionsStatus
:<|> Named @"createUserNoVerify" createUserNoVerify
:<|> Named @"createUserNoVerifySpar" createUserNoVerifySpar
:<|> Named @"putSelfEmail" changeSelfEmailMaybeSendH
@@ -271,9 +270,9 @@ teamsAPI =
userAPI :: (Member UserSubsystem r) => ServerT BrigIRoutes.UserAPI (Handler r)
userAPI =
- updateLocale
- :<|> deleteLocale
- :<|> getDefaultUserLocale
+ Named @"i-update-user-locale" updateLocale
+ :<|> Named @"i-delete-user-locale" deleteLocale
+ :<|> Named @"i-get-default-locale" getDefaultUserLocale
:<|> Named @"get-user-export-data" getUserExportDataH
clientAPI :: ServerT BrigIRoutes.ClientAPI (Handler r)
@@ -783,9 +782,9 @@ getRichInfoH uid =
RichInfo . fromMaybe mempty
<$> lift (liftSem $ UserStore.getRichInfo uid)
-getRichInfoMultiH :: Maybe (CommaSeparatedList UserId) -> (Handler r) [(UserId, RichInfo)]
+getRichInfoMultiH :: Maybe (CommaSeparatedList UserId) -> Handler r BrigIRoutes.GetRichInfoMultiResponse
getRichInfoMultiH (maybe [] fromCommaSeparatedList -> uids) =
- lift $ wrapClient $ API.lookupRichInfoMultiUsers uids
+ lift $ wrapClient $ BrigIRoutes.GetRichInfoMultiResponse <$> API.lookupRichInfoMultiUsers uids
updateHandleH ::
(Member UserSubsystem r) =>
diff --git a/services/brig/src/Brig/API/Public.hs b/services/brig/src/Brig/API/Public.hs
index a576af85158..6807940ff9d 100644
--- a/services/brig/src/Brig/API/Public.hs
+++ b/services/brig/src/Brig/API/Public.hs
@@ -440,7 +440,9 @@ servantSitemap =
userHandleAPI :: ServerT UserHandleAPI (Handler r)
userHandleAPI =
- Named @"check-user-handles" checkHandles
+ Named @"check-user-handles@v6" checkHandles
+ :<|> Named @"check-user-handles" checkHandles
+ :<|> Named @"check-user-handle@v6" checkHandle
:<|> Named @"check-user-handle" checkHandle
searchAPI :: ServerT SearchAPI (Handler r)
diff --git a/services/brig/src/Brig/Provider/API.hs b/services/brig/src/Brig/Provider/API.hs
index 5d2f9c8e313..162a1109060 100644
--- a/services/brig/src/Brig/Provider/API.hs
+++ b/services/brig/src/Brig/Provider/API.hs
@@ -145,7 +145,9 @@ botAPI ::
) =>
ServerT BotAPI (Handler r)
botAPI =
- Named @"add-bot" addBot
+ Named @"add-bot@v6" addBot
+ :<|> Named @"add-bot" addBot
+ :<|> Named @"remove-bot@v6" removeBot
:<|> Named @"remove-bot" removeBot
:<|> Named @"bot-get-self" botGetSelf
:<|> Named @"bot-delete-self" botDeleteSelf
diff --git a/services/brig/src/Brig/Run.hs b/services/brig/src/Brig/Run.hs
index 7f299c65195..2bd43d585e1 100644
--- a/services/brig/src/Brig/Run.hs
+++ b/services/brig/src/Brig/Run.hs
@@ -116,8 +116,9 @@ mkApp opts = do
where
middleware :: Env -> Wai.Middleware
middleware e =
- -- this rewrites the request, so it must be at the top (i.e. applied last)
+ -- these rewrite the request, so they must be at the top (i.e. applied last)
versionMiddleware e.disabledVersions
+ . internalHandleCompatibilityMiddleware
-- this also rewrites the request
. requestIdMiddleware e.appLogger defaultRequestIdHeaderName
. Metrics.servantPrometheusMiddleware (Proxy @ServantCombinedAPI)
@@ -142,6 +143,21 @@ mkApp opts = do
req
cont
+-- FUTUREWORK: this rewrites /i/users/handles to /i/handles, for backward
+-- compatibility with the old endpoint path during deployment. Once the new
+-- endpoint has been deployed, this middleware can be removed.
+internalHandleCompatibilityMiddleware :: Wai.Middleware
+internalHandleCompatibilityMiddleware app req k =
+ app
+ ( case Wai.pathInfo req of
+ ("i" : "users" : "handles" : rest) ->
+ req
+ { Wai.pathInfo = ("i" : "handles" : rest)
+ }
+ _ -> req
+ )
+ k
+
type ServantCombinedAPI =
( DocsAPI
:<|> BrigAPI
diff --git a/services/brig/test/integration/API/Provider.hs b/services/brig/test/integration/API/Provider.hs
index fc4c6a7bda7..67ab4913344 100644
--- a/services/brig/test/integration/API/Provider.hs
+++ b/services/brig/test/integration/API/Provider.hs
@@ -1397,7 +1397,7 @@ addBot ::
addBot brig uid pid sid cid =
post $
brig
- . paths ["conversations", toByteString' cid, "bots"]
+ . paths ["bot", "conversations", toByteString' cid]
. header "Z-Type" "access"
. header "Z-User" (toByteString' uid)
. header "Z-Connection" "conn"
@@ -1413,7 +1413,7 @@ removeBot ::
removeBot brig uid cid bid =
delete $
brig
- . paths ["conversations", toByteString' cid, "bots", toByteString' bid]
+ . paths ["bot", "conversations", toByteString' cid, toByteString' bid]
. header "Z-Type" "access"
. header "Z-User" (toByteString' uid)
. header "Z-Connection" "conn"
diff --git a/services/brig/test/integration/API/User/Account.hs b/services/brig/test/integration/API/User/Account.hs
index b0ba8de47d4..e1757ba6a69 100644
--- a/services/brig/test/integration/API/User/Account.hs
+++ b/services/brig/test/integration/API/User/Account.hs
@@ -1530,7 +1530,7 @@ execAndAssertUserDeletion brig cannon u hdl others userJournalWatcher execDelete
usr <- postUserInternal o brig
Util.assertUserActivateJournaled userJournalWatcher usr "user activate execAndAssertUserDeletion"
-- Handle is available again
- Bilge.head (brig . paths ["users", "handles", toByteString' hdl] . zUser uid)
+ Bilge.head (brig . paths ["handles", toByteString' hdl] . zUser uid)
!!! const 404 === statusCode
where
assertDeletedProfileSelf = do
diff --git a/services/brig/test/integration/API/User/Handles.hs b/services/brig/test/integration/API/User/Handles.hs
index 5776fc082b9..c505e9b824a 100644
--- a/services/brig/test/integration/API/User/Handles.hs
+++ b/services/brig/test/integration/API/User/Handles.hs
@@ -62,8 +62,8 @@ tests _cl _at conf p b c g =
test p "handles/query" $ testHandleQuery conf b,
test p "handles/query - team-search-visibility SearchVisibilityStandard" $ testHandleQuerySearchVisibilityStandard conf b,
test p "handles/query - team-search-visibility SearchVisibilityNoNameOutsideTeam" $ testHandleQuerySearchVisibilityNoNameOutsideTeam conf b g,
- test p "GET /users/handles/ 200" $ testGetUserByUnqualifiedHandle b,
- test p "GET /users/handles/ 404" $ testGetUserByUnqualifiedHandleFailure b,
+ test p "GET /handles/ 200" $ testGetUserByUnqualifiedHandle b,
+ test p "GET /handles/ 404" $ testGetUserByUnqualifiedHandleFailure b,
test p "GET /users/by-handle// : 200" $ testGetUserByQualifiedHandle b,
test p "GET /users/by-handle// : 404" $ testGetUserByQualifiedHandleFailure b,
test p "GET /users/by-handle// : no federation" $ testGetUserByQualifiedHandleNoFederation conf b
@@ -105,7 +105,7 @@ testHandleUpdate brig cannon = do
-- The owner of the handle can always retry the update
put (brig . path "/self/handle" . contentJson . zUser uid . zConn "c" . body update)
!!! const 200 === statusCode
- Bilge.head (brig . paths ["users", "handles", toByteString' hdl] . zUser uid)
+ Bilge.head (brig . paths ["handles", toByteString' hdl] . zUser uid)
!!! const 200 === statusCode
-- For other users, the handle is unavailable
uid2 <- userId <$> randomUser brig
@@ -120,7 +120,7 @@ testHandleUpdate brig cannon = do
let update2 = RequestBodyLBS . encode $ HandleUpdate hdl2
put (brig . path "/self/handle" . contentJson . zUser uid . zConn "c" . body update2)
!!! const 200 === statusCode
- Bilge.head (brig . paths ["users", "handles", toByteString' hdl] . zUser uid)
+ Bilge.head (brig . paths ["handles", toByteString' hdl] . zUser uid)
!!! const 404 === statusCode
-- The owner appears by the new handle in search
Search.refreshIndex brig
@@ -163,7 +163,7 @@ testHandleQuery opts brig = do
uid <- userId <$> randomUser brig
hdl <- randomHandle
-- Query for the handle availability (must be free)
- Bilge.head (brig . paths ["users", "handles", toByteString' hdl] . zUser uid)
+ Bilge.head (brig . paths ["handles", toByteString' hdl] . zUser uid)
!!! const 404 === statusCode
-- Set handle
let update = RequestBodyLBS . encode $ HandleUpdate hdl
@@ -174,7 +174,7 @@ testHandleQuery opts brig = do
const 200 === statusCode
const (Just (fromJust $ parseHandle hdl)) === (userHandle <=< responseJsonMaybe)
-- Query for the handle availability (must be taken)
- Bilge.head (brig . paths ["users", "handles", toByteString' hdl] . zUser uid)
+ Bilge.head (brig . paths ["handles", toByteString' hdl] . zUser uid)
!!! const 200 === statusCode
-- Query user profiles by handles
get (apiVersion "v1" . brig . path "/users" . queryItem "handles" (toByteString' hdl) . zUser uid) !!! do
diff --git a/services/brig/test/integration/API/User/Util.hs b/services/brig/test/integration/API/User/Util.hs
index c05174bd505..cb6f1aa1712 100644
--- a/services/brig/test/integration/API/User/Util.hs
+++ b/services/brig/test/integration/API/User/Util.hs
@@ -83,7 +83,7 @@ checkHandles brig uid hs num =
let hs' = unsafeRange hs
num' = unsafeRange num
js = RequestBodyLBS $ encode $ CheckHandles hs' num'
- in post (brig . path "/users/handles" . contentJson . zUser uid . body js)
+ in post (brig . path "/handles" . contentJson . zUser uid . body js)
randomUserWithHandle ::
(MonadCatch m, MonadIO m, MonadHttp m, HasCallStack) =>
diff --git a/services/cargohold/src/CargoHold/API/Public.hs b/services/cargohold/src/CargoHold/API/Public.hs
index 8b9c7cfccfd..e0d63d3167d 100644
--- a/services/cargohold/src/CargoHold/API/Public.hs
+++ b/services/cargohold/src/CargoHold/API/Public.hs
@@ -93,8 +93,8 @@ servantSitemap =
internalSitemap :: ServerT InternalAPI Handler
internalSitemap =
- pure ()
- :<|> Named @"iGetAsset" iDownloadAssetV3
+ Named @"i_status" (pure ())
+ :<|> Named @"i_get_asset" iDownloadAssetV3
-- | Like 'downloadAssetV3' below, but it works without user session token, and has a
-- different route type.
diff --git a/services/galley/src/Galley/API/Public/Conversation.hs b/services/galley/src/Galley/API/Public/Conversation.hs
index a234ec89b92..532d4f4dffa 100644
--- a/services/galley/src/Galley/API/Public/Conversation.hs
+++ b/services/galley/src/Galley/API/Public/Conversation.hs
@@ -60,6 +60,7 @@ conversationAPI =
<@> mkNamedAPI @"delete-subconversation" deleteSubConversation
<@> mkNamedAPI @"get-subconversation-group-info" getSubConversationGroupInfo
<@> mkNamedAPI @"create-one-to-one-conversation@v2" createOne2OneConversation
+ <@> mkNamedAPI @"create-one-to-one-conversation@v6" createOne2OneConversation
<@> mkNamedAPI @"create-one-to-one-conversation" createOne2OneConversation
<@> mkNamedAPI @"get-one-to-one-mls-conversation@v5" getMLSOne2OneConversationV5
<@> mkNamedAPI @"get-one-to-one-mls-conversation@v6" getMLSOne2OneConversationV6
diff --git a/services/galley/test/integration/API.hs b/services/galley/test/integration/API.hs
index 18ce92d9e20..2ddc71bce90 100644
--- a/services/galley/test/integration/API.hs
+++ b/services/galley/test/integration/API.hs
@@ -1947,7 +1947,7 @@ postConvO2OFailWithSelf = do
g <- viewGalley
alice <- randomUser
let inv = NewConv [alice] [] Nothing mempty Nothing Nothing Nothing Nothing roleNameWireAdmin BaseProtocolProteusTag
- post (g . path "/conversations/one2one" . zUser alice . zConn "conn" . zType "access" . json inv) !!! do
+ post (g . path "one2one-conversations" . zUser alice . zConn "conn" . zType "access" . json inv) !!! do
const 403 === statusCode
const (Just "invalid-op") === fmap label . responseJsonUnsafe
diff --git a/services/galley/test/integration/API/Util.hs b/services/galley/test/integration/API/Util.hs
index a12bf6d2e10..07909cbbbcd 100644
--- a/services/galley/test/integration/API/Util.hs
+++ b/services/galley/test/integration/API/Util.hs
@@ -651,7 +651,7 @@ createOne2OneTeamConv u1 u2 n tid = do
g <- viewGalley
let conv =
NewConv [u2] [] (n >>= checked) mempty Nothing (Just $ ConvTeamInfo tid) Nothing Nothing roleNameWireAdmin BaseProtocolProteusTag
- post $ g . path "/conversations/one2one" . zUser u1 . zConn "conn" . zType "access" . json conv
+ post $ g . path "/one2one-conversations" . zUser u1 . zConn "conn" . zType "access" . json conv
postConv ::
UserId ->
@@ -758,7 +758,7 @@ postO2OConv :: UserId -> UserId -> Maybe Text -> TestM ResponseLBS
postO2OConv u1 u2 n = do
g <- viewGalley
let conv = NewConv [u2] [] (n >>= checked) mempty Nothing Nothing Nothing Nothing roleNameWireAdmin BaseProtocolProteusTag
- post $ g . path "/conversations/one2one" . zUser u1 . zConn "conn" . zType "access" . json conv
+ post $ g . path "/one2one-conversations" . zUser u1 . zConn "conn" . zType "access" . json conv
postConnectConv :: UserId -> UserId -> Text -> Text -> Maybe Text -> TestM ResponseLBS
postConnectConv a b name msg email = do
@@ -1225,7 +1225,8 @@ putOtherMemberQualified from to m c = do
putOtherMember :: UserId -> UserId -> OtherMemberUpdate -> ConvId -> TestM ResponseLBS
putOtherMember from to m c = do
- g <- viewGalley
+ -- this endpoint was removed in v7
+ g <- fmap (addPrefixAtVersion V6 .) (view tsUnversionedGalley)
put $
g
. paths ["conversations", toByteString' c, "members", toByteString' to]
diff --git a/services/gundeck/src/Gundeck/API/Internal.hs b/services/gundeck/src/Gundeck/API/Internal.hs
index 58a1043cd4b..f0dfabe1d19 100644
--- a/services/gundeck/src/Gundeck/API/Internal.hs
+++ b/services/gundeck/src/Gundeck/API/Internal.hs
@@ -35,19 +35,20 @@ import Servant
import Wire.API.Push.Token qualified as PushTok
import Wire.API.Push.V2
import Wire.API.Routes.Internal.Gundeck
+import Wire.API.Routes.Named
servantSitemap :: ServerT InternalAPI Gundeck
servantSitemap =
- statusH
- :<|> pushH
- :<|> ( Presence.listAllH
- :<|> Presence.listH
- :<|> Presence.addH
- :<|> Presence.removeH
+ Named @"i-status" statusH
+ :<|> Named @"i-push" pushH
+ :<|> ( Named @"i-presences-get-for-users" Presence.listAllH
+ :<|> Named @"i-presences-get-for-user" Presence.listH
+ :<|> Named @"i-presences-post" Presence.addH
+ :<|> Named @"i-presences-delete" Presence.removeH
)
- :<|> unregisterClientH
- :<|> removeUserH
- :<|> getPushTokensH
+ :<|> Named @"i-clients-delete" unregisterClientH
+ :<|> Named @"i-user-delete" removeUserH
+ :<|> Named @"i-push-tokens-get" getPushTokensH
statusH :: (Applicative m) => m NoContent
statusH = pure NoContent
diff --git a/services/nginz/integration-test/conf/nginz/nginx.conf b/services/nginz/integration-test/conf/nginz/nginx.conf
index c887411e18f..bfbc75ccc7c 100644
--- a/services/nginz/integration-test/conf/nginz/nginx.conf
+++ b/services/nginz/integration-test/conf/nginz/nginx.conf
@@ -244,6 +244,11 @@ http {
proxy_pass http://brig;
}
+ location ~* ^(/v[0-9]+)?/handles {
+ include common_response_with_zauth.conf;
+ proxy_pass http://brig;
+ }
+
location ~* ^(/v[0-9]+)?/list-users {
include common_response_with_zauth.conf;
proxy_pass http://brig;
@@ -358,6 +363,12 @@ http {
proxy_pass http://galley;
}
+ location ~* ^(/v[0-9]+)?/one2one-conversations$ {
+ include common_response_with_zauth.conf;
+ oauth_scope conversations;
+ proxy_pass http://galley;
+ }
+
location ~* ^(/v[0-9]+)?/conversations$ {
include common_response_with_zauth.conf;
oauth_scope conversations;
diff --git a/services/spar/src/Spar/API.hs b/services/spar/src/Spar/API.hs
index 49399d77be3..cbf91970c4e 100644
--- a/services/spar/src/Spar/API.hs
+++ b/services/spar/src/Spar/API.hs
@@ -222,10 +222,10 @@ apiINTERNAL ::
) =>
ServerT InternalAPI (Sem r)
apiINTERNAL =
- internalStatus
- :<|> internalDeleteTeam
- :<|> internalPutSsoSettings
- :<|> internalGetScimUserInfo
+ Named @"i_status" internalStatus
+ :<|> Named @"i_delete_team" internalDeleteTeam
+ :<|> Named @"i_put_sso_settings" internalPutSsoSettings
+ :<|> Named @"i_post_scim_user_info" internalGetScimUserInfo
appName :: Text
appName = "spar"