diff --git a/changelog.d/3-bug-fixes/WPB-11973-bump-api-version b/changelog.d/3-bug-fixes/WPB-11973-bump-api-version index 12a7567a59e..b236b2d1fe2 100644 --- a/changelog.d/3-bug-fixes/WPB-11973-bump-api-version +++ b/changelog.d/3-bug-fixes/WPB-11973-bump-api-version @@ -1 +1 @@ -Freeze API version 7, create new dev version 8. Also update checklist. \ No newline at end of file +Freeze API version 7, create new dev version 8. Also update checklist. (#4356, ##) \ No newline at end of file diff --git a/integration/test/Test/Client.hs b/integration/test/Test/Client.hs index 1b4fb5b6971..029226f3bca 100644 --- a/integration/test/Test/Client.hs +++ b/integration/test/Test/Client.hs @@ -116,8 +116,16 @@ testGetClientCapabilitiesV7 = do resp.status `shouldMatchInt` 200 resp.json %. "0.capabilities" `shouldMatchSet` allCapabilities - -- In API v7 and below, the "capabilities" field is an enum, so having a new - -- value for this enum is a breaking change. + -- The "capabilities" field is an enum, so having a new value for this enum is + -- a breaking change. So in API v7 and below, we should not see the + -- "consumable-notifications" value. withAPIVersion 7 $ getSelfClients alice `bindResponse` \resp -> do + resp.status `shouldMatchInt` 200 + resp.json %. "0.capabilities" `shouldMatchSet` ["legalhold-implicit-consent"] + + -- In API v6 and below, the "capabilities" field is doubly nested. However, + -- the consumable-notifications value should not be considered part of the + -- enum. + withAPIVersion 6 $ getSelfClients alice `bindResponse` \resp -> do resp.status `shouldMatchInt` 200 resp.json %. "0.capabilities.capabilities" `shouldMatchSet` ["legalhold-implicit-consent"] 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 b5d02b298a0..a554f2aeba9 100644 --- a/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs +++ b/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs @@ -750,9 +750,9 @@ type UserClientAPI = -- - ClientAdded event to self -- - ClientRemoved event to self, if removing old clients due to max number Named - "add-client@v7" + "add-client@v6" ( Summary "Register a new client" - :> Until 'V8 + :> Until 'V7 :> CanThrow 'TooManyClients :> CanThrow 'MissingAuth :> CanThrow 'MalformedPrekeys @@ -761,16 +761,39 @@ type UserClientAPI = :> ZLocalUser :> ZConn :> "clients" - :> VersionedReqBody 'V7 '[JSON] NewClient + :> VersionedReqBody 'V6 '[JSON] NewClient :> MultiVerb1 'POST '[JSON] ( WithHeaders ClientHeaders Client - (VersionedRespond 'V7 201 "Client registered" Client) + (VersionedRespond 'V6 201 "Client registered" Client) ) ) + :<|> Named + "add-client@v7" + ( Summary "Register a new client" + :> From 'V7 + :> Until 'V8 + :> CanThrow 'TooManyClients + :> CanThrow 'MissingAuth + :> CanThrow 'MalformedPrekeys + :> CanThrow 'CodeAuthenticationFailed + :> CanThrow 'CodeAuthenticationRequired + :> ZLocalUser + :> ZConn + :> "clients" + :> VersionedReqBody 'V7 '[JSON] NewClient + :> MultiVerb1 + 'POST + '[JSON] + ( WithHeaders + ClientHeaders + Client + (VersionedRespond 'V7 201 "Client registered" Client) + ) + ) :<|> Named "add-client" ( Summary "Register a new client" @@ -793,9 +816,21 @@ type UserClientAPI = (Respond 201 "Client registered" Client) ) ) + :<|> Named + "update-client@v6" + ( Summary "Update a registered client" + :> Until 'V7 + :> CanThrow 'MalformedPrekeys + :> ZUser + :> "clients" + :> CaptureClientId "client" + :> VersionedReqBody 'V6 '[JSON] UpdateClient + :> MultiVerb1 'PUT '[JSON] (RespondEmpty 200 "Client updated") + ) :<|> Named "update-client@v7" ( Summary "Update a registered client" + :> From 'V7 :> Until 'V8 :> CanThrow 'MalformedPrekeys :> ZUser @@ -807,6 +842,7 @@ type UserClientAPI = :<|> Named "update-client" ( Summary "Update a registered client" + :> From 'V8 :> CanThrow 'MalformedPrekeys :> ZUser :> "clients" @@ -827,9 +863,22 @@ type UserClientAPI = :> ReqBody '[JSON] RmClient :> MultiVerb 'DELETE '[JSON] '[RespondEmpty 200 "Client deleted"] () ) + :<|> Named + "list-clients@v6" + ( Summary "List the registered clients" + :> Until 'V7 + :> ZUser + :> "clients" + :> MultiVerb1 + 'GET + '[JSON] + ( VersionedRespond 'V6 200 "List of clients" [Client] + ) + ) :<|> Named "list-clients@v7" ( Summary "List the registered clients" + :> From 'V7 :> Until 'V8 :> ZUser :> "clients" @@ -851,9 +900,25 @@ type UserClientAPI = ( Respond 200 "List of clients" [Client] ) ) + :<|> Named + "get-client@v6" + ( Summary "Get a registered client by ID" + :> Until 'V7 + :> ZUser + :> "clients" + :> CaptureClientId "client" + :> MultiVerb + 'GET + '[JSON] + '[ EmptyErrorForLegacyReasons 404 "Client not found", + VersionedRespond 'V6 200 "Client found" Client + ] + (Maybe Client) + ) :<|> Named "get-client@v7" ( Summary "Get a registered client by ID" + :> From 'V7 :> Until 'V8 :> ZUser :> "clients" @@ -881,9 +946,23 @@ type UserClientAPI = ] (Maybe Client) ) + :<|> Named + "get-client-capabilities@v6" + ( Summary "Read back what the client has been posting about itself" + :> Until 'V7 + :> ZUser + :> "clients" + :> CaptureClientId "client" + :> "capabilities" + :> MultiVerb1 + 'GET + '[JSON] + (VersionedRespond 'V6 200 "capabilities" ClientCapabilityList) + ) :<|> Named "get-client-capabilities@v7" ( Summary "Read back what the client has been posting about itself" + :> From 'V7 :> Until 'V8 :> ZUser :> "clients" @@ -897,6 +976,7 @@ type UserClientAPI = :<|> Named "get-client-capabilities" ( Summary "Read back what the client has been posting about itself" + :> From 'V8 :> ZUser :> "clients" :> CaptureClientId "client" 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 1576df42d0a..f7a7868b561 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 @@ -145,9 +145,27 @@ type BotAPI = :> ReqBody '[JSON] UpdateBotPrekeys :> MultiVerb1 'POST '[JSON] (RespondEmpty 200 "") ) + :<|> Named + "bot-get-client@v6" + ( Summary "Get client for bot" + :> Until 'V7 + :> CanThrow 'AccessDenied + :> CanThrow 'ClientNotFound + :> ZBot + :> "bot" + :> "client" + :> MultiVerb + 'GET + '[JSON] + '[ ErrorResponse 'ClientNotFound, + VersionedRespond 'V6 200 "Client found" Client + ] + (Maybe Client) + ) :<|> Named "bot-get-client@v7" ( Summary "Get client for bot" + :> From 'V7 :> Until 'V8 :> CanThrow 'AccessDenied :> CanThrow 'ClientNotFound diff --git a/libs/wire-api/src/Wire/API/Routes/Version.hs b/libs/wire-api/src/Wire/API/Routes/Version.hs index 4ecd8475fbc..37659155caa 100644 --- a/libs/wire-api/src/Wire/API/Routes/Version.hs +++ b/libs/wire-api/src/Wire/API/Routes/Version.hs @@ -32,6 +32,7 @@ module Wire.API.Routes.Version Version (..), versionInt, versionText, + versionedName, VersionNumber (..), VersionExp (..), supportedVersions, @@ -108,6 +109,10 @@ supportedVersions = [minBound .. maxBound] maxAvailableVersion :: Set Version -> Maybe Version maxAvailableVersion disabled = Set.lookupMax $ Set.fromList supportedVersions \\ disabled +versionedName :: Maybe Version -> Text -> Text +versionedName Nothing unversionedName = unversionedName +versionedName (Just v) unversionedName = unversionedName <> Text.pack (show v) + ---------------------------------------------------------------------- versionText :: Version -> Text diff --git a/libs/wire-api/src/Wire/API/Routes/Versioned.hs b/libs/wire-api/src/Wire/API/Routes/Versioned.hs index 640d91fd022..db2b7e9dae3 100644 --- a/libs/wire-api/src/Wire/API/Routes/Versioned.hs +++ b/libs/wire-api/src/Wire/API/Routes/Versioned.hs @@ -23,6 +23,7 @@ import Data.Metrics.Servant import Data.OpenApi qualified as S import Data.Schema import Data.Singletons +import Data.Text qualified as Text import GHC.TypeLits import Imports import Servant @@ -116,4 +117,13 @@ deriving via Schema (Versioned v a) instance (ToSchema (Versioned v a)) => ToJSO instance (SingI v, ToSchema (Versioned v a), Typeable a, Typeable v) => S.ToSchema (Versioned v a) where declareNamedSchema _ = do S.NamedSchema n s <- schemaToSwagger (Proxy @(Versioned v a)) - pure $ S.NamedSchema (fmap (<> toUrlPiece (demote @v)) n) s + pure $ S.NamedSchema (fmap withVersionSuffix n) s + where + versionSuffix :: Text + versionSuffix = Text.pack $ show (demote @v) + + withVersionSuffix :: Text -> Text + withVersionSuffix origName = + if versionSuffix `Text.isSuffixOf` origName + then origName + else origName <> versionSuffix diff --git a/libs/wire-api/src/Wire/API/User/Client.hs b/libs/wire-api/src/Wire/API/User/Client.hs index 79aa53595c2..7c54c973391 100644 --- a/libs/wire-api/src/Wire/API/User/Client.hs +++ b/libs/wire-api/src/Wire/API/User/Client.hs @@ -157,6 +157,17 @@ instance ToSchema ClientCapability where element "legalhold-implicit-consent" ClientSupportsLegalholdImplicitConsent <> element "consumable-notifications" ClientSupportsConsumableNotifications +data ClientCapabilityV7 = ClientSupportsLegalholdImplicitConsentV7 + deriving (Eq) + +capabilitySchemaV7 :: ValueSchema NamedSwaggerDoc ClientCapabilityV7 +capabilitySchemaV7 = + enum @Text "ClientCapabilityV7" $ + element "legalhold-implicit-consent" ClientSupportsLegalholdImplicitConsentV7 + +clientCapabilityFromV7 :: ClientCapabilityV7 -> ClientCapability +clientCapabilityFromV7 ClientSupportsLegalholdImplicitConsentV7 = ClientSupportsLegalholdImplicitConsent + instance C.Cql ClientCapability where ctype = C.Tagged C.IntColumn @@ -179,25 +190,37 @@ newtype ClientCapabilityList = ClientCapabilityList {fromClientCapabilityList :: instance ToSchema ClientCapabilityList where schema = capabilitiesSchema Nothing -instance ToSchema (Versioned V7 ClientCapabilityList) where +instance ToSchema (Versioned V6 ClientCapabilityList) where schema = - object "ClientCapabilityListV7" $ + object "ClientCapabilityListV6Wrapper" $ Versioned - <$> unVersioned .= field "capabilities" (capabilitiesSchema (Just V7)) + <$> unVersioned .= field "capabilities" (capabilitiesSchema (Just V6)) + +instance ToSchema (Versioned V7 ClientCapabilityList) where + schema = + Versioned + <$> unVersioned .= capabilitiesSchema (Just V7) capabilitiesSchema :: Maybe Version -> ValueSchema NamedSwaggerDoc ClientCapabilityList capabilitiesSchema mVersion = - named "ClientCapabilityList" $ + named (versionedName mVersion "ClientCapabilityList") $ ClientCapabilityList - <$> (Set.toList . dropIncompatibleCapabilities . fromClientCapabilityList) .= (Set.fromList <$> array schema) + <$> (Set.toList . fromClientCapabilityList) .= (Set.fromList <$> listSchema) where - dropIncompatibleCapabilities :: Set ClientCapability -> Set ClientCapability - dropIncompatibleCapabilities caps = + listSchema :: ValueSchema SwaggerDoc [ClientCapability] + listSchema = case mVersion of - Just v | v <= V7 -> Set.delete ClientSupportsConsumableNotifications caps - _ -> caps + Just v + | v <= V7 -> + map clientCapabilityFromV7 + <$> mapMaybe toCapabilityV7 .= array (capabilitySchemaV7) + _ -> array schema + + toCapabilityV7 :: ClientCapability -> Maybe ClientCapabilityV7 + toCapabilityV7 ClientSupportsConsumableNotifications = Nothing + toCapabilityV7 ClientSupportsLegalholdImplicitConsent = Just ClientSupportsLegalholdImplicitConsentV7 -------------------------------------------------------------------------------- -- UserClientMap @@ -511,7 +534,7 @@ mlsPublicKeysSchema = clientSchema :: Maybe Version -> ValueSchema NamedSwaggerDoc Client clientSchema mVersion = - object "Client" $ + object (versionedName mVersion "Client") $ Client <$> clientId .= field "id" schema <*> clientType .= field "type" schema @@ -528,21 +551,32 @@ clientSchema mVersion = caps = case mVersion of -- broken capability serialisation for backwards compatibility Just v - | v <= V7 -> + | v <= V6 -> + dimap Versioned unVersioned $ schema @(Versioned V6 ClientCapabilityList) + | v == V7 -> dimap Versioned unVersioned $ schema @(Versioned V7 ClientCapabilityList) _ -> schema @ClientCapabilityList instance ToSchema Client where schema = clientSchema Nothing +instance ToSchema (Versioned 'V6 Client) where + schema = Versioned <$> unVersioned .= clientSchema (Just V6) + instance ToSchema (Versioned 'V7 Client) where schema = Versioned <$> unVersioned .= clientSchema (Just V7) +instance {-# OVERLAPPING #-} ToSchema (Versioned 'V6 [Client]) where + schema = + Versioned + <$> unVersioned + .= named "ClientListV6" (array (clientSchema (Just V6))) + instance {-# OVERLAPPING #-} ToSchema (Versioned 'V7 [Client]) where schema = Versioned <$> unVersioned - .= named "ClientList" (array (clientSchema (Just V7))) + .= named "ClientListV7" (array (clientSchema (Just V7))) mlsPublicKeysFieldSchema :: ObjectSchema SwaggerDoc MLSPublicKeys mlsPublicKeysFieldSchema = fromMaybe mempty <$> optField "mls_public_keys" mlsPublicKeysSchema @@ -754,6 +788,9 @@ newClientSchema mVersion = instance ToSchema NewClient where schema = newClientSchema Nothing +instance ToSchema (Versioned 'V6 NewClient) where + schema = Versioned <$> unVersioned .= newClientSchema (Just V6) + instance ToSchema (Versioned 'V7 NewClient) where schema = Versioned <$> unVersioned .= newClientSchema (Just V7) @@ -835,6 +872,9 @@ updateClientSchema mVersion = instance ToSchema UpdateClient where schema = updateClientSchema Nothing +instance ToSchema (Versioned 'V6 UpdateClient) where + schema = Versioned <$> unVersioned .= updateClientSchema (Just V6) + instance ToSchema (Versioned 'V7 UpdateClient) where schema = Versioned <$> unVersioned .= updateClientSchema (Just V7) diff --git a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs index 875b031097c..b2ea3c5631f 100644 --- a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs +++ b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs @@ -1013,8 +1013,8 @@ tests = testObjects [(Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_1, "testObject_ClientClass_user_1.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_2, "testObject_ClientClass_user_2.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_3, "testObject_ClientClass_user_3.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_4, "testObject_ClientClass_user_4.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_5, "testObject_ClientClass_user_5.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_6, "testObject_ClientClass_user_6.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_7, "testObject_ClientClass_user_7.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_8, "testObject_ClientClass_user_8.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_9, "testObject_ClientClass_user_9.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_10, "testObject_ClientClass_user_10.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_11, "testObject_ClientClass_user_11.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_12, "testObject_ClientClass_user_12.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_13, "testObject_ClientClass_user_13.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_14, "testObject_ClientClass_user_14.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_15, "testObject_ClientClass_user_15.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_16, "testObject_ClientClass_user_16.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_17, "testObject_ClientClass_user_17.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_18, "testObject_ClientClass_user_18.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_19, "testObject_ClientClass_user_19.json"), (Test.Wire.API.Golden.Generated.ClientClass_user.testObject_ClientClass_user_20, "testObject_ClientClass_user_20.json")], testGroup "Golden: PubClient_user" $ testObjects [(Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_1, "testObject_PubClient_user_1.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_2, "testObject_PubClient_user_2.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_3, "testObject_PubClient_user_3.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_4, "testObject_PubClient_user_4.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_5, "testObject_PubClient_user_5.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_6, "testObject_PubClient_user_6.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_7, "testObject_PubClient_user_7.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_8, "testObject_PubClient_user_8.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_9, "testObject_PubClient_user_9.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_10, "testObject_PubClient_user_10.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_11, "testObject_PubClient_user_11.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_12, "testObject_PubClient_user_12.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_13, "testObject_PubClient_user_13.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_14, "testObject_PubClient_user_14.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_15, "testObject_PubClient_user_15.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_16, "testObject_PubClient_user_16.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_17, "testObject_PubClient_user_17.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_18, "testObject_PubClient_user_18.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_19, "testObject_PubClient_user_19.json"), (Test.Wire.API.Golden.Generated.PubClient_user.testObject_PubClient_user_20, "testObject_PubClient_user_20.json")], - testGroup "Golden: ClientV5_user" $ - testObjects [(Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_1, "testObject_ClientV6_user_1.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_2, "testObject_ClientV6_user_2.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_3, "testObject_ClientV6_user_3.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_4, "testObject_ClientV6_user_4.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_5, "testObject_ClientV6_user_5.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_6, "testObject_ClientV6_user_6.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_7, "testObject_ClientV6_user_7.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_8, "testObject_ClientV6_user_8.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_9, "testObject_ClientV6_user_9.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_10, "testObject_ClientV6_user_10.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_11, "testObject_ClientV6_user_11.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_12, "testObject_ClientV6_user_12.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_13, "testObject_ClientV6_user_13.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_14, "testObject_ClientV6_user_14.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_15, "testObject_ClientV6_user_15.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_16, "testObject_ClientV6_user_16.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_17, "testObject_ClientV6_user_17.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_18, "testObject_ClientV6_user_18.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_19, "testObject_ClientV6_user_19.json"), (Versioned @'V7 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_20, "testObject_ClientV6_user_20.json")], + testGroup "Golden: ClientV6_user" $ + testObjects [(Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_1, "testObject_ClientV6_user_1.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_2, "testObject_ClientV6_user_2.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_3, "testObject_ClientV6_user_3.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_4, "testObject_ClientV6_user_4.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_5, "testObject_ClientV6_user_5.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_6, "testObject_ClientV6_user_6.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_7, "testObject_ClientV6_user_7.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_8, "testObject_ClientV6_user_8.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_9, "testObject_ClientV6_user_9.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_10, "testObject_ClientV6_user_10.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_11, "testObject_ClientV6_user_11.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_12, "testObject_ClientV6_user_12.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_13, "testObject_ClientV6_user_13.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_14, "testObject_ClientV6_user_14.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_15, "testObject_ClientV6_user_15.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_16, "testObject_ClientV6_user_16.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_17, "testObject_ClientV6_user_17.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_18, "testObject_ClientV6_user_18.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_19, "testObject_ClientV6_user_19.json"), (Versioned @'V6 Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_20, "testObject_ClientV6_user_20.json")], testGroup "Golden: Client_user" $ testObjects [(Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_1, "testObject_Client_user_1.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_2, "testObject_Client_user_2.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_3, "testObject_Client_user_3.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_4, "testObject_Client_user_4.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_5, "testObject_Client_user_5.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_6, "testObject_Client_user_6.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_7, "testObject_Client_user_7.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_8, "testObject_Client_user_8.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_9, "testObject_Client_user_9.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_10, "testObject_Client_user_10.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_11, "testObject_Client_user_11.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_12, "testObject_Client_user_12.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_13, "testObject_Client_user_13.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_14, "testObject_Client_user_14.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_15, "testObject_Client_user_15.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_16, "testObject_Client_user_16.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_17, "testObject_Client_user_17.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_18, "testObject_Client_user_18.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_19, "testObject_Client_user_19.json"), (Test.Wire.API.Golden.Generated.Client_user.testObject_Client_user_20, "testObject_Client_user_20.json")], testGroup "Golden: NewClient_user" $ diff --git a/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual.hs b/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual.hs index afe0fb45da2..3120bbdf928 100644 --- a/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual.hs +++ b/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual.hs @@ -121,7 +121,9 @@ tests = (testObject_ClientCapabilityList_2, "testObject_ClientCapabilityList_2.json") ], testGroup "ClientCapabilityListV6 - non-round-trip" $ - [testToJSON testObject_ClientCapabilityList_3 "testObject_ClientCapabilityList_3.json"], + [ testToJSON testObject_ClientCapabilityList_3 "testObject_ClientCapabilityList_3.json", + testToJSON testObject_ClientCapabilityList_3_V7 "testObject_ClientCapabilityList_3_V7.json" + ], testGroup "ClientCapabilityList" $ testObjects [ (testObject_ClientCapabilityList_4, "testObject_ClientCapabilityList_4.json"), diff --git a/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/ClientCapabilityList.hs b/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/ClientCapabilityList.hs index 323e4d7d8b3..4d75c97e80e 100644 --- a/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/ClientCapabilityList.hs +++ b/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/ClientCapabilityList.hs @@ -23,13 +23,13 @@ import Wire.API.Routes.Version import Wire.API.Routes.Versioned import Wire.API.User.Client (ClientCapability (..), ClientCapabilityList (..)) -testObject_ClientCapabilityList_1 :: Versioned V7 ClientCapabilityList +testObject_ClientCapabilityList_1 :: Versioned V6 ClientCapabilityList testObject_ClientCapabilityList_1 = Versioned $ ClientCapabilityList mempty -testObject_ClientCapabilityList_2 :: Versioned V7 ClientCapabilityList +testObject_ClientCapabilityList_2 :: Versioned V6 ClientCapabilityList testObject_ClientCapabilityList_2 = Versioned $ ClientCapabilityList (Set.fromList [ClientSupportsLegalholdImplicitConsent]) -testObject_ClientCapabilityList_3 :: Versioned V7 ClientCapabilityList +testObject_ClientCapabilityList_3 :: Versioned V6 ClientCapabilityList testObject_ClientCapabilityList_3 = Versioned $ ClientCapabilityList @@ -39,6 +39,16 @@ testObject_ClientCapabilityList_3 = ] ) +testObject_ClientCapabilityList_3_V7 :: Versioned V7 ClientCapabilityList +testObject_ClientCapabilityList_3_V7 = + Versioned $ + ClientCapabilityList + ( Set.fromList + [ ClientSupportsLegalholdImplicitConsent, + ClientSupportsConsumableNotifications + ] + ) + testObject_ClientCapabilityList_4 :: ClientCapabilityList testObject_ClientCapabilityList_4 = ClientCapabilityList mempty diff --git a/libs/wire-api/test/golden/testObject_ClientCapabilityList_3_V7.json b/libs/wire-api/test/golden/testObject_ClientCapabilityList_3_V7.json new file mode 100644 index 00000000000..36d36433693 --- /dev/null +++ b/libs/wire-api/test/golden/testObject_ClientCapabilityList_3_V7.json @@ -0,0 +1,3 @@ +[ + "legalhold-implicit-consent" +] diff --git a/services/brig/docs/swagger-v7.json b/services/brig/docs/swagger-v7.json index 8b4dab3dbef..785d7bf11a8 100644 --- a/services/brig/docs/swagger-v7.json +++ b/services/brig/docs/swagger-v7.json @@ -1,46 +1,29 @@ { "components": { "schemas": { - "": { - "enum": [ - "audio", - "books", - "business", - "design", - "education", - "entertainment", - "finance", - "fitness", - "food-drink", - "games", - "graphics", - "health", - "integration", - "lifestyle", - "media", - "medical", - "movies", - "music", - "news", - "photography", - "poll", - "productivity", - "quiz", - "rating", - "shopping", - "social", - "sports", - "travel", - "tutorial", - "video", - "weather" - ], - "type": "string" - }, "ASCII": { "example": "aGVsbG8", "type": "string" }, + "AcceptTeamInvitation": { + "description": "Accept an invitation to join a team on Wire.", + "properties": { + "code": { + "$ref": "#/components/schemas/ASCII" + }, + "password": { + "description": "The user account password.", + "maxLength": 1024, + "minLength": 6, + "type": "string" + } + }, + "required": [ + "code", + "password" + ], + "type": "object" + }, "Access": { "description": "How users can join conversations", "enum": [ @@ -103,6 +86,16 @@ ], "type": "string" }, + "AccountStatus": { + "enum": [ + "active", + "suspended", + "deleted", + "ephemeral", + "pending-invitation" + ], + "type": "string" + }, "Action": { "enum": [ "add_conversation_member", @@ -301,189 +294,6 @@ ], "type": "object" }, - "Alpha": { - "enum": [ - "AED", - "AFN", - "ALL", - "AMD", - "ANG", - "AOA", - "ARS", - "AUD", - "AWG", - "AZN", - "BAM", - "BBD", - "BDT", - "BGN", - "BHD", - "BIF", - "BMD", - "BND", - "BOB", - "BOV", - "BRL", - "BSD", - "BTN", - "BWP", - "BYN", - "BZD", - "CAD", - "CDF", - "CHE", - "CHF", - "CHW", - "CLF", - "CLP", - "CNY", - "COP", - "COU", - "CRC", - "CUC", - "CUP", - "CVE", - "CZK", - "DJF", - "DKK", - "DOP", - "DZD", - "EGP", - "ERN", - "ETB", - "EUR", - "FJD", - "FKP", - "GBP", - "GEL", - "GHS", - "GIP", - "GMD", - "GNF", - "GTQ", - "GYD", - "HKD", - "HNL", - "HRK", - "HTG", - "HUF", - "IDR", - "ILS", - "INR", - "IQD", - "IRR", - "ISK", - "JMD", - "JOD", - "JPY", - "KES", - "KGS", - "KHR", - "KMF", - "KPW", - "KRW", - "KWD", - "KYD", - "KZT", - "LAK", - "LBP", - "LKR", - "LRD", - "LSL", - "LYD", - "MAD", - "MDL", - "MGA", - "MKD", - "MMK", - "MNT", - "MOP", - "MRO", - "MUR", - "MVR", - "MWK", - "MXN", - "MXV", - "MYR", - "MZN", - "NAD", - "NGN", - "NIO", - "NOK", - "NPR", - "NZD", - "OMR", - "PAB", - "PEN", - "PGK", - "PHP", - "PKR", - "PLN", - "PYG", - "QAR", - "RON", - "RSD", - "RUB", - "RWF", - "SAR", - "SBD", - "SCR", - "SDG", - "SEK", - "SGD", - "SHP", - "SLL", - "SOS", - "SRD", - "SSP", - "STD", - "SVC", - "SYP", - "SZL", - "THB", - "TJS", - "TMT", - "TND", - "TOP", - "TRY", - "TTD", - "TWD", - "TZS", - "UAH", - "UGX", - "USD", - "USN", - "UYI", - "UYU", - "UZS", - "VEF", - "VND", - "VUV", - "WST", - "XAF", - "XAG", - "XAU", - "XBA", - "XBB", - "XBC", - "XBD", - "XCD", - "XDR", - "XOF", - "XPD", - "XPF", - "XPT", - "XSU", - "XTS", - "XUA", - "XXX", - "YER", - "ZAR", - "ZMW", - "ZWL" - ], - "type": "string" - }, "AppLockConfig": { "properties": { "enforceAppLock": { @@ -580,6 +390,7 @@ "type": "object" }, "AssetKey": { + "description": "S3 asset key for an icon image with retention information.", "example": "3-1-47de4580-ae51-4650-acbb-d10c028cb0ac", "type": "string" }, @@ -600,7 +411,7 @@ "AuthnRequest": { "properties": { "iD": { - "$ref": "#/components/schemas/ID_*_AuthnRequest" + "$ref": "#/components/schemas/Id_AuthnRequest" }, "issueInstant": { "$ref": "#/components/schemas/Time" @@ -633,20 +444,17 @@ "BindingNewTeamUser": { "properties": { "currency": { - "$ref": "#/components/schemas/Alpha" + "$ref": "#/components/schemas/Currency.Alpha" }, "icon": { "$ref": "#/components/schemas/Icon" }, "icon_key": { - "description": "team icon asset key", + "description": "The decryption key for the team icon S3 asset", "maxLength": 256, "minLength": 1, "type": "string" }, - "members": { - "description": "initial team member ids (between 1 and 127)" - }, "name": { "description": "team name", "maxLength": 256, @@ -779,68 +587,18 @@ ], "type": "object" }, - "Client": { - "properties": { - "capabilities": { - "$ref": "#/components/schemas/ClientCapabilityList" - }, - "class": { - "$ref": "#/components/schemas/ClientClass" - }, - "cookie": { - "type": "string" - }, - "id": { - "description": "A 64-bit unsigned integer, represented as a hexadecimal numeral. Any valid hexadecimal numeral is accepted, but the backend will only produce representations with lowercase digits and no leading zeros", - "type": "string" - }, - "label": { - "type": "string" - }, - "last_active": { - "$ref": "#/components/schemas/UTCTime" - }, - "mls_public_keys": { - "$ref": "#/components/schemas/MLSPublicKeys" - }, - "model": { - "type": "string" - }, - "time": { - "$ref": "#/components/schemas/UTCTimeMillis" - }, - "type": { - "$ref": "#/components/schemas/ClientType" - } + "ClientCapabilityListV7": { + "items": { + "$ref": "#/components/schemas/ClientCapabilityV7" }, - "required": [ - "id", - "type", - "time" - ], - "type": "object" + "type": "array" }, - "ClientCapability": { + "ClientCapabilityV7": { "enum": [ "legalhold-implicit-consent" ], "type": "string" }, - "ClientCapabilityList": { - "properties": { - "capabilities": { - "description": "Hints provided by the client for the backend so it can behave in a backwards-compatible way.", - "items": { - "$ref": "#/components/schemas/ClientCapability" - }, - "type": "array" - } - }, - "required": [ - "capabilities" - ], - "type": "object" - }, "ClientClass": { "enum": [ "phone", @@ -870,9 +628,9 @@ ], "type": "object" }, - "ClientListv6": { + "ClientListV7": { "items": { - "$ref": "#/components/schemas/Client" + "$ref": "#/components/schemas/ClientV7" }, "type": "array" }, @@ -923,10 +681,10 @@ ], "type": "string" }, - "Clientv6": { + "ClientV7": { "properties": { "capabilities": { - "$ref": "#/components/schemas/ClientCapabilityList" + "$ref": "#/components/schemas/ClientCapabilityListV7" }, "class": { "$ref": "#/components/schemas/ClientClass" @@ -1499,7 +1257,7 @@ "type": "integer" }, "epoch_timestamp": { - "$ref": "#/components/schemas/Epoch Timestamp" + "$ref": "#/components/schemas/EpochTimestamp" }, "group_id": { "$ref": "#/components/schemas/GroupId" @@ -1558,7 +1316,7 @@ ], "type": "object" }, - "ConversationV3v3": { + "ConversationV3": { "description": "A conversation object as returned from the server", "properties": { "access": { @@ -1587,7 +1345,7 @@ "type": "integer" }, "epoch_timestamp": { - "$ref": "#/components/schemas/Epoch Timestamp" + "$ref": "#/components/schemas/EpochTimestamp" }, "group_id": { "$ref": "#/components/schemas/GroupId" @@ -1647,7 +1405,7 @@ ], "type": "object" }, - "ConversationV6v6": { + "ConversationV6": { "description": "A conversation object as returned from the server", "properties": { "access": { @@ -1834,7 +1592,7 @@ }, "type": "object" }, - "CreateGroupConversationv6": { + "CreateGroupConversationV6": { "description": "A created group-conversation object extended with a list of failed-to-add users", "properties": { "access": { @@ -1970,11 +1728,19 @@ "description": { "type": "string" }, + "idp": { + "$ref": "#/components/schemas/UUID" + }, + "name": { + "type": "string" + }, "password": { + "maxLength": 1024, + "minLength": 6, "type": "string" }, "verification_code": { - "type": "string" + "$ref": "#/components/schemas/ASCII" } }, "required": [ @@ -1988,7 +1754,6 @@ "$ref": "#/components/schemas/ScimTokenInfo" }, "token": { - "description": "Authentication token", "type": "string" } }, @@ -1998,6 +1763,206 @@ ], "type": "object" }, + "CreateUserTeam": { + "properties": { + "team_id": { + "$ref": "#/components/schemas/UUID" + }, + "team_name": { + "type": "string" + } + }, + "required": [ + "team_id", + "team_name" + ], + "type": "object" + }, + "Currency.Alpha": { + "description": "ISO 4217 alphabetic codes. This is only stored by the backend, not processed. It can be removed once billing supports currency changes after team creation.", + "enum": [ + "AED", + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BOV", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BZD", + "CAD", + "CDF", + "CHE", + "CHF", + "CHW", + "CLF", + "CLP", + "CNY", + "COP", + "COU", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MXV", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SRD", + "SSP", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "USN", + "UYI", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XAG", + "XAU", + "XBA", + "XBB", + "XBC", + "XBD", + "XCD", + "XDR", + "XOF", + "XPD", + "XPF", + "XPT", + "XSU", + "XTS", + "XUA", + "XXX", + "YER", + "ZAR", + "ZMW", + "ZWL" + ], + "example": "EUR", + "type": "string" + }, "CustomBackend": { "description": "Description of a custom backend", "properties": { @@ -2292,7 +2257,7 @@ ], "type": "object" }, - "Epoch Timestamp": { + "EpochTimestamp": { "example": "2021-05-12T10:52:02Z", "format": "yyyy-mm-ddThh:MM:ssZ", "type": "string" @@ -2348,7 +2313,7 @@ "type": "integer" }, "epoch_timestamp": { - "$ref": "#/components/schemas/Epoch Timestamp" + "$ref": "#/components/schemas/EpochTimestamp" }, "group_id": { "$ref": "#/components/schemas/GroupId" @@ -2756,18 +2721,9 @@ "example": "https://example.com", "type": "string" }, - "ID_*_AuthnRequest": { - "properties": { - "iD": { - "$ref": "#/components/schemas/XmlText" - } - }, - "required": [ - "iD" - ], - "type": "object" - }, "Icon": { + "description": "S3 asset key for an icon image with retention information. Allows special value 'default'.", + "example": "3-1-47de4580-ae51-4650-acbb-d10c028cb0ac", "type": "string" }, "Id": { @@ -2848,15 +2804,26 @@ }, "type": "object" }, - "Invitation": { - "description": "An invitation to join a team on Wire", + "Id_AuthnRequest": { "properties": { - "created_at": { - "$ref": "#/components/schemas/UTCTimeMillis" - }, - "created_by": { - "$ref": "#/components/schemas/UUID" - }, + "iD": { + "$ref": "#/components/schemas/XmlText" + } + }, + "required": [ + "iD" + ], + "type": "object" + }, + "Invitation": { + "description": "An invitation to join a team on Wire. If invitee is invited from an existing personal account, inviter email is included.", + "properties": { + "created_at": { + "$ref": "#/components/schemas/UTCTimeMillis" + }, + "created_by": { + "$ref": "#/components/schemas/UUID" + }, "email": { "$ref": "#/components/schemas/Email" }, @@ -2876,7 +2843,7 @@ "$ref": "#/components/schemas/UUID" }, "url": { - "$ref": "#/components/schemas/URIRef Absolute" + "$ref": "#/components/schemas/URIRef_Absolute" } }, "required": [ @@ -2910,6 +2877,10 @@ "InvitationRequest": { "description": "A request to join a team on Wire.", "properties": { + "allow_existing": { + "description": "Whether invitations to existing users are allowed.", + "type": "boolean" + }, "email": { "$ref": "#/components/schemas/Email" }, @@ -2931,6 +2902,47 @@ ], "type": "object" }, + "InvitationUserView": { + "properties": { + "created_at": { + "$ref": "#/components/schemas/UTCTimeMillis" + }, + "created_by": { + "$ref": "#/components/schemas/UUID" + }, + "created_by_email": { + "$ref": "#/components/schemas/Email" + }, + "email": { + "$ref": "#/components/schemas/Email" + }, + "id": { + "$ref": "#/components/schemas/UUID" + }, + "name": { + "description": "Name of the invitee (1 - 128 characters)", + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/Role" + }, + "team": { + "$ref": "#/components/schemas/UUID" + }, + "url": { + "$ref": "#/components/schemas/URIRef_Absolute" + } + }, + "required": [ + "team", + "id", + "created_at", + "email" + ], + "type": "object" + }, "InviteQualified": { "properties": { "conversation_role": { @@ -3382,7 +3394,7 @@ ], "type": "object" }, - "MLSOne2OneConversation_MLSPublicKey": { + "MLSOne2OneConversation_SomeKey": { "properties": { "conversation": { "$ref": "#/components/schemas/Conversation" @@ -3397,10 +3409,6 @@ ], "type": "object" }, - "MLSPublicKey": { - "example": "ZXhhbXBsZQo=", - "type": "string" - }, "MLSPublicKeys": { "additionalProperties": { "example": "ZXhhbXBsZQo=", @@ -3731,14 +3739,10 @@ ], "type": "object" }, - "NewClient": { + "NewClientV7": { "properties": { "capabilities": { - "description": "Hints provided by the client for the backend so it can behave in a backwards-compatible way.", - "items": { - "$ref": "#/components/schemas/ClientCapability" - }, - "type": "array" + "$ref": "#/components/schemas/ClientCapabilityListV7" }, "class": { "$ref": "#/components/schemas/ClientClass" @@ -3961,7 +3965,7 @@ }, "tags": { "items": { - "$ref": "#/components/schemas/" + "$ref": "#/components/schemas/ServiceTag" }, "maxItems": 3, "minItems": 1, @@ -4462,12 +4466,14 @@ "description": "This is just a complicated way of representing a team role. self and copy always have to contain the same integer, and only the following integers are allowed: 1025 (partner), 1587 (member), 5951 (admin), 8191 (owner). Unit tests of the galley-types package in wire-server contain an authoritative list.", "properties": { "copy": { + "description": "Permissions that this user is able to grant others", "format": "int64", "maximum": 18446744073709551615, "minimum": 0, "type": "integer" }, "self": { + "description": "Permissions that the user has", "format": "int64", "maximum": 18446744073709551615, "minimum": 0, @@ -4755,7 +4761,7 @@ }, "type": "object" }, - "QualifiedUserIdList with EdMemberLeftReason": { + "QualifiedUserIdList_with_EdMemberLeftReason": { "properties": { "qualified_user_ids": { "items": { @@ -4947,7 +4953,7 @@ "type": "array" }, "username": { - "$ref": "#/components/schemas/" + "$ref": "#/components/schemas/TurnUsername" } }, "required": [ @@ -5076,6 +5082,10 @@ "description": "Role name, between 2 and 128 chars, 'wire_' prefix is reserved for roles designed by Wire (i.e., no custom roles can have the same prefix)", "type": "string" }, + "SFTUsername": { + "description": "String containing the SFT username", + "type": "string" + }, "SSOConfig.LockableFeature": { "properties": { "lockStatus": { @@ -5111,6 +5121,9 @@ "idp": { "$ref": "#/components/schemas/UUID" }, + "name": { + "type": "string" + }, "team": { "$ref": "#/components/schemas/UUID" } @@ -5119,7 +5132,8 @@ "team", "id", "created_at", - "description" + "description", + "name" ], "type": "object" }, @@ -5137,6 +5151,17 @@ ], "type": "object" }, + "ScimTokenName": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, "SearchResult": { "properties": { "documents": { @@ -5386,7 +5411,7 @@ }, "tags": { "items": { - "$ref": "#/components/schemas/" + "$ref": "#/components/schemas/ServiceTag" }, "type": "array" } @@ -5438,6 +5463,53 @@ "type": "string" }, "ServiceProfile": { + "properties": { + "assets": { + "items": { + "$ref": "#/components/schemas/UserAsset" + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "id": { + "$ref": "#/components/schemas/UUID" + }, + "name": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "provider": { + "$ref": "#/components/schemas/UUID" + }, + "summary": { + "type": "string" + }, + "tags": { + "items": { + "$ref": "#/components/schemas/ServiceTag" + }, + "type": "array" + } + }, + "required": [ + "id", + "provider", + "name", + "summary", + "description", + "assets", + "tags", + "enabled" + ], + "type": "object" + }, + "ServiceProfilePage": { "properties": { "has_more": { "type": "boolean" @@ -5470,9 +5542,45 @@ ], "type": "object" }, + "ServiceTag": { + "enum": [ + "audio", + "books", + "business", + "design", + "education", + "entertainment", + "finance", + "fitness", + "food-drink", + "games", + "graphics", + "health", + "integration", + "lifestyle", + "media", + "medical", + "movies", + "music", + "news", + "photography", + "poll", + "productivity", + "quiz", + "rating", + "shopping", + "social", + "sports", + "travel", + "tutorial", + "video", + "weather" + ], + "type": "string" + }, "ServiceTagList": { "items": { - "$ref": "#/components/schemas/" + "$ref": "#/components/schemas/ServiceTag" }, "type": "array" }, @@ -5940,6 +6048,10 @@ "TurnURI": { "type": "string" }, + "TurnUsername": { + "description": "Username to use for authenticating against the given TURN servers", + "type": "string" + }, "TypingData": { "properties": { "status": { @@ -5958,7 +6070,7 @@ ], "type": "string" }, - "URIRef Absolute": { + "URIRef_Absolute": { "description": "URL of the invitation link to be sent to the invitee", "type": "string" }, @@ -6014,14 +6126,10 @@ ], "type": "object" }, - "UpdateClient": { + "UpdateClientV7": { "properties": { "capabilities": { - "description": "Hints provided by the client for the backend so it can behave in a backwards-compatible way.", - "items": { - "$ref": "#/components/schemas/ClientCapability" - }, - "type": "array" + "$ref": "#/components/schemas/ClientCapabilityListV7" }, "label": { "description": "A new name for this client.", @@ -6084,7 +6192,7 @@ }, "tags": { "items": { - "$ref": "#/components/schemas/" + "$ref": "#/components/schemas/ServiceTag" }, "maxItems": 3, "minItems": 1, @@ -6167,6 +6275,9 @@ "email": { "$ref": "#/components/schemas/Email" }, + "email_unvalidated": { + "$ref": "#/components/schemas/Email" + }, "expires_at": { "$ref": "#/components/schemas/UTCTimeMillis" }, @@ -6199,6 +6310,9 @@ "sso_id": { "$ref": "#/components/schemas/UserSSOId" }, + "status": { + "$ref": "#/components/schemas/AccountStatus" + }, "supported_protocols": { "items": { "$ref": "#/components/schemas/BaseProtocol" @@ -6218,6 +6332,7 @@ "qualified_id", "name", "accent_id", + "status", "locale" ], "type": "object" @@ -6550,7 +6665,7 @@ "VersionInfo": { "example": { "development": [ - 7 + 8 ], "domain": "example.com", "federation": false, @@ -6562,7 +6677,8 @@ 4, 5, 6, - 7 + 7, + 8 ] }, "properties": { @@ -6602,7 +6718,8 @@ 4, 5, 6, - 7 + 7, + 8 ], "type": "integer" }, @@ -6744,64 +6861,10 @@ }, "openapi": "3.0.0", "paths": { - "/": { - "get": { - "description": " [internal route ID: \"get-services-tags\"]\n\n", - "responses": { - "200": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/ServiceTagList" - } - } - }, - "description": "" - }, - "403": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "example": { - "code": 403, - "label": "access-denied", - "message": "Access denied." - }, - "properties": { - "code": { - "enum": [ - 403 - ], - "type": "integer" - }, - "label": { - "enum": [ - "access-denied" - ], - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "label", - "message" - ], - "type": "object" - } - } - }, - "description": "Access denied. (label: `access-denied`)" - } - }, - "summary": "Get services tags" - } - }, "/access": { "post": { - "description": " [internal route ID: \"access\"]\n\nYou can provide only a cookie or a cookie and token. Every other combination is invalid. Access tokens can be given as query parameter or authorisation header, with the latter being preferred.Calls federation service brig on send-connection-action", + "description": " [internal route ID: \"access\"]\n\nYou can provide only a cookie or a cookie and token. Every other combination is invalid. Access tokens can be given as query parameter or authorisation header, with the latter being preferred.", + "operationId": "access", "parameters": [ { "in": "query", @@ -6879,6 +6942,7 @@ "/access/logout": { "post": { "description": " [internal route ID: \"logout\"]\n\nCalling this endpoint will effectively revoke the given cookie and subsequent calls to /access with the same cookie will result in a 403.", + "operationId": "logout", "responses": { "200": { "description": "Logout" @@ -6927,6 +6991,7 @@ "/access/self/email": { "put": { "description": " [internal route ID: \"change-self-email\"]\n\n", + "operationId": "change-self-email", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -7098,7 +7163,8 @@ }, "/activate": { "get": { - "description": " [internal route ID: \"get-activate\"]\n\nSee also 'POST /activate' which has a larger feature set.
Calls federation service brig on send-connection-action", + "description": " [internal route ID: \"get-activate\"]\n\nSee also 'POST /activate' which has a larger feature set.", + "operationId": "get-activate", "parameters": [ { "description": "Activation key", @@ -7254,7 +7320,8 @@ "summary": "Activate (i.e. confirm) an email address." }, "post": { - "description": " [internal route ID: \"post-activate\"]\n\nActivation only succeeds once and the number of failed attempts for a valid key is limited.Calls federation service brig on send-connection-action", + "description": " [internal route ID: \"post-activate\"]\n\nActivation only succeeds once and the number of failed attempts for a valid key is limited.", + "operationId": "post-activate", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -7403,6 +7470,7 @@ "/activate/send": { "post": { "description": " [internal route ID: \"post-activate-send\"]\n\n", + "operationId": "post-activate-send", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -7572,6 +7640,7 @@ "/api-version": { "get": { "description": " [internal route ID: \"get-version\"]\n\n", + "operationId": "get-version", "responses": { "200": { "content": { @@ -7588,6 +7657,8 @@ }, "/assets": { "post": { + "description": " [internal route ID: \"assets-upload\"]\n\n", + "operationId": "assets-upload", "requestBody": { "content": { "multipart/mixed": { @@ -7703,7 +7774,8 @@ }, "/assets/{key_domain}/{key}": { "delete": { - "description": "**Note**: only local assets can be deleted.", + "description": " [internal route ID: \"assets-delete\"]\n\n**Note**: only local assets can be deleted.", + "operationId": "assets-delete", "parameters": [ { "in": "path", @@ -7804,7 +7876,8 @@ "summary": "Delete an asset" }, "get": { - "description": "**Note**: local assets result in a redirect, while remote assets are streamed directly.Calls federation service cargohold on stream-asset
Calls federation service cargohold on get-asset", + "description": " [internal route ID: \"assets-download\"]\n\n**Note**: local assets result in a redirect, while remote assets are streamed directly.", + "operationId": "assets-download", "parameters": [ { "in": "path", @@ -7898,7 +7971,8 @@ }, "/assets/{key}/token": { "delete": { - "description": "**Note**: deleting the token makes the asset public.", + "description": " [internal route ID: \"tokens-delete\"]\n\n**Note**: deleting the token makes the asset public.", + "operationId": "tokens-delete", "parameters": [ { "in": "path", @@ -7917,6 +7991,8 @@ "summary": "Delete an asset token" }, "post": { + "description": " [internal route ID: \"tokens-renew\"]\n\n", + "operationId": "tokens-renew", "parameters": [ { "in": "path", @@ -8023,6 +8099,7 @@ "description": "RFC 6455", "url": "https://datatracker.ietf.org/doc/html/rfc6455" }, + "operationId": "await-notifications", "parameters": [ { "description": "Client ID", @@ -8047,6 +8124,8 @@ }, "/bot/assets": { "post": { + "description": " [internal route ID: (\"assets-upload-v3\", bot)]\n\n", + "operationId": "assets-upload-v3_bot", "requestBody": { "content": { "multipart/mixed": { @@ -8162,6 +8241,8 @@ }, "/bot/assets/{key}": { "delete": { + "description": " [internal route ID: (\"assets-delete-v3\", bot)]\n\n", + "operationId": "assets-delete-v3_bot", "parameters": [ { "in": "path", @@ -8254,6 +8335,8 @@ "summary": "Delete an asset" }, "get": { + "description": " [internal route ID: (\"assets-download-v3\", bot)]\n\n", + "operationId": "assets-download-v3_bot", "parameters": [ { "in": "path", @@ -8368,18 +8451,19 @@ }, "/bot/client": { "get": { - "description": " [internal route ID: \"bot-get-client-v6\"]\n\n", + "description": " [internal route ID: \"bot-get-client@v7\"]\n\n", + "operationId": "bot-get-client@v7", "responses": { "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Clientv6" + "$ref": "#/components/schemas/ClientV7" } }, "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/Clientv6" + "$ref": "#/components/schemas/ClientV7" } } }, @@ -8498,6 +8582,7 @@ "/bot/client/prekeys": { "get": { "description": " [internal route ID: \"bot-list-prekeys\"]\n\n", + "operationId": "bot-list-prekeys", "responses": { "200": { "content": { @@ -8556,6 +8641,7 @@ }, "post": { "description": " [internal route ID: \"bot-update-prekeys\"]\n\n", + "operationId": "bot-update-prekeys", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -8651,6 +8737,7 @@ "/bot/conversation": { "get": { "description": " [internal route ID: \"get-bot-conversation\"]\n\n", + "operationId": "get-bot-conversation", "responses": { "200": { "content": { @@ -8742,23 +8829,17 @@ } } }, - "/bot/messages": { + "/bot/conversations/{conv}": { "post": { - "description": " [internal route ID: \"post-bot-message-unqualified\"]\n\nCalls federation service brig on get-user-clients
Calls federation service galley on on-message-sent", + "description": " [internal route ID: \"add-bot\"]\n\n", + "operationId": "add-bot", "parameters": [ { - "in": "query", - "name": "ignore_missing", - "required": false, - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "report_missing", - "required": false, + "in": "path", + "name": "conv", + "required": true, "schema": { + "format": "uuid", "type": "string" } } @@ -8767,7 +8848,7 @@ "content": { "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/new-otr-message" + "$ref": "#/components/schemas/AddBot" } } }, @@ -8778,25 +8859,202 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ClientMismatch" + "$ref": "#/components/schemas/AddBotResponse" } }, "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/ClientMismatch" + "$ref": "#/components/schemas/AddBotResponse" } } }, - "description": "Message sent" + "description": "" }, "403": { "content": { - "application/json": { + "application/json;charset=utf-8": { "schema": { "example": { "code": 403, - "label": "unknown-client", - "message": "Unknown Client" + "label": "service-disabled", + "message": "The desired service is currently disabled." + }, + "properties": { + "code": { + "enum": [ + 403 + ], + "type": "integer" + }, + "label": { + "enum": [ + "service-disabled", + "too-many-members", + "invalid-conversation", + "access-denied" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "The desired service is currently disabled. (label: `service-disabled`)\n\nMaximum number of members per conversation reached. (label: `too-many-members`)\n\nThe operation is not allowed in this conversation. (label: `invalid-conversation`)\n\nAccess denied. (label: `access-denied`)" + } + }, + "summary": "Add bot" + } + }, + "/bot/conversations/{conv}/{bot}": { + "delete": { + "description": " [internal route ID: \"remove-bot\"]\n\n", + "operationId": "remove-bot", + "parameters": [ + { + "in": "path", + "name": "conv", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "in": "path", + "name": "bot", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveBotResponse" + } + }, + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/RemoveBotResponse" + } + } + }, + "description": "User found" + }, + "204": { + "description": "" + }, + "403": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 403, + "label": "invalid-conversation", + "message": "The operation is not allowed in this conversation." + }, + "properties": { + "code": { + "enum": [ + 403 + ], + "type": "integer" + }, + "label": { + "enum": [ + "invalid-conversation", + "access-denied" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "The operation is not allowed in this conversation. (label: `invalid-conversation`)\n\nAccess denied. (label: `access-denied`)" + } + }, + "summary": "Remove bot" + } + }, + "/bot/messages": { + "post": { + "description": " [internal route ID: \"post-bot-message-unqualified\"]\n\n", + "operationId": "post-bot-message-unqualified", + "parameters": [ + { + "in": "query", + "name": "ignore_missing", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "report_missing", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/new-otr-message" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClientMismatch" + } + }, + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/ClientMismatch" + } + } + }, + "description": "Message sent" + }, + "403": { + "content": { + "application/json": { + "schema": { + "example": { + "code": 403, + "label": "unknown-client", + "message": "Unknown Client" }, "properties": { "code": { @@ -8952,6 +9210,7 @@ "/bot/self": { "delete": { "description": " [internal route ID: \"bot-delete-self\"]\n\n", + "operationId": "bot-delete-self", "responses": { "200": { "description": "" @@ -8999,6 +9258,7 @@ }, "get": { "description": " [internal route ID: \"bot-get-self\"]\n\n", + "operationId": "bot-get-self", "responses": { "200": { "content": { @@ -9091,6 +9351,7 @@ "/bot/users": { "get": { "description": " [internal route ID: \"bot-list-users\"]\n\n", + "operationId": "bot-list-users", "parameters": [ { "in": "query", @@ -9159,6 +9420,7 @@ "/bot/users/prekeys": { "post": { "description": " [internal route ID: \"bot-claim-users-prekeys\"]\n\n", + "operationId": "bot-claim-users-prekeys", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -9224,13 +9486,14 @@ "summary": "Claim users prekeys" } }, - "/bot/users/{User ID}/clients": { + "/bot/users/{user}/clients": { "get": { "description": " [internal route ID: \"bot-get-user-clients\"]\n\n", + "operationId": "bot-get-user-clients", "parameters": [ { "in": "path", - "name": "User ID", + "name": "user", "required": true, "schema": { "format": "uuid", @@ -9296,6 +9559,7 @@ "/broadcast/otr/messages": { "post": { "description": " [internal route ID: \"post-otr-broadcast-unqualified\"]\n\nThis endpoint ensures that the list of clients is correct and only sends the message if the list is correct.\nTo override this, the endpoint accepts two query params:\n- `ignore_missing`: Can be 'true' 'false' or a comma separated list of user IDs.\n - When 'true' all missing clients are ignored.\n - When 'false' all missing clients are reported.\n - When comma separated list of user-ids, only clients for listed users are ignored.\n- `report_missing`: Can be 'true' 'false' or a comma separated list of user IDs.\n - When 'true' all missing clients are reported.\n - When 'false' all missing clients are ignored.\n - When comma separated list of user-ids, only clients for listed users are reported.\n\nApart from these, the request body also accepts `report_missing` which can only be a list of user ids and behaves the same way as the query parameter.\n\nAll three of these should be considered mutually exclusive. The server however does not error if more than one is specified, it reads them in this order of precedence:\n- `report_missing` in the request body has highest precedence.\n- `ignore_missing` in the query param is the next.\n- `report_missing` in the query param has the lowest precedence.\n\nThis endpoint can lead to OtrMessageAdd event being sent to the recipients.\n\n**NOTE:** The protobuf definitions of the request body can be found at https://github.com/wireapp/generic-message-proto/blob/master/proto/otr.proto.", + "operationId": "post-otr-broadcast-unqualified", "parameters": [ { "in": "query", @@ -9548,6 +9812,7 @@ "/broadcast/proteus/messages": { "post": { "description": " [internal route ID: \"post-proteus-broadcast\"]\n\nThis endpoint ensures that the list of clients is correct and only sends the message if the list is correct.\nTo override this, the endpoint accepts `client_mismatch_strategy` in the body. It can have these values:\n- `report_all`: When set, the message is not sent if any clients are missing. The missing clients are reported in the response.\n- `ignore_all`: When set, no checks about missing clients are carried out.\n- `report_only`: Takes a list of qualified UserIDs. If any clients of the listed users are missing, the message is not sent. The missing clients are reported in the response.\n- `ignore_only`: Takes a list of qualified UserIDs. If any clients of the non-listed users are missing, the message is not sent. The missing clients are reported in the response.\n\nThe sending of messages in a federated conversation could theoretically fail partially. To make this case unlikely, the backend first gets a list of clients from all the involved backends and then tries to send a message. So, if any backend is down, the message is not propagated to anyone. But the actual message fan out to multiple backends could still fail partially. This type of failure is reported as a 201, the clients for which the message sending failed are part of the response body.\n\nThis endpoint can lead to OtrMessageAdd event being sent to the recipients.\n\n**NOTE:** The protobuf definitions of the request body can be found at https://github.com/wireapp/generic-message-proto/blob/master/proto/otr.proto.", + "operationId": "post-proteus-broadcast", "requestBody": { "content": { "application/x-protobuf": { @@ -9778,6 +10043,7 @@ "get": { "deprecated": true, "description": " [internal route ID: \"get-calls-config\"]\n\n", + "operationId": "get-calls-config", "responses": { "200": { "content": { @@ -9796,6 +10062,7 @@ "/calls/config/v2": { "get": { "description": " [internal route ID: \"get-calls-config-v2\"]\n\n", + "operationId": "get-calls-config-v2", "parameters": [ { "description": "Limit resulting list. Allowed values [1..10]", @@ -9826,18 +10093,19 @@ }, "/clients": { "get": { - "description": " [internal route ID: \"list-clients-v6\"]\n\n", + "description": " [internal route ID: \"list-clients@v7\"]\n\n", + "operationId": "list-clients@v7", "responses": { "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ClientListv6" + "$ref": "#/components/schemas/ClientListV7" } }, "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/ClientListv6" + "$ref": "#/components/schemas/ClientListV7" } } }, @@ -9847,12 +10115,13 @@ "summary": "List the registered clients" }, "post": { - "description": " [internal route ID: \"add-client\"]\n\nCalls federation service brig on send-connection-action", + "description": " [internal route ID: \"add-client@v7\"]\n\n", + "operationId": "add-client@v7", "requestBody": { "content": { "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/NewClient" + "$ref": "#/components/schemas/NewClientV7" } } }, @@ -9863,12 +10132,12 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Client" + "$ref": "#/components/schemas/ClientV7" } }, "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/Client" + "$ref": "#/components/schemas/ClientV7" } } }, @@ -9966,6 +10235,7 @@ "/clients/{cid}/access-token": { "post": { "description": " [internal route ID: \"create-access-token\"]\n\nCreate an JWT DPoP access token for the client CSR, given a JWT DPoP proof, specified in the `DPoP` header. The access token will be returned as JWT DPoP token in the `DPoP` header.", + "operationId": "create-access-token", "parameters": [ { "description": "ClientId", @@ -10015,6 +10285,7 @@ "/clients/{client}": { "delete": { "description": " [internal route ID: \"delete-client\"]\n\n", + "operationId": "delete-client", "parameters": [ { "description": "ClientId", @@ -10044,7 +10315,8 @@ "summary": "Delete an existing client" }, "get": { - "description": " [internal route ID: \"get-client-v6\"]\n\n", + "description": " [internal route ID: \"get-client@v7\"]\n\n", + "operationId": "get-client@v7", "parameters": [ { "description": "ClientId", @@ -10061,12 +10333,12 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Clientv6" + "$ref": "#/components/schemas/ClientV7" } }, "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/Clientv6" + "$ref": "#/components/schemas/ClientV7" } } }, @@ -10079,7 +10351,8 @@ "summary": "Get a registered client by ID" }, "put": { - "description": " [internal route ID: \"update-client\"]\n\n", + "description": " [internal route ID: \"update-client@v7\"]\n\n", + "operationId": "update-client@v7", "parameters": [ { "description": "ClientId", @@ -10095,7 +10368,7 @@ "content": { "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/UpdateClient" + "$ref": "#/components/schemas/UpdateClientV7" } } }, @@ -10148,7 +10421,8 @@ }, "/clients/{client}/capabilities": { "get": { - "description": " [internal route ID: \"get-client-capabilities\"]\n\n", + "description": " [internal route ID: \"get-client-capabilities@v7\"]\n\n", + "operationId": "get-client-capabilities@v7", "parameters": [ { "description": "ClientId", @@ -10163,13 +10437,18 @@ "responses": { "200": { "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClientCapabilityListV7" + } + }, "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/ClientCapabilityList" + "$ref": "#/components/schemas/ClientCapabilityListV7" } } }, - "description": "" + "description": "capabilities" } }, "summary": "Read back what the client has been posting about itself" @@ -10178,6 +10457,7 @@ "/clients/{client}/nonce": { "get": { "description": " [internal route ID: \"get-nonce\"]\n\nGet a new nonce for a client CSR, specified in the response header `Replay-Nonce` as a uuidv4 in base64url encoding.", + "operationId": "get-nonce", "parameters": [ { "description": "ClientId", @@ -10210,6 +10490,7 @@ }, "head": { "description": " [internal route ID: \"head-nonce\"]\n\nGet a new nonce for a client CSR, specified in the response header `Replay-Nonce` as a uuidv4 in base64url encoding.", + "operationId": "head-nonce", "parameters": [ { "description": "ClientId", @@ -10244,6 +10525,7 @@ "/clients/{client}/prekeys": { "get": { "description": " [internal route ID: \"get-client-prekeys\"]\n\n", + "operationId": "get-client-prekeys", "parameters": [ { "description": "ClientId", @@ -10278,6 +10560,7 @@ "/connections/{uid_domain}/{uid}": { "get": { "description": " [internal route ID: \"get-connection\"]\n\n", + "operationId": "get-connection", "parameters": [ { "in": "path", @@ -10321,7 +10604,8 @@ "summary": "Get an existing connection to another user (local or remote)" }, "post": { - "description": " [internal route ID: \"create-connection\"]\n\nYou can have no more than 1000 connections in accepted or sent state
Calls federation service brig on send-connection-action
Calls federation service brig on get-users-by-ids", + "description": " [internal route ID: \"create-connection\"]\n\nYou can have no more than 1000 connections in accepted or sent state", + "operationId": "create-connection", "parameters": [ { "in": "path", @@ -10454,7 +10738,8 @@ "summary": "Create a connection to another user" }, "put": { - "description": " [internal route ID: \"update-connection\"]\n\nCalls federation service brig on send-connection-action
Calls federation service brig on get-users-by-ids", + "description": " [internal route ID: \"update-connection\"]\n\n", + "operationId": "update-connection", "parameters": [ { "in": "path", @@ -10589,7 +10874,8 @@ }, "/conversations": { "post": { - "description": " [internal route ID: \"create-group-conversation\"]\n\nThis returns 201 when a new conversation is created, and 200 when the conversation already existed
Calls federation service galley on on-conversation-updated
Calls federation service galley on on-conversation-created
Calls federation service brig on get-not-fully-connected-backends
Calls federation service brig on api-version", + "description": " [internal route ID: \"create-group-conversation\"]\n\nThis returns 201 when a new conversation is created, and 200 when the conversation already existed", + "operationId": "create-group-conversation", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -10605,12 +10891,12 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ConversationV6v6" + "$ref": "#/components/schemas/ConversationV6" } }, "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/ConversationV6v6" + "$ref": "#/components/schemas/ConversationV6" } } }, @@ -10629,12 +10915,12 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateGroupConversationv6" + "$ref": "#/components/schemas/CreateGroupConversationV6" } }, "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/CreateGroupConversationv6" + "$ref": "#/components/schemas/CreateGroupConversationV6" } } }, @@ -10777,6 +11063,7 @@ "/conversations/code-check": { "post": { "description": " [internal route ID: \"code-check\"]\n\nIf the guest links team feature is disabled, this will fail with 404 CodeNotFound.Note that this is currently inconsistent (for backwards compatibility reasons) with `POST /conversations/join` which responds with 409 GuestLinksDisabled if guest links are disabled.", + "operationId": "code-check", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -10873,6 +11160,7 @@ "/conversations/join": { "get": { "description": " [internal route ID: \"get-conversation-by-reusable-code\"]\n\n", + "operationId": "get-conversation-by-reusable-code", "parameters": [ { "in": "query", @@ -11020,7 +11308,8 @@ "summary": "Get limited conversation information by key/code pair" }, "post": { - "description": " [internal route ID: \"join-conversation-by-code-unqualified\"]\n\nIf the guest links team feature is disabled, this will fail with 409 GuestLinksDisabled.Note that this is currently inconsistent (for backwards compatibility reasons) with `POST /conversations/code-check` which responds with 404 CodeNotFound if guest links are disabled.Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"join-conversation-by-code-unqualified\"]\n\nIf the guest links team feature is disabled, this will fail with 409 GuestLinksDisabled.Note that this is currently inconsistent (for backwards compatibility reasons) with `POST /conversations/code-check` which responds with 404 CodeNotFound if guest links are disabled.", + "operationId": "join-conversation-by-code-unqualified", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -11172,7 +11461,8 @@ }, "/conversations/list": { "post": { - "description": " [internal route ID: \"list-conversations\"]\n\nCalls federation service galley on get-conversations", + "description": " [internal route ID: \"list-conversations\"]\n\n", + "operationId": "list-conversations", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -11191,503 +11481,81 @@ "$ref": "#/components/schemas/ConversationsResponse" } } - }, - "description": "" - } - }, - "summary": "Get conversation metadata for a list of conversation ids" - } - }, - "/conversations/list-ids": { - "post": { - "description": " [internal route ID: \"list-conversation-ids\"]\n\nThe IDs returned by this endpoint are paginated. To get the first page, make a call with the `paging_state` field set to `null` (or omitted). Whenever the `has_more` field of the response is set to `true`, more results are available, and they can be obtained by calling the endpoint again, but this time passing the value of `paging_state` returned by the previous call. One can continue in this fashion until all results are returned, which is indicated by `has_more` being `false`. Note that `paging_state` should be considered an opaque token. It should not be inspected, or stored, or reused across multiple unrelated invocations of the endpoint.", - "requestBody": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/GetPaginated_ConversationIds" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/ConversationIds_Page" - } - } - }, - "description": "" - } - }, - "summary": "Get all conversation IDs." - } - }, - "/conversations/mls-self": { - "get": { - "description": " [internal route ID: \"get-mls-self-conversation\"]\n\n", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Conversation" - } - }, - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/Conversation" - } - } - }, - "description": "The MLS self-conversation" - }, - "400": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "example": { - "code": 400, - "label": "mls-not-enabled", - "message": "MLS is not configured on this backend. See docs.wire.com for instructions on how to enable it" - }, - "properties": { - "code": { - "enum": [ - 400 - ], - "type": "integer" - }, - "label": { - "enum": [ - "mls-not-enabled" - ], - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "label", - "message" - ], - "type": "object" - } - } - }, - "description": "MLS is not configured on this backend. See docs.wire.com for instructions on how to enable it (label: `mls-not-enabled`)" - } - }, - "summary": "Get the user's MLS self-conversation" - } - }, - "/conversations/one2one": { - "post": { - "description": " [internal route ID: \"create-one-to-one-conversation\"]\n\nCalls federation service galley on on-conversation-created", - "requestBody": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/NewConv" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConversationV3v3" - } - }, - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/ConversationV3v3" - } - } - }, - "description": "Conversation existed", - "headers": { - "Location": { - "description": "Conversation ID", - "schema": { - "format": "uuid", - "type": "string" - } - } - } - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConversationV3v3" - } - }, - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/ConversationV3v3" - } - } - }, - "description": "Conversation created", - "headers": { - "Location": { - "description": "Conversation ID", - "schema": { - "format": "uuid", - "type": "string" - } - } - } - }, - "403": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "example": { - "code": 403, - "label": "missing-legalhold-consent", - "message": "Failed to connect to a user or to invite a user to a group because somebody is under legalhold and somebody else has not granted consent" - }, - "properties": { - "code": { - "enum": [ - 403 - ], - "type": "integer" - }, - "label": { - "enum": [ - "missing-legalhold-consent", - "operation-denied", - "not-connected", - "no-team-member", - "non-binding-team-members", - "invalid-op", - "access-denied" - ], - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "label", - "message" - ], - "type": "object" - } - } - }, - "description": "Failed to connect to a user or to invite a user to a group because somebody is under legalhold and somebody else has not granted consent (label: `missing-legalhold-consent`)\n\nInsufficient permissions (label: `operation-denied`)\n\nUsers are not connected (label: `not-connected`)\n\nRequesting user is not a team member (label: `no-team-member`)\n\nBoth users must be members of the same binding team (label: `non-binding-team-members`)\n\nInvalid operation (label: `invalid-op`)\n\nConversation access denied (label: `access-denied`)" - }, - "404": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "example": { - "code": 404, - "label": "no-team", - "message": "Team not found" - }, - "properties": { - "code": { - "enum": [ - 404 - ], - "type": "integer" - }, - "label": { - "enum": [ - "no-team", - "non-binding-team" - ], - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "label", - "message" - ], - "type": "object" - } - } - }, - "description": "Team not found (label: `no-team`)\n\nNot a member of a binding team (label: `non-binding-team`)" - }, - "533": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "properties": { - "unreachable_backends": { - "items": { - "$ref": "#/components/schemas/Domain" - }, - "type": "array" - } - }, - "required": [ - "unreachable_backends" - ], - "type": "object" - } - } - }, - "description": "Some domains are unreachable" - } - }, - "summary": "Create a 1:1 conversation" - } - }, - "/conversations/one2one/{usr_domain}/{usr}": { - "get": { - "description": " [internal route ID: \"get-one-to-one-mls-conversation@v6\"]\n\n", - "parameters": [ - { - "in": "path", - "name": "usr_domain", - "required": true, - "schema": { - "type": "string" - } - }, - { - "in": "path", - "name": "usr", - "required": true, - "schema": { - "format": "uuid", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MLSOne2OneConversation_MLSPublicKey" - } - }, - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/MLSOne2OneConversation_MLSPublicKey" - } - } - }, - "description": "MLS 1-1 conversation" - }, - "400": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "example": { - "code": 400, - "label": "mls-not-enabled", - "message": "MLS is not configured on this backend. See docs.wire.com for instructions on how to enable it" - }, - "properties": { - "code": { - "enum": [ - 400 - ], - "type": "integer" - }, - "label": { - "enum": [ - "mls-not-enabled" - ], - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "label", - "message" - ], - "type": "object" - } - } - }, - "description": "MLS is not configured on this backend. See docs.wire.com for instructions on how to enable it (label: `mls-not-enabled`)" - }, - "403": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "example": { - "code": 403, - "label": "not-connected", - "message": "Users are not connected" - }, - "properties": { - "code": { - "enum": [ - 403 - ], - "type": "integer" - }, - "label": { - "enum": [ - "not-connected" - ], - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "label", - "message" - ], - "type": "object" - } - } - }, - "description": "Users are not connected (label: `not-connected`)" - } - }, - "summary": "Get an MLS 1:1 conversation" - } - }, - "/conversations/self": { - "post": { - "description": " [internal route ID: \"create-self-conversation\"]\n\n", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConversationV6v6" - } - }, - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/ConversationV6v6" - } - } - }, - "description": "Conversation existed", - "headers": { - "Location": { - "description": "Conversation ID", - "schema": { - "format": "uuid", - "type": "string" - } - } - } - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConversationV6v6" - } - }, - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/ConversationV6v6" - } - } - }, - "description": "Conversation created", - "headers": { - "Location": { - "description": "Conversation ID", - "schema": { - "format": "uuid", - "type": "string" - } - } - } + }, + "description": "" } }, - "summary": "Create a self-conversation" + "summary": "Get conversation metadata for a list of conversation ids" } }, - "/conversations/{Conversation ID}/bots": { + "/conversations/list-ids": { "post": { - "description": " [internal route ID: \"add-bot\"]\n\n", - "parameters": [ - { - "in": "path", - "name": "Conversation ID", - "required": true, - "schema": { - "format": "uuid", - "type": "string" - } - } - ], + "description": " [internal route ID: \"list-conversation-ids\"]\n\nThe IDs returned by this endpoint are paginated. To get the first page, make a call with the `paging_state` field set to `null` (or omitted). Whenever the `has_more` field of the response is set to `true`, more results are available, and they can be obtained by calling the endpoint again, but this time passing the value of `paging_state` returned by the previous call. One can continue in this fashion until all results are returned, which is indicated by `has_more` being `false`. Note that `paging_state` should be considered an opaque token. It should not be inspected, or stored, or reused across multiple unrelated invocations of the endpoint.", + "operationId": "list-conversation-ids", "requestBody": { "content": { "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/AddBot" + "$ref": "#/components/schemas/GetPaginated_ConversationIds" } } }, "required": true }, "responses": { - "201": { + "200": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/ConversationIds_Page" + } + } + }, + "description": "" + } + }, + "summary": "Get all conversation IDs." + } + }, + "/conversations/mls-self": { + "get": { + "description": " [internal route ID: \"get-mls-self-conversation\"]\n\n", + "operationId": "get-mls-self-conversation", + "responses": { + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddBotResponse" + "$ref": "#/components/schemas/Conversation" } }, "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/AddBotResponse" + "$ref": "#/components/schemas/Conversation" } } }, - "description": "" + "description": "The MLS self-conversation" }, - "403": { + "400": { "content": { "application/json;charset=utf-8": { "schema": { "example": { - "code": 403, - "label": "service-disabled", - "message": "The desired service is currently disabled." + "code": 400, + "label": "mls-not-enabled", + "message": "MLS is not configured on this backend. See docs.wire.com for instructions on how to enable it" }, "properties": { "code": { "enum": [ - 403 + 400 ], "type": "integer" }, "label": { "enum": [ - "service-disabled", - "too-many-members", - "invalid-conversation", - "access-denied" + "mls-not-enabled" ], "type": "string" }, @@ -11704,99 +11572,73 @@ } } }, - "description": "The desired service is currently disabled. (label: `service-disabled`)\n\nMaximum number of members per conversation reached. (label: `too-many-members`)\n\nThe operation is not allowed in this conversation. (label: `invalid-conversation`)\n\nAccess denied. (label: `access-denied`)" + "description": "MLS is not configured on this backend. See docs.wire.com for instructions on how to enable it (label: `mls-not-enabled`)" } }, - "summary": "Add bot" + "summary": "Get the user's MLS self-conversation" } }, - "/conversations/{Conversation ID}/bots/{Bot ID}": { - "delete": { - "description": " [internal route ID: \"remove-bot\"]\n\n", - "parameters": [ - { - "in": "path", - "name": "Conversation ID", - "required": true, - "schema": { - "format": "uuid", - "type": "string" - } - }, - { - "in": "path", - "name": "Bot ID", - "required": true, - "schema": { - "format": "uuid", - "type": "string" - } - } - ], + "/conversations/self": { + "post": { + "description": " [internal route ID: \"create-self-conversation\"]\n\n", + "operationId": "create-self-conversation", "responses": { "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RemoveBotResponse" + "$ref": "#/components/schemas/ConversationV6" } }, "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/RemoveBotResponse" + "$ref": "#/components/schemas/ConversationV6" } } }, - "description": "User found" - }, - "204": { - "description": "" + "description": "Conversation existed", + "headers": { + "Location": { + "description": "Conversation ID", + "schema": { + "format": "uuid", + "type": "string" + } + } + } }, - "403": { + "201": { "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConversationV6" + } + }, "application/json;charset=utf-8": { "schema": { - "example": { - "code": 403, - "label": "invalid-conversation", - "message": "The operation is not allowed in this conversation." - }, - "properties": { - "code": { - "enum": [ - 403 - ], - "type": "integer" - }, - "label": { - "enum": [ - "invalid-conversation", - "access-denied" - ], - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "label", - "message" - ], - "type": "object" + "$ref": "#/components/schemas/ConversationV6" } } }, - "description": "The operation is not allowed in this conversation. (label: `invalid-conversation`)\n\nAccess denied. (label: `access-denied`)" + "description": "Conversation created", + "headers": { + "Location": { + "description": "Conversation ID", + "schema": { + "format": "uuid", + "type": "string" + } + } + } } }, - "summary": "Remove bot" + "summary": "Create a self-conversation" } }, "/conversations/{cnv_domain}/{cnv}": { "get": { - "description": " [internal route ID: \"get-conversation\"]\n\nCalls federation service galley on get-conversations", + "description": " [internal route ID: \"get-conversation\"]\n\n", + "operationId": "get-conversation", "parameters": [ { "in": "path", @@ -11907,7 +11749,8 @@ }, "/conversations/{cnv_domain}/{cnv}/access": { "put": { - "description": " [internal route ID: \"update-conversation-access\"]\n\nCalls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"update-conversation-access\"]\n\n", + "operationId": "update-conversation-access", "parameters": [ { "in": "path", @@ -12039,7 +11882,8 @@ }, "/conversations/{cnv_domain}/{cnv}/groupinfo": { "get": { - "description": " [internal route ID: \"get-group-info\"]\n\nCalls federation service galley on query-group-info", + "description": " [internal route ID: \"get-group-info\"]\n\n", + "operationId": "get-group-info", "parameters": [ { "in": "path", @@ -12151,7 +11995,8 @@ }, "/conversations/{cnv_domain}/{cnv}/members": { "post": { - "description": " [internal route ID: \"add-members-to-conversation\"]\n\nCalls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"add-members-to-conversation\"]\n\n", + "operationId": "add-members-to-conversation", "parameters": [ { "in": "path", @@ -12328,7 +12173,8 @@ }, "/conversations/{cnv_domain}/{cnv}/members/{usr_domain}/{usr}": { "delete": { - "description": " [internal route ID: \"remove-member\"]\n\nCalls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated
Calls federation service galley on leave-conversation", + "description": " [internal route ID: \"remove-member\"]\n\n", + "operationId": "remove-member", "parameters": [ { "in": "path", @@ -12465,7 +12311,8 @@ "summary": "Remove a member from a conversation" }, "put": { - "description": " [internal route ID: \"update-other-member\"]\n\n**Note**: at least one field has to be provided.Calls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"update-other-member\"]\n\n**Note**: at least one field has to be provided.", + "operationId": "update-other-member", "parameters": [ { "in": "path", @@ -12600,7 +12447,8 @@ }, "/conversations/{cnv_domain}/{cnv}/message-timer": { "put": { - "description": " [internal route ID: \"update-conversation-message-timer\"]\n\nCalls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"update-conversation-message-timer\"]\n\n", + "operationId": "update-conversation-message-timer", "parameters": [ { "in": "path", @@ -12732,7 +12580,8 @@ }, "/conversations/{cnv_domain}/{cnv}/name": { "put": { - "description": " [internal route ID: \"update-conversation-name\"]\n\nCalls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"update-conversation-name\"]\n\n", + "operationId": "update-conversation-name", "parameters": [ { "in": "path", @@ -12863,7 +12712,8 @@ }, "/conversations/{cnv_domain}/{cnv}/proteus/messages": { "post": { - "description": " [internal route ID: \"post-proteus-message\"]\n\nThis endpoint ensures that the list of clients is correct and only sends the message if the list is correct.\nTo override this, the endpoint accepts `client_mismatch_strategy` in the body. It can have these values:\n- `report_all`: When set, the message is not sent if any clients are missing. The missing clients are reported in the response.\n- `ignore_all`: When set, no checks about missing clients are carried out.\n- `report_only`: Takes a list of qualified UserIDs. If any clients of the listed users are missing, the message is not sent. The missing clients are reported in the response.\n- `ignore_only`: Takes a list of qualified UserIDs. If any clients of the non-listed users are missing, the message is not sent. The missing clients are reported in the response.\n\nThe sending of messages in a federated conversation could theoretically fail partially. To make this case unlikely, the backend first gets a list of clients from all the involved backends and then tries to send a message. So, if any backend is down, the message is not propagated to anyone. But the actual message fan out to multiple backends could still fail partially. This type of failure is reported as a 201, the clients for which the message sending failed are part of the response body.\n\nThis endpoint can lead to OtrMessageAdd event being sent to the recipients.\n\n**NOTE:** The protobuf definitions of the request body can be found at https://github.com/wireapp/generic-message-proto/blob/master/proto/otr.proto.Calls federation service galley on send-message
Calls federation service galley on on-message-sent
Calls federation service brig on get-user-clients", + "description": " [internal route ID: \"post-proteus-message\"]\n\nThis endpoint ensures that the list of clients is correct and only sends the message if the list is correct.\nTo override this, the endpoint accepts `client_mismatch_strategy` in the body. It can have these values:\n- `report_all`: When set, the message is not sent if any clients are missing. The missing clients are reported in the response.\n- `ignore_all`: When set, no checks about missing clients are carried out.\n- `report_only`: Takes a list of qualified UserIDs. If any clients of the listed users are missing, the message is not sent. The missing clients are reported in the response.\n- `ignore_only`: Takes a list of qualified UserIDs. If any clients of the non-listed users are missing, the message is not sent. The missing clients are reported in the response.\n\nThe sending of messages in a federated conversation could theoretically fail partially. To make this case unlikely, the backend first gets a list of clients from all the involved backends and then tries to send a message. So, if any backend is down, the message is not propagated to anyone. But the actual message fan out to multiple backends could still fail partially. This type of failure is reported as a 201, the clients for which the message sending failed are part of the response body.\n\nThis endpoint can lead to OtrMessageAdd event being sent to the recipients.\n\n**NOTE:** The protobuf definitions of the request body can be found at https://github.com/wireapp/generic-message-proto/blob/master/proto/otr.proto.", + "operationId": "post-proteus-message", "parameters": [ { "in": "path", @@ -13073,6 +12923,7 @@ "/conversations/{cnv_domain}/{cnv}/protocol": { "put": { "description": " [internal route ID: \"update-conversation-protocol\"]\n\n**Note**: Only proteus->mixed upgrade is supported.", + "operationId": "update-conversation-protocol", "parameters": [ { "in": "path", @@ -13244,7 +13095,8 @@ }, "/conversations/{cnv_domain}/{cnv}/receipt-mode": { "put": { - "description": " [internal route ID: \"update-conversation-receipt-mode\"]\n\nCalls federation service brig on get-users-by-ids
Calls federation service galley on update-conversation
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"update-conversation-receipt-mode\"]\n\n", + "operationId": "update-conversation-receipt-mode", "parameters": [ { "in": "path", @@ -13377,6 +13229,7 @@ "/conversations/{cnv_domain}/{cnv}/self": { "put": { "description": " [internal route ID: \"update-conversation-self\"]\n\n**Note**: at least one field has to be provided.", + "operationId": "update-conversation-self", "parameters": [ { "in": "path", @@ -13454,7 +13307,8 @@ }, "/conversations/{cnv_domain}/{cnv}/subconversations/{subconv}": { "delete": { - "description": " [internal route ID: \"delete-subconversation\"]\n\nCalls federation service galley on delete-sub-conversation", + "description": " [internal route ID: \"delete-subconversation\"]\n\n", + "operationId": "delete-subconversation", "parameters": [ { "in": "path", @@ -13666,7 +13520,8 @@ "summary": "Delete an MLS subconversation" }, "get": { - "description": " [internal route ID: \"get-subconversation\"]\n\nCalls federation service galley on get-sub-conversation", + "description": " [internal route ID: \"get-subconversation\"]\n\n", + "operationId": "get-subconversation", "parameters": [ { "in": "path", @@ -13791,7 +13646,8 @@ }, "/conversations/{cnv_domain}/{cnv}/subconversations/{subconv}/groupinfo": { "get": { - "description": " [internal route ID: \"get-subconversation-group-info\"]\n\nCalls federation service galley on query-group-info", + "description": " [internal route ID: \"get-subconversation-group-info\"]\n\n", + "operationId": "get-subconversation-group-info", "parameters": [ { "in": "path", @@ -13911,7 +13767,8 @@ }, "/conversations/{cnv_domain}/{cnv}/subconversations/{subconv}/self": { "delete": { - "description": " [internal route ID: \"leave-subconversation\"]\n\nCalls federation service galley on leave-sub-conversation
Calls federation service galley on on-mls-message-sent", + "description": " [internal route ID: \"leave-subconversation\"]\n\n", + "operationId": "leave-subconversation", "parameters": [ { "in": "path", @@ -14098,7 +13955,8 @@ }, "/conversations/{cnv_domain}/{cnv}/typing": { "post": { - "description": " [internal route ID: \"member-typing-qualified\"]\n\nCalls federation service galley on on-typing-indicator-updated
Calls federation service galley on update-typing-indicator", + "description": " [internal route ID: \"member-typing-qualified\"]\n\n", + "operationId": "member-typing-qualified", "parameters": [ { "in": "path", @@ -14177,7 +14035,8 @@ "/conversations/{cnv}": { "put": { "deprecated": true, - "description": " [internal route ID: \"update-conversation-name-deprecated\"]\n\nUse `/conversations/:domain/:conv/name` instead.Calls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"update-conversation-name-deprecated\"]\n\nUse `/conversations/:domain/:conv/name` instead.", + "operationId": "update-conversation-name-deprecated", "parameters": [ { "description": "Conversation ID", @@ -14301,6 +14160,7 @@ "/conversations/{cnv}/code": { "delete": { "description": " [internal route ID: \"remove-code-unqualified\"]\n\n", + "operationId": "remove-code-unqualified", "parameters": [ { "description": "Conversation ID", @@ -14408,6 +14268,7 @@ }, "get": { "description": " [internal route ID: \"get-code\"]\n\n", + "operationId": "get-code", "parameters": [ { "description": "Conversation ID", @@ -14553,6 +14414,7 @@ }, "post": { "description": " [internal route ID: \"create-conversation-code-unqualified\"]\n\n\nOAuth scope: `write:conversations_code`", + "operationId": "create-conversation-code-unqualified", "parameters": [ { "description": "Conversation ID", @@ -14719,117 +14581,13 @@ "description": "Conversation code already exists with a different password setting than the requested one. (label: `create-conv-code-conflict`)\n\nThe guest link feature is disabled and all guest links have been revoked (label: `guest-links-disabled`)" } }, - "summary": "Create or recreate a conversation code" - } - }, - "/conversations/{cnv}/features/conversationGuestLinks": { - "get": { - "description": " [internal route ID: \"get-conversation-guest-links-status\"]\n\n", - "parameters": [ - { - "description": "Conversation ID", - "in": "path", - "name": "cnv", - "required": true, - "schema": { - "format": "uuid", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/GuestLinksConfig.LockableFeature" - } - } - }, - "description": "" - }, - "403": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "example": { - "code": 403, - "label": "access-denied", - "message": "Conversation access denied" - }, - "properties": { - "code": { - "enum": [ - 403 - ], - "type": "integer" - }, - "label": { - "enum": [ - "access-denied" - ], - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "label", - "message" - ], - "type": "object" - } - } - }, - "description": "Conversation access denied (label: `access-denied`)" - }, - "404": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "example": { - "code": 404, - "label": "no-conversation", - "message": "Conversation not found" - }, - "properties": { - "code": { - "enum": [ - 404 - ], - "type": "integer" - }, - "label": { - "enum": [ - "no-conversation" - ], - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "label", - "message" - ], - "type": "object" - } - } - }, - "description": "`cnv` not found\n\nConversation not found (label: `no-conversation`)" - } - }, - "summary": "Get the status of the guest links feature for a conversation that potentially has been created by someone from another team." + "summary": "Create or recreate a conversation code" } }, - "/conversations/{cnv}/members/{usr}": { - "put": { - "deprecated": true, - "description": " [internal route ID: \"update-other-member-unqualified\"]\n\nUse `PUT /conversations/:cnv_domain/:cnv/members/:usr_domain/:usr` insteadCalls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "/conversations/{cnv}/features/conversationGuestLinks": { + "get": { + "description": " [internal route ID: \"get-conversation-guest-links-status\"]\n\n", + "operationId": "get-conversation-guest-links-status", "parameters": [ { "description": "Conversation ID", @@ -14840,31 +14598,18 @@ "format": "uuid", "type": "string" } - }, - { - "description": "Target User ID", - "in": "path", - "name": "usr", - "required": true, - "schema": { - "format": "uuid", - "type": "string" - } } ], - "requestBody": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/OtherMemberUpdate" - } - } - }, - "required": true - }, "responses": { "200": { - "description": "Membership updated" + "content": { + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/GuestLinksConfig.LockableFeature" + } + } + }, + "description": "" }, "403": { "content": { @@ -14872,8 +14617,8 @@ "schema": { "example": { "code": 403, - "label": "invalid-op", - "message": "Invalid operation" + "label": "access-denied", + "message": "Conversation access denied" }, "properties": { "code": { @@ -14884,8 +14629,7 @@ }, "label": { "enum": [ - "invalid-op", - "action-denied" + "access-denied" ], "type": "string" }, @@ -14902,7 +14646,7 @@ } } }, - "description": "Invalid operation (label: `invalid-op`)\n\nInvalid target (label: `invalid-op`)\n\nInsufficient authorization (missing modify_other_conversation_member) (label: `action-denied`)" + "description": "Conversation access denied (label: `access-denied`)" }, "404": { "content": { @@ -14910,8 +14654,8 @@ "schema": { "example": { "code": 404, - "label": "no-conversation-member", - "message": "Conversation member not found" + "label": "no-conversation", + "message": "Conversation not found" }, "properties": { "code": { @@ -14922,7 +14666,6 @@ }, "label": { "enum": [ - "no-conversation-member", "no-conversation" ], "type": "string" @@ -14940,16 +14683,17 @@ } } }, - "description": "`cnv` or `usr` not found\n\nConversation member not found (label: `no-conversation-member`)\n\nConversation not found (label: `no-conversation`)" + "description": "`cnv` not found\n\nConversation not found (label: `no-conversation`)" } }, - "summary": "Update membership of the specified user (deprecated)" + "summary": "Get the status of the guest links feature for a conversation that potentially has been created by someone from another team." } }, "/conversations/{cnv}/message-timer": { "put": { "deprecated": true, - "description": " [internal route ID: \"update-conversation-message-timer-unqualified\"]\n\nUse `/conversations/:domain/:cnv/message-timer` instead.Calls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"update-conversation-message-timer-unqualified\"]\n\nUse `/conversations/:domain/:cnv/message-timer` instead.", + "operationId": "update-conversation-message-timer-unqualified", "parameters": [ { "description": "Conversation ID", @@ -15074,7 +14818,8 @@ "/conversations/{cnv}/name": { "put": { "deprecated": true, - "description": " [internal route ID: \"update-conversation-name-unqualified\"]\n\nUse `/conversations/:domain/:conv/name` instead.Calls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"update-conversation-name-unqualified\"]\n\nUse `/conversations/:domain/:conv/name` instead.", + "operationId": "update-conversation-name-unqualified", "parameters": [ { "description": "Conversation ID", @@ -15197,7 +14942,8 @@ }, "/conversations/{cnv}/otr/messages": { "post": { - "description": " [internal route ID: \"post-otr-message-unqualified\"]\n\nThis endpoint ensures that the list of clients is correct and only sends the message if the list is correct.\nTo override this, the endpoint accepts two query params:\n- `ignore_missing`: Can be 'true' 'false' or a comma separated list of user IDs.\n - When 'true' all missing clients are ignored.\n - When 'false' all missing clients are reported.\n - When comma separated list of user-ids, only clients for listed users are ignored.\n- `report_missing`: Can be 'true' 'false' or a comma separated list of user IDs.\n - When 'true' all missing clients are reported.\n - When 'false' all missing clients are ignored.\n - When comma separated list of user-ids, only clients for listed users are reported.\n\nApart from these, the request body also accepts `report_missing` which can only be a list of user ids and behaves the same way as the query parameter.\n\nAll three of these should be considered mutually exclusive. The server however does not error if more than one is specified, it reads them in this order of precedence:\n- `report_missing` in the request body has highest precedence.\n- `ignore_missing` in the query param is the next.\n- `report_missing` in the query param has the lowest precedence.\n\nThis endpoint can lead to OtrMessageAdd event being sent to the recipients.\n\n**NOTE:** The protobuf definitions of the request body can be found at https://github.com/wireapp/generic-message-proto/blob/master/proto/otr.proto.Calls federation service brig on get-user-clients
Calls federation service galley on on-message-sent", + "description": " [internal route ID: \"post-otr-message-unqualified\"]\n\nThis endpoint ensures that the list of clients is correct and only sends the message if the list is correct.\nTo override this, the endpoint accepts two query params:\n- `ignore_missing`: Can be 'true' 'false' or a comma separated list of user IDs.\n - When 'true' all missing clients are ignored.\n - When 'false' all missing clients are reported.\n - When comma separated list of user-ids, only clients for listed users are ignored.\n- `report_missing`: Can be 'true' 'false' or a comma separated list of user IDs.\n - When 'true' all missing clients are reported.\n - When 'false' all missing clients are ignored.\n - When comma separated list of user-ids, only clients for listed users are reported.\n\nApart from these, the request body also accepts `report_missing` which can only be a list of user ids and behaves the same way as the query parameter.\n\nAll three of these should be considered mutually exclusive. The server however does not error if more than one is specified, it reads them in this order of precedence:\n- `report_missing` in the request body has highest precedence.\n- `ignore_missing` in the query param is the next.\n- `report_missing` in the query param has the lowest precedence.\n\nThis endpoint can lead to OtrMessageAdd event being sent to the recipients.\n\n**NOTE:** The protobuf definitions of the request body can be found at https://github.com/wireapp/generic-message-proto/blob/master/proto/otr.proto.", + "operationId": "post-otr-message-unqualified", "parameters": [ { "in": "path", @@ -15420,7 +15166,8 @@ "/conversations/{cnv}/receipt-mode": { "put": { "deprecated": true, - "description": " [internal route ID: \"update-conversation-receipt-mode-unqualified\"]\n\nUse `PUT /conversations/:domain/:cnv/receipt-mode` instead.Calls federation service brig on get-users-by-ids
Calls federation service galley on update-conversation
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"update-conversation-receipt-mode-unqualified\"]\n\nUse `PUT /conversations/:domain/:cnv/receipt-mode` instead.", + "operationId": "update-conversation-receipt-mode-unqualified", "parameters": [ { "description": "Conversation ID", @@ -15545,6 +15292,7 @@ "/conversations/{cnv}/roles": { "get": { "description": " [internal route ID: \"get-conversation-roles\"]\n\n", + "operationId": "get-conversation-roles", "parameters": [ { "in": "path", @@ -15649,6 +15397,7 @@ "get": { "deprecated": true, "description": " [internal route ID: \"get-conversation-self-unqualified\"]\n\n", + "operationId": "get-conversation-self-unqualified", "parameters": [ { "description": "Conversation ID", @@ -15678,6 +15427,7 @@ "put": { "deprecated": true, "description": " [internal route ID: \"update-conversation-self-unqualified\"]\n\nUse `/conversations/:domain/:conv/self` instead.", + "operationId": "update-conversation-self-unqualified", "parameters": [ { "description": "Conversation ID", @@ -15748,6 +15498,7 @@ "/cookies": { "get": { "description": " [internal route ID: \"list-cookies\"]\n\n", + "operationId": "list-cookies", "parameters": [ { "description": "Filter by label (comma-separated list)", @@ -15782,6 +15533,7 @@ "/cookies/remove": { "post": { "description": " [internal route ID: \"remove-cookies\"]\n\n", + "operationId": "remove-cookies", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -15840,6 +15592,7 @@ "/custom-backend/by-domain/{domain}": { "get": { "description": " [internal route ID: \"get-custom-backend-by-domain\"]\n\n", + "operationId": "get-custom-backend-by-domain", "parameters": [ { "description": "URL-encoded email domain", @@ -15905,7 +15658,8 @@ }, "/delete": { "post": { - "description": " [internal route ID: \"verify-delete\"]\n\nCalls federation service brig on send-connection-action", + "description": " [internal route ID: \"verify-delete\"]\n\n", + "operationId": "verify-delete", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -15961,9 +15715,40 @@ "summary": "Verify account deletion with a code." } }, + "/events": { + "get": { + "description": " [internal route ID: \"consume-events\"]\n\nThis is the rabbitMQ-based variant of \"await-notifications\"", + "externalDocs": { + "description": "RFC 6455", + "url": "https://datatracker.ietf.org/doc/html/rfc6455" + }, + "operationId": "consume-events", + "parameters": [ + { + "description": "Client ID", + "in": "query", + "name": "client", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "101": { + "description": "Connection upgraded." + }, + "426": { + "description": "Upgrade required." + } + }, + "summary": "Consume events over a websocket connection" + } + }, "/feature-configs": { "get": { "description": " [internal route ID: \"get-all-feature-configs-for-user\"]\n\nGets feature configs for a user. If the user is a member of a team and has the required permissions, this will return the team's feature configs.If the user is not a member of a team, this will return the personal feature configs (the server defaults).\nOAuth scope: `read:feature_configs`", + "operationId": "get-all-feature-configs-for-user", "responses": { "200": { "content": { @@ -16054,8 +15839,164 @@ "summary": "Gets feature configs for a user" } }, + "/handles": { + "post": { + "description": " [internal route ID: \"check-user-handles\"]\n\n", + "operationId": "check-user-handles", + "requestBody": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/CheckHandles" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Handle" + }, + "type": "array" + } + }, + "application/json;charset=utf-8": { + "schema": { + "items": { + "$ref": "#/components/schemas/Handle" + }, + "type": "array" + } + } + }, + "description": "List of free handles" + } + }, + "summary": "Check availability of user handles" + } + }, + "/handles/{handle}": { + "head": { + "description": " [internal route ID: \"check-user-handle\"]\n\n", + "operationId": "check-user-handle", + "parameters": [ + { + "in": "path", + "name": "handle", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "example": [], + "items": {}, + "maxItems": 0, + "type": "array" + } + }, + "application/json;charset=utf-8": { + "schema": { + "example": [], + "items": {}, + "maxItems": 0, + "type": "array" + } + } + }, + "description": "Handle is taken" + }, + "400": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 400, + "label": "invalid-handle", + "message": "The given handle is invalid (less than 2 or more than 256 characters; chars not in \"a-z0-9_.-\"; or on the blocklist)" + }, + "properties": { + "code": { + "enum": [ + 400 + ], + "type": "integer" + }, + "label": { + "enum": [ + "invalid-handle" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "The given handle is invalid (less than 2 or more than 256 characters; chars not in \"a-z0-9_.-\"; or on the blocklist) (label: `invalid-handle`)" + }, + "404": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 404, + "label": "not-found", + "message": "Handle not found" + }, + "properties": { + "code": { + "enum": [ + 404 + ], + "type": "integer" + }, + "label": { + "enum": [ + "not-found" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "`handle` not found\n\nHandle not found (label: `not-found`)" + } + }, + "summary": "Check whether a user handle can be taken" + } + }, "/identity-providers": { "get": { + "description": " [internal route ID: \"idp-get-all\"]\n\n", + "operationId": "idp-get-all", "responses": { "200": { "content": { @@ -16070,6 +16011,8 @@ } }, "post": { + "description": " [internal route ID: \"idp-create\"]\n\n", + "operationId": "idp-create", "parameters": [ { "in": "query", @@ -16098,8 +16041,8 @@ "name": "handle", "required": false, "schema": { - "maxLength": 1, - "minLength": 32, + "maxLength": 32, + "minLength": 1, "type": "string" } } @@ -16135,6 +16078,8 @@ }, "/identity-providers/{id}": { "delete": { + "description": " [internal route ID: \"idp-delete\"]\n\n", + "operationId": "idp-delete", "parameters": [ { "in": "path", @@ -16161,6 +16106,8 @@ } }, "get": { + "description": " [internal route ID: \"idp-get\"]\n\n", + "operationId": "idp-get", "parameters": [ { "in": "path", @@ -16186,6 +16133,8 @@ } }, "put": { + "description": " [internal route ID: \"idp-update\"]\n\n", + "operationId": "idp-update", "parameters": [ { "in": "path", @@ -16201,8 +16150,8 @@ "name": "handle", "required": false, "schema": { - "maxLength": 1, - "minLength": 32, + "maxLength": 32, + "minLength": 1, "type": "string" } } @@ -16238,6 +16187,8 @@ }, "/identity-providers/{id}/raw": { "get": { + "description": " [internal route ID: \"idp-get-raw\"]\n\n", + "operationId": "idp-get-raw", "parameters": [ { "in": "path", @@ -16266,6 +16217,7 @@ "/list-connections": { "post": { "description": " [internal route ID: \"list-connections\"]\n\nThe IDs returned by this endpoint are paginated. To get the first page, make a call with the `paging_state` field set to `null` (or omitted). Whenever the `has_more` field of the response is set to `true`, more results are available, and they can be obtained by calling the endpoint again, but this time passing the value of `paging_state` returned by the previous call. One can continue in this fashion until all results are returned, which is indicated by `has_more` being `false`. Note that `paging_state` should be considered an opaque token. It should not be inspected, or stored, or reused across multiple unrelated invocations of the endpoint.", + "operationId": "list-connections", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -16293,7 +16245,8 @@ }, "/list-users": { "post": { - "description": " [internal route ID: \"list-users-by-ids-or-handles\"]\n\nThe 'qualified_ids' and 'qualified_handles' parameters are mutually exclusive.Calls federation service brig on get-users-by-ids", + "description": " [internal route ID: \"list-users-by-ids-or-handles\"]\n\nThe 'qualified_ids' and 'qualified_handles' parameters are mutually exclusive.", + "operationId": "list-users-by-ids-or-handles", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -16321,7 +16274,8 @@ }, "/login": { "post": { - "description": " [internal route ID: \"login\"]\n\nLogins are throttled at the server's discretionCalls federation service brig on send-connection-action", + "description": " [internal route ID: \"login\"]\n\nLogins are throttled at the server's discretion", + "operationId": "login", "parameters": [ { "description": "Request a persistent cookie instead of a session cookie", @@ -16413,7 +16367,8 @@ }, "/mls/commit-bundles": { "post": { - "description": " [internal route ID: \"mls-commit-bundle\"]\n\n\n\n**Note**: this endpoint can execute proposals, and therefore return all possible errors associated with adding or removing members to a conversation, in addition to the ones listed below. See the documentation of [POST /conversations/{cnv}/members/v2](#/default/post_conversations__cnv__members_v2) and [POST /conversations/{cnv_domain}/{cnv}/members/{usr_domain}/{usr}](#/default/delete_conversations__cnv_domain___cnv__members__usr_domain___usr_) for more details on the possible error responses of each type of proposal.
Calls federation service brig on api-version
Calls federation service brig on get-users-by-ids
Calls federation service brig on get-mls-clients
Calls federation service galley on on-conversation-updated
Calls federation service galley on send-mls-commit-bundle
Calls federation service galley on mls-welcome
Calls federation service galley on on-mls-message-sent", + "description": " [internal route ID: \"mls-commit-bundle\"]\n\n\n\n**Note**: this endpoint can execute proposals, and therefore return all possible errors associated with adding or removing members to a conversation, in addition to the ones listed below. See the documentation of [POST /conversations/{cnv}/members/v2](#/default/post_conversations__cnv__members_v2) and [POST /conversations/{cnv_domain}/{cnv}/members/{usr_domain}/{usr}](#/default/delete_conversations__cnv_domain___cnv__members__usr_domain___usr_) for more details on the possible error responses of each type of proposal.", + "operationId": "mls-commit-bundle", "requestBody": { "content": { "message/mls": { @@ -16582,7 +16537,7 @@ } } }, - "description": "Adding members to the conversation is not possible because the backends involved do not form a fully connected graph\n\nThe conversation epoch in a message is too old (label: `mls-stale-message`)\n\nA proposal of type Add or Remove does not apply to the full list of clients for a user (label: `mls-client-mismatch`)" + "description": "Adding members to the conversation is not possible because the backends involved do not form a fully connected graph\n\nA user who is under legal-hold may not participate in MLS conversations (label: `mls-legal-hold-not-allowed`)\n\nThe conversation epoch in a message is too old (label: `mls-stale-message`)\n\nA proposal of type Add or Remove does not apply to the full list of clients for a user (label: `mls-client-mismatch`)" }, "422": { "content": { @@ -16650,6 +16605,7 @@ "/mls/key-packages/claim/{user_domain}/{user}": { "post": { "description": " [internal route ID: \"mls-key-packages-claim\"]\n\nOnly key packages for the specified ciphersuite are claimed. For backwards compatibility, the `ciphersuite` parameter is optional, defaulting to ciphersuite 0x0001 when omitted.", + "operationId": "mls-key-packages-claim", "parameters": [ { "in": "path", @@ -16702,6 +16658,7 @@ "/mls/key-packages/self/{client}": { "delete": { "description": " [internal route ID: \"mls-key-packages-delete\"]\n\n", + "operationId": "mls-key-packages-delete", "parameters": [ { "description": "ClientId", @@ -16741,6 +16698,7 @@ }, "post": { "description": " [internal route ID: \"mls-key-packages-upload\"]\n\nThe request body should be a json object containing a list of base64-encoded key packages.", + "operationId": "mls-key-packages-upload", "parameters": [ { "description": "ClientId", @@ -16845,6 +16803,7 @@ }, "put": { "description": " [internal route ID: \"mls-key-packages-replace\"]\n\nThe request body should be a json object containing a list of base64-encoded key packages. Use this sparingly.", + "operationId": "mls-key-packages-replace", "parameters": [ { "description": "ClientId", @@ -16960,6 +16919,7 @@ "/mls/key-packages/self/{client}/count": { "get": { "description": " [internal route ID: \"mls-key-packages-count\"]\n\n", + "operationId": "mls-key-packages-count", "parameters": [ { "description": "ClientId", @@ -17002,7 +16962,8 @@ }, "/mls/messages": { "post": { - "description": " [internal route ID: \"mls-message\"]\n\n\n\n**Note**: this endpoint can execute proposals, and therefore return all possible errors associated with adding or removing members to a conversation, in addition to the ones listed below. See the documentation of [POST /conversations/{cnv}/members/v2](#/default/post_conversations__cnv__members_v2) and [POST /conversations/{cnv_domain}/{cnv}/members/{usr_domain}/{usr}](#/default/delete_conversations__cnv_domain___cnv__members__usr_domain___usr_) for more details on the possible error responses of each type of proposal.
Calls federation service brig on get-mls-clients
Calls federation service galley on on-conversation-updated
Calls federation service galley on send-mls-message
Calls federation service galley on on-mls-message-sent", + "description": " [internal route ID: \"mls-message\"]\n\n\n\n**Note**: this endpoint can execute proposals, and therefore return all possible errors associated with adding or removing members to a conversation, in addition to the ones listed below. See the documentation of [POST /conversations/{cnv}/members/v2](#/default/post_conversations__cnv__members_v2) and [POST /conversations/{cnv_domain}/{cnv}/members/{usr_domain}/{usr}](#/default/delete_conversations__cnv_domain___cnv__members__usr_domain___usr_) for more details on the possible error responses of each type of proposal.", + "operationId": "mls-message", "requestBody": { "content": { "message/mls": { @@ -17238,6 +17199,7 @@ "/mls/public-keys": { "get": { "description": " [internal route ID: \"mls-public-keys\"]\n\nThe format of the returned key is determined by the `format` query parameter:\n - raw (default): base64-encoded raw public keys\n - jwk: keys are nested objects in JWK format.", + "operationId": "mls-public-keys", "parameters": [ { "in": "query", @@ -17312,6 +17274,7 @@ "/notifications": { "get": { "description": " [internal route ID: \"get-notifications\"]\n\n", + "operationId": "get-notifications", "parameters": [ { "description": "Only return notifications more recent than this", @@ -17437,6 +17400,7 @@ "/notifications/last": { "get": { "description": " [internal route ID: \"get-last-notification\"]\n\n", + "operationId": "get-last-notification", "parameters": [ { "description": "Only return notifications targeted at the given client", @@ -17540,6 +17504,7 @@ "/notifications/{id}": { "get": { "description": " [internal route ID: \"get-notification-by-id\"]\n\n", + "operationId": "get-notification-by-id", "parameters": [ { "description": "Notification ID", @@ -17653,6 +17618,7 @@ "/oauth/applications": { "get": { "description": " [internal route ID: \"get-oauth-applications\"]\n\nGet all OAuth applications with active account access for a user.", + "operationId": "get-oauth-applications", "responses": { "200": { "content": { @@ -17679,9 +17645,10 @@ "summary": "Get OAuth applications with account access" } }, - "/oauth/applications/{OAuthClientId}": { + "/oauth/applications/{OAuthClientId}/sessions": { "delete": { - "description": " [internal route ID: \"revoke-oauth-account-access-v6\"]\n\n", + "description": " [internal route ID: \"revoke-oauth-account-access\"]\n\n", + "operationId": "revoke-oauth-account-access", "parameters": [ { "description": "The ID of the OAuth client", @@ -17694,9 +17661,56 @@ } } ], + "requestBody": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/PasswordReqBody" + } + } + }, + "required": true + }, "responses": { "204": { "description": "OAuth application access revoked" + }, + "403": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 403, + "label": "access-denied", + "message": "Access denied." + }, + "properties": { + "code": { + "enum": [ + 403 + ], + "type": "integer" + }, + "label": { + "enum": [ + "access-denied" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "Access denied. (label: `access-denied`)" } }, "summary": "Revoke account access from an OAuth application" @@ -17705,6 +17719,7 @@ "/oauth/applications/{OAuthClientId}/sessions/{RefreshTokenId}": { "delete": { "description": " [internal route ID: \"delete-oauth-refresh-token\"]\n\nRevoke an active OAuth session by providing the refresh token ID.", + "operationId": "delete-oauth-refresh-token", "parameters": [ { "description": "The ID of the OAuth client", @@ -17832,6 +17847,7 @@ "/oauth/authorization/codes": { "post": { "description": " [internal route ID: \"create-oauth-auth-code\"]\n\nCurrently only supports the 'code' response type, which corresponds to the authorization code flow.", + "operationId": "create-oauth-auth-code", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -17956,6 +17972,7 @@ "/oauth/clients/{OAuthClientId}": { "get": { "description": " [internal route ID: \"get-oauth-client\"]\n\n", + "operationId": "get-oauth-client", "parameters": [ { "description": "The ID of the OAuth client", @@ -18097,6 +18114,7 @@ "/oauth/revoke": { "post": { "description": " [internal route ID: \"revoke-oauth-refresh-token\"]\n\nRevoke an access token.", + "operationId": "revoke-oauth-refresh-token", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -18239,6 +18257,7 @@ "/oauth/token": { "post": { "description": " [internal route ID: \"create-oauth-access-token\"]\n\nObtain a new access token from an authorization code or a refresh token.", + "operationId": "create-oauth-access-token", "requestBody": { "content": { "application/x-www-form-urlencoded": { @@ -18258,28 +18277,280 @@ } } }, - "description": "" + "description": "" + }, + "403": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 403, + "label": "invalid_grant", + "message": "Invalid grant" + }, + "properties": { + "code": { + "enum": [ + 403 + ], + "type": "integer" + }, + "label": { + "enum": [ + "invalid_grant", + "forbidden" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "Invalid grant (label: `invalid_grant`)\n\nInvalid client credentials (label: `forbidden`)\n\nInvalid grant type (label: `forbidden`)\n\nInvalid refresh token (label: `forbidden`)\n\nOAuth is disabled (label: `forbidden`)" + }, + "404": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 404, + "label": "not-found", + "message": "OAuth client not found" + }, + "properties": { + "code": { + "enum": [ + 404 + ], + "type": "integer" + }, + "label": { + "enum": [ + "not-found" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "OAuth client not found (label: `not-found`)\n\nOAuth authorization code not found (label: `not-found`)" + }, + "500": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 500, + "label": "jwt-error", + "message": "Internal error while handling JWT token" + }, + "properties": { + "code": { + "enum": [ + 500 + ], + "type": "integer" + }, + "label": { + "enum": [ + "jwt-error" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "Internal error while handling JWT token (label: `jwt-error`)" + } + }, + "summary": "Create an OAuth access token" + } + }, + "/onboarding/v3": { + "post": { + "deprecated": true, + "description": " [internal route ID: \"onboarding\"]\n\nDEPRECATED: the feature has been turned off, the end-point does nothing and always returns '{\"results\":[],\"auto-connects\":[]}'.", + "operationId": "onboarding", + "requestBody": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/Body" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/DeprecatedMatchingResult" + } + } + }, + "description": "" + } + }, + "summary": "Upload contacts and invoke matching." + } + }, + "/one2one-conversations": { + "post": { + "description": " [internal route ID: \"create-one-to-one-conversation\"]\n\n", + "operationId": "create-one-to-one-conversation", + "requestBody": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/NewConv" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConversationV3" + } + }, + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/ConversationV3" + } + } + }, + "description": "Conversation existed", + "headers": { + "Location": { + "description": "Conversation ID", + "schema": { + "format": "uuid", + "type": "string" + } + } + } + }, + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConversationV3" + } + }, + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/ConversationV3" + } + } + }, + "description": "Conversation created", + "headers": { + "Location": { + "description": "Conversation ID", + "schema": { + "format": "uuid", + "type": "string" + } + } + } + }, + "403": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 403, + "label": "missing-legalhold-consent", + "message": "Failed to connect to a user or to invite a user to a group because somebody is under legalhold and somebody else has not granted consent" + }, + "properties": { + "code": { + "enum": [ + 403 + ], + "type": "integer" + }, + "label": { + "enum": [ + "missing-legalhold-consent", + "operation-denied", + "not-connected", + "no-team-member", + "non-binding-team-members", + "invalid-op", + "access-denied" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "Failed to connect to a user or to invite a user to a group because somebody is under legalhold and somebody else has not granted consent (label: `missing-legalhold-consent`)\n\nInsufficient permissions (label: `operation-denied`)\n\nUsers are not connected (label: `not-connected`)\n\nRequesting user is not a team member (label: `no-team-member`)\n\nBoth users must be members of the same binding team (label: `non-binding-team-members`)\n\nInvalid operation (label: `invalid-op`)\n\nConversation access denied (label: `access-denied`)" }, - "403": { + "404": { "content": { "application/json;charset=utf-8": { "schema": { "example": { - "code": 403, - "label": "invalid_grant", - "message": "Invalid grant" + "code": 404, + "label": "no-team", + "message": "Team not found" }, "properties": { "code": { "enum": [ - 403 + 404 ], "type": "integer" }, "label": { "enum": [ - "invalid_grant", - "forbidden" + "no-team", + "non-binding-team" ], "type": "string" }, @@ -18296,27 +18567,103 @@ } } }, - "description": "Invalid grant (label: `invalid_grant`)\n\nInvalid client credentials (label: `forbidden`)\n\nInvalid grant type (label: `forbidden`)\n\nInvalid refresh token (label: `forbidden`)\n\nOAuth is disabled (label: `forbidden`)" + "description": "Team not found (label: `no-team`)\n\nNot a member of a binding team (label: `non-binding-team`)" }, - "404": { + "533": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "properties": { + "unreachable_backends": { + "items": { + "$ref": "#/components/schemas/Domain" + }, + "type": "array" + } + }, + "required": [ + "unreachable_backends" + ], + "type": "object" + } + } + }, + "description": "Some domains are unreachable" + } + }, + "summary": "Create a 1:1 conversation" + } + }, + "/one2one-conversations/{usr_domain}/{usr}": { + "get": { + "description": " [internal route ID: \"get-one-to-one-mls-conversation\"]\n\n", + "operationId": "get-one-to-one-mls-conversation", + "parameters": [ + { + "in": "path", + "name": "usr_domain", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "usr", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "in": "query", + "name": "format", + "required": false, + "schema": { + "enum": [ + "raw", + "jwk" + ], + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MLSOne2OneConversation_SomeKey" + } + }, + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/MLSOne2OneConversation_SomeKey" + } + } + }, + "description": "MLS 1-1 conversation" + }, + "400": { "content": { "application/json;charset=utf-8": { "schema": { "example": { - "code": 404, - "label": "not-found", - "message": "OAuth client not found" + "code": 400, + "label": "mls-not-enabled", + "message": "MLS is not configured on this backend. See docs.wire.com for instructions on how to enable it" }, "properties": { "code": { "enum": [ - 404 + 400 ], "type": "integer" }, "label": { "enum": [ - "not-found" + "mls-not-enabled" ], "type": "string" }, @@ -18333,27 +18680,27 @@ } } }, - "description": "OAuth client not found (label: `not-found`)\n\nOAuth authorization code not found (label: `not-found`)" + "description": "Invalid `format`\n\nMLS is not configured on this backend. See docs.wire.com for instructions on how to enable it (label: `mls-not-enabled`)" }, - "500": { + "403": { "content": { "application/json;charset=utf-8": { "schema": { "example": { - "code": 500, - "label": "jwt-error", - "message": "Internal error while handling JWT token" + "code": 403, + "label": "not-connected", + "message": "Users are not connected" }, "properties": { "code": { "enum": [ - 500 + 403 ], "type": "integer" }, "label": { "enum": [ - "jwt-error" + "not-connected" ], "type": "string" }, @@ -18370,44 +18717,16 @@ } } }, - "description": "Internal error while handling JWT token (label: `jwt-error`)" - } - }, - "summary": "Create an OAuth access token" - } - }, - "/onboarding/v3": { - "post": { - "deprecated": true, - "description": " [internal route ID: \"onboarding\"]\n\nDEPRECATED: the feature has been turned off, the end-point does nothing and always returns '{\"results\":[],\"auto-connects\":[]}'.", - "requestBody": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/Body" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json;charset=utf-8": { - "schema": { - "$ref": "#/components/schemas/DeprecatedMatchingResult" - } - } - }, - "description": "" + "description": "Users are not connected (label: `not-connected`)" } }, - "summary": "Upload contacts and invoke matching." + "summary": "Get an MLS 1:1 conversation" } }, "/password-reset": { "post": { "description": " [internal route ID: \"post-password-reset\"]\n\n", + "operationId": "post-password-reset", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -18429,6 +18748,7 @@ "/password-reset/complete": { "post": { "description": " [internal route ID: \"post-password-reset-complete\"]\n\n", + "operationId": "post-password-reset-complete", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -18488,6 +18808,7 @@ "post": { "deprecated": true, "description": " [internal route ID: \"post-password-reset-key-deprecated\"]\n\nDEPRECATED: Use 'POST /password-reset/complete'.", + "operationId": "post-password-reset-key-deprecated", "parameters": [ { "description": "An opaque key for a pending password reset.", @@ -18596,6 +18917,7 @@ "/properties": { "delete": { "description": " [internal route ID: \"clear-properties\"]\n\n", + "operationId": "clear-properties", "responses": { "200": { "description": "Properties cleared" @@ -18605,6 +18927,7 @@ }, "get": { "description": " [internal route ID: \"list-property-keys\"]\n\n", + "operationId": "list-property-keys", "responses": { "200": { "content": { @@ -18634,6 +18957,7 @@ "/properties-values": { "get": { "description": " [internal route ID: \"list-properties\"]\n\n", + "operationId": "list-properties", "responses": { "200": { "content": { @@ -18652,6 +18976,7 @@ "/properties/{key}": { "delete": { "description": " [internal route ID: \"delete-property\"]\n\n", + "operationId": "delete-property", "parameters": [ { "in": "path", @@ -18672,6 +18997,7 @@ }, "get": { "description": " [internal route ID: \"get-property\"]\n\n", + "operationId": "get-property", "parameters": [ { "in": "path", @@ -18707,6 +19033,7 @@ }, "put": { "description": " [internal route ID: \"set-property\"]\n\n", + "operationId": "set-property", "parameters": [ { "in": "path", @@ -18739,6 +19066,7 @@ "/provider": { "delete": { "description": " [internal route ID: \"provider-delete\"]\n\n", + "operationId": "provider-delete", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -18797,6 +19125,7 @@ }, "get": { "description": " [internal route ID: \"provider-get-account\"]\n\n", + "operationId": "provider-get-account", "responses": { "200": { "content": { @@ -18924,6 +19253,7 @@ }, "put": { "description": " [internal route ID: \"provider-update\"]\n\n", + "operationId": "provider-update", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -18983,6 +19313,7 @@ "/provider/activate": { "get": { "description": " [internal route ID: \"provider-activate\"]\n\n", + "operationId": "provider-activate", "parameters": [ { "in": "query", @@ -19064,6 +19395,8 @@ }, "/provider/assets": { "post": { + "description": " [internal route ID: (\"assets-upload-v3\", provider)]\n\n", + "operationId": "assets-upload-v3_provider", "requestBody": { "content": { "multipart/mixed": { @@ -19179,6 +19512,8 @@ }, "/provider/assets/{key}": { "delete": { + "description": " [internal route ID: (\"assets-delete-v3\", provider)]\n\n", + "operationId": "assets-delete-v3_provider", "parameters": [ { "in": "path", @@ -19271,6 +19606,8 @@ "summary": "Delete an asset" }, "get": { + "description": " [internal route ID: (\"assets-download-v3\", provider)]\n\n", + "operationId": "assets-download-v3_provider", "parameters": [ { "in": "path", @@ -19386,6 +19723,7 @@ "/provider/email": { "put": { "description": " [internal route ID: \"provider-update-email\"]\n\n", + "operationId": "provider-update-email", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -19519,6 +19857,7 @@ "/provider/login": { "post": { "description": " [internal route ID: \"provider-login\"]\n\n", + "operationId": "provider-login", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -19585,6 +19924,7 @@ "/provider/password": { "put": { "description": " [internal route ID: \"provider-update-password\"]\n\n", + "operationId": "provider-update-password", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -19681,6 +20021,7 @@ "/provider/password-reset": { "post": { "description": " [internal route ID: \"provider-password-reset\"]\n\n", + "operationId": "provider-password-reset", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -19853,6 +20194,7 @@ "/provider/password-reset/complete": { "post": { "description": " [internal route ID: \"provider-password-reset-complete\"]\n\n", + "operationId": "provider-password-reset-complete", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -19987,6 +20329,7 @@ "/provider/register": { "post": { "description": " [internal route ID: \"provider-register\"]\n\n", + "operationId": "provider-register", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -20131,6 +20474,7 @@ "/provider/services": { "get": { "description": " [internal route ID: \"get-provider-services\"]\n\n", + "operationId": "get-provider-services", "responses": { "200": { "content": { @@ -20187,6 +20531,7 @@ }, "post": { "description": " [internal route ID: \"post-provider-services\"]\n\n", + "operationId": "post-provider-services", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -20294,6 +20639,7 @@ "/provider/services/{service-id}": { "delete": { "description": " [internal route ID: \"delete-provider-services-by-service-id\"]\n\n", + "operationId": "delete-provider-services-by-service-id", "parameters": [ { "in": "path", @@ -20399,6 +20745,7 @@ }, "get": { "description": " [internal route ID: \"get-provider-services-by-service-id\"]\n\n", + "operationId": "get-provider-services-by-service-id", "parameters": [ { "in": "path", @@ -20500,6 +20847,7 @@ }, "put": { "description": " [internal route ID: \"put-provider-services-by-service-id\"]\n\n", + "operationId": "put-provider-services-by-service-id", "parameters": [ { "in": "path", @@ -20606,6 +20954,7 @@ "/provider/services/{service-id}/connection": { "put": { "description": " [internal route ID: \"put-provider-services-connection-by-service-id\"]\n\n", + "operationId": "put-provider-services-connection-by-service-id", "parameters": [ { "in": "path", @@ -20750,6 +21099,7 @@ "/providers/{pid}": { "get": { "description": " [internal route ID: \"provider-get-profile\"]\n\n", + "operationId": "provider-get-profile", "parameters": [ { "in": "path", @@ -20853,6 +21203,7 @@ "/providers/{provider-id}/services": { "get": { "description": " [internal route ID: \"get-provider-services-by-provider-id\"]\n\n", + "operationId": "get-provider-services-by-provider-id", "parameters": [ { "in": "path", @@ -20922,6 +21273,7 @@ "/providers/{provider-id}/services/{service-id}": { "get": { "description": " [internal route ID: \"get-provider-services-by-provider-id-and-service-id\"]\n\n", + "operationId": "get-provider-services-by-provider-id-and-service-id", "parameters": [ { "in": "path", @@ -21038,6 +21390,7 @@ "/push/tokens": { "get": { "description": " [internal route ID: \"get-push-tokens\"]\n\n", + "operationId": "get-push-tokens", "responses": { "200": { "content": { @@ -21054,6 +21407,7 @@ }, "post": { "description": " [internal route ID: \"register-push-token\"]\n\n", + "operationId": "register-push-token", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -21307,6 +21661,7 @@ "/push/tokens/{pid}": { "delete": { "description": " [internal route ID: \"delete-push-token\"]\n\n", + "operationId": "delete-push-token", "parameters": [ { "description": "The push token to delete", @@ -21397,7 +21752,8 @@ }, "/register": { "post": { - "description": " [internal route ID: \"register\"]\n\nIf the environment where the registration takes place is private and a registered email address is not whitelisted, a 403 error is returned.Calls federation service brig on send-connection-action", + "description": " [internal route ID: \"register\"]\n\nIf the environment where the registration takes place is private and a registered email address is not whitelisted, a 403 error is returned.", + "operationId": "register", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -21733,6 +22089,8 @@ }, "/scim/auth-tokens": { "delete": { + "description": " [internal route ID: \"auth-tokens-delete\"]\n\n", + "operationId": "auth-tokens-delete", "parameters": [ { "in": "query", @@ -21767,8 +22125,7 @@ "label": { "enum": [ "code-authentication-required", - "code-authentication-failed", - "password-authentication-failed" + "code-authentication-failed" ], "type": "string" }, @@ -21785,11 +22142,13 @@ } } }, - "description": "Code authentication is required (label: `code-authentication-required`)\n\nCode authentication failed (label: `code-authentication-failed`)\n\nPassword authentication failed. (label: `password-authentication-failed`)" + "description": "Code authentication is required (label: `code-authentication-required`)\n\nCode authentication failed (label: `code-authentication-failed`)" } } }, "get": { + "description": " [internal route ID: \"auth-tokens-list\"]\n\n", + "operationId": "auth-tokens-list", "responses": { "200": { "content": { @@ -21820,8 +22179,7 @@ "label": { "enum": [ "code-authentication-required", - "code-authentication-failed", - "password-authentication-failed" + "code-authentication-failed" ], "type": "string" }, @@ -21838,11 +22196,13 @@ } } }, - "description": "Code authentication is required (label: `code-authentication-required`)\n\nCode authentication failed (label: `code-authentication-failed`)\n\nPassword authentication failed. (label: `password-authentication-failed`)" + "description": "Code authentication is required (label: `code-authentication-required`)\n\nCode authentication failed (label: `code-authentication-failed`)" } } }, "post": { + "description": " [internal route ID: \"auth-tokens-create\"]\n\n", + "operationId": "auth-tokens-create", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -21883,8 +22243,87 @@ "label": { "enum": [ "code-authentication-required", - "code-authentication-failed", - "password-authentication-failed" + "code-authentication-failed" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "Code authentication is required (label: `code-authentication-required`)\n\nCode authentication failed (label: `code-authentication-failed`)" + } + } + } + }, + "/scim/auth-tokens/{id}": { + "put": { + "description": " [internal route ID: \"auth-tokens-put-name\"]\n\n", + "operationId": "auth-tokens-put-name", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/ScimTokenName" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": [], + "items": {}, + "maxItems": 0, + "type": "array" + } + } + }, + "description": "" + }, + "403": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 403, + "label": "code-authentication-required", + "message": "Code authentication is required" + }, + "properties": { + "code": { + "enum": [ + 403 + ], + "type": "integer" + }, + "label": { + "enum": [ + "code-authentication-required", + "code-authentication-failed" ], "type": "string" }, @@ -21901,14 +22340,15 @@ } } }, - "description": "Code authentication is required (label: `code-authentication-required`)\n\nCode authentication failed (label: `code-authentication-failed`)\n\nPassword authentication failed. (label: `password-authentication-failed`)" + "description": "Code authentication is required (label: `code-authentication-required`)\n\nCode authentication failed (label: `code-authentication-failed`)" } } } }, "/search/contacts": { "get": { - "description": " [internal route ID: \"search-contacts\"]\n\nCalls federation service brig on search-users
Calls federation service brig on get-users-by-ids", + "description": " [internal route ID: \"search-contacts\"]\n\n", + "operationId": "search-contacts", "parameters": [ { "description": "Search query", @@ -21958,7 +22398,8 @@ }, "/self": { "delete": { - "description": " [internal route ID: \"delete-self\"]\n\nif the account has a verified identity, a verification code is sent and needs to be confirmed to authorise the deletion. if the account has no verified identity but a password, it must be provided. if password is correct, or if neither a verified identity nor a password exists, account deletion is scheduled immediately.Calls federation service brig on send-connection-action", + "description": " [internal route ID: \"delete-self\"]\n\nif the account has a verified identity, a verification code is sent and needs to be confirmed to authorise the deletion. if the account has no verified identity but a password, it must be provided. if password is correct, or if neither a verified identity nor a password exists, account deletion is scheduled immediately.", + "operationId": "delete-self", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -22071,6 +22512,7 @@ }, "get": { "description": " [internal route ID: \"get-self\"]\n\n\nOAuth scope: `read:self`", + "operationId": "get-self", "responses": { "200": { "content": { @@ -22086,7 +22528,8 @@ "summary": "Get your own profile" }, "put": { - "description": " [internal route ID: \"put-self\"]\n\nCalls federation service brig on send-connection-action", + "description": " [internal route ID: \"put-self\"]\n\n", + "operationId": "put-self", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -22107,7 +22550,8 @@ }, "/self/email": { "delete": { - "description": " [internal route ID: \"remove-email\"]\n\nYour email address can only be removed if you also have a phone number.Calls federation service brig on send-connection-action", + "description": " [internal route ID: \"remove-email\"]\n\nYour email address can only be removed if you also have a phone number.", + "operationId": "remove-email", "responses": { "200": { "description": "Identity Removed" @@ -22131,7 +22575,6 @@ "label": { "enum": [ "last-identity", - "no-password", "no-identity" ], "type": "string" @@ -22165,7 +22608,6 @@ "label": { "enum": [ "last-identity", - "no-password", "no-identity" ], "type": "string" @@ -22183,7 +22625,7 @@ } } }, - "description": "The last user identity cannot be removed. (label: `last-identity`)\n\nThe user has no password. (label: `no-password`)\n\nThe user has no verified email (label: `no-identity`)" + "description": "The last user identity cannot be removed. (label: `last-identity`)\n\nThe user has no verified email (label: `no-identity`)" } }, "summary": "Remove your email address." @@ -22191,7 +22633,8 @@ }, "/self/handle": { "put": { - "description": " [internal route ID: \"change-handle\"]\n\nCalls federation service brig on send-connection-action
Calls federation service brig on send-connection-action", + "description": " [internal route ID: \"change-handle\"]\n\n", + "operationId": "change-handle", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -22212,7 +22655,8 @@ }, "/self/locale": { "put": { - "description": " [internal route ID: \"change-locale\"]\n\nCalls federation service brig on send-connection-action", + "description": " [internal route ID: \"change-locale\"]\n\n", + "operationId": "change-locale", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -22234,6 +22678,7 @@ "/self/password": { "head": { "description": " [internal route ID: \"check-password-exists\"]\n\n", + "operationId": "check-password-exists", "responses": { "200": { "description": "Password is set" @@ -22246,6 +22691,7 @@ }, "put": { "description": " [internal route ID: \"change-password\"]\n\n", + "operationId": "change-password", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -22407,6 +22853,7 @@ "/self/supported-protocols": { "put": { "description": " [internal route ID: \"change-supported-protocols\"]\n\n", + "operationId": "change-supported-protocols", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -22428,6 +22875,7 @@ "/services": { "get": { "description": " [internal route ID: \"get-services\"]\n\n", + "operationId": "get-services", "parameters": [ { "in": "query", @@ -22489,13 +22937,69 @@ "type": "integer" } } - ], + ], + "responses": { + "200": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/ServiceProfilePage" + } + } + }, + "description": "" + }, + "403": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 403, + "label": "access-denied", + "message": "Access denied." + }, + "properties": { + "code": { + "enum": [ + 403 + ], + "type": "integer" + }, + "label": { + "enum": [ + "access-denied" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "Access denied. (label: `access-denied`)" + } + }, + "summary": "List services" + } + }, + "/services/tags": { + "get": { + "description": " [internal route ID: \"get-services-tags\"]\n\n", + "operationId": "get-services-tags", "responses": { "200": { "content": { "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/ServiceProfile" + "$ref": "#/components/schemas/ServiceTagList" } } }, @@ -22539,13 +23043,14 @@ "description": "Access denied. (label: `access-denied`)" } }, - "summary": "List services" + "summary": "Get services tags" } }, "/sso/finalize-login": { "post": { "deprecated": true, - "description": "DEPRECATED! use /sso/metadata/:tid instead! Details: https://docs.wire.com/understand/single-sign-on/trouble-shooting.html#can-i-use-the-same-sso-login-code-for-multiple-teams", + "description": " [internal route ID: \"auth-resp-legacy\"]\n\nDEPRECATED! use /sso/metadata/:tid instead! Details: https://docs.wire.com/understand/single-sign-on/trouble-shooting.html#can-i-use-the-same-sso-login-code-for-multiple-teams", + "operationId": "auth-resp-legacy", "responses": { "200": { "content": { @@ -22562,6 +23067,8 @@ }, "/sso/finalize-login/{team}": { "post": { + "description": " [internal route ID: \"auth-resp\"]\n\n", + "operationId": "auth-resp", "parameters": [ { "in": "path", @@ -22589,6 +23096,8 @@ }, "/sso/initiate-login/{idp}": { "get": { + "description": " [internal route ID: \"auth-req\"]\n\n", + "operationId": "auth-req", "parameters": [ { "in": "query", @@ -22630,6 +23139,8 @@ } }, "head": { + "description": " [internal route ID: \"auth-req-precheck\"]\n\n", + "operationId": "auth-req-precheck", "parameters": [ { "in": "query", @@ -22670,7 +23181,8 @@ "/sso/metadata": { "get": { "deprecated": true, - "description": "DEPRECATED! use /sso/metadata/:tid instead! Details: https://docs.wire.com/understand/single-sign-on/trouble-shooting.html#can-i-use-the-same-sso-login-code-for-multiple-teams", + "description": " [internal route ID: \"sso-metadata\"]\n\nDEPRECATED! use /sso/metadata/:tid instead! Details: https://docs.wire.com/understand/single-sign-on/trouble-shooting.html#can-i-use-the-same-sso-login-code-for-multiple-teams", + "operationId": "sso-metadata", "responses": { "200": { "content": { @@ -22687,6 +23199,8 @@ }, "/sso/metadata/{team}": { "get": { + "description": " [internal route ID: \"sso-team-metadata\"]\n\n", + "operationId": "sso-team-metadata", "parameters": [ { "in": "path", @@ -22714,6 +23228,8 @@ }, "/sso/settings": { "get": { + "description": " [internal route ID: \"sso-settings\"]\n\n", + "operationId": "sso-settings", "responses": { "200": { "content": { @@ -22731,6 +23247,7 @@ "/system/settings": { "get": { "description": " [internal route ID: \"get-system-settings\"]\n\n", + "operationId": "get-system-settings", "responses": { "200": { "content": { @@ -22749,6 +23266,7 @@ "/system/settings/unauthorized": { "get": { "description": " [internal route ID: \"get-system-settings-unauthorized\"]\n\n", + "operationId": "get-system-settings-unauthorized", "responses": { "200": { "content": { @@ -22764,9 +23282,110 @@ "summary": "Returns a curated set of system configuration settings." } }, + "/teams/invitations/accept": { + "post": { + "description": " [internal route ID: \"accept-team-invitation\"]\n\n", + "operationId": "accept-team-invitation", + "requestBody": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "$ref": "#/components/schemas/AcceptTeamInvitation" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Team invitation accepted." + }, + "403": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 403, + "label": "missing-auth", + "message": "Re-authentication via password required" + }, + "properties": { + "code": { + "enum": [ + 403 + ], + "type": "integer" + }, + "label": { + "enum": [ + "missing-auth", + "invalid-credentials", + "missing-identity", + "too-many-team-members" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "Re-authentication via password required (label: `missing-auth`)\n\nAuthentication failed (label: `invalid-credentials`)\n\nUsing an invitation code requires registering the given email. (label: `missing-identity`)\n\nToo many members in this team. (label: `too-many-team-members`)" + }, + "404": { + "content": { + "application/json;charset=utf-8": { + "schema": { + "example": { + "code": 404, + "label": "invalid-code", + "message": "Invalid activation code" + }, + "properties": { + "code": { + "enum": [ + 404 + ], + "type": "integer" + }, + "label": { + "enum": [ + "invalid-code", + "not-found" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" + } + } + }, + "description": "Invalid activation code (label: `invalid-code`)\n\nUser does not exist (label: `invalid-code`)\n\nNo pending invitations exists. (label: `not-found`)" + } + }, + "summary": "Accept a team invitation, changing a personal account into a team member account." + } + }, "/teams/invitations/by-email": { "head": { "description": " [internal route ID: \"head-team-invitations\"]\n\n", + "operationId": "head-team-invitations", "parameters": [ { "description": "Email address", @@ -22927,6 +23546,7 @@ "/teams/invitations/info": { "get": { "description": " [internal route ID: \"get-team-invitation-info\"]\n\n", + "operationId": "get-team-invitation-info", "parameters": [ { "description": "Invitation code", @@ -22943,12 +23563,12 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Invitation" + "$ref": "#/components/schemas/InvitationUserView" } }, "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/Invitation" + "$ref": "#/components/schemas/InvitationUserView" } } }, @@ -22998,6 +23618,7 @@ "/teams/notifications": { "get": { "description": " [internal route ID: \"get-team-notifications\"]\n\nThis is a work-around for scalability issues with gundeck user event fan-out. It does not track all team-wide events, but only `member-join`.\nNote that `/teams/notifications` behaves differently from `/notifications`:\n- If there is a gap between the notification id requested with `since` and the available data, team queues respond with 200 and the data that could be found. They do NOT respond with status 404, but valid data in the body.\n- The notification with the id given via `since` is included in the response if it exists. You should remove this and only use it to decide whether there was a gap between your last request and this one.\n- If the notification id does *not* exist, you get the more recent events from the queue (instead of all of them). This can be done because a notification id is a UUIDv1, which is essentially a time stamp.\n- There is no corresponding `/last` end-point to get only the most recent event. That end-point was only useful to avoid having to pull the entire queue. In team queues, if you have never requested the queue before and have no prior notification id, just pull with timestamp 'now'.", + "operationId": "get-team-notifications", "parameters": [ { "description": "Notification id to start with in the response (UUIDv1)", @@ -23114,6 +23735,7 @@ "/teams/{team-id}/services/whitelist": { "post": { "description": " [internal route ID: \"post-team-whitelist-by-team-id\"]\n\n", + "operationId": "post-team-whitelist-by-team-id", "parameters": [ { "in": "path", @@ -23149,6 +23771,7 @@ "/teams/{team-id}/services/whitelisted": { "get": { "description": " [internal route ID: \"get-whitelisted-services-by-team-id\"]\n\n", + "operationId": "get-whitelisted-services-by-team-id", "parameters": [ { "in": "path", @@ -23164,8 +23787,8 @@ "name": "prefix", "required": false, "schema": { - "maxLength": 1, - "minLength": 128, + "maxLength": 128, + "minLength": 1, "type": "string" } }, @@ -23194,7 +23817,7 @@ "content": { "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/ServiceProfile" + "$ref": "#/components/schemas/ServiceProfilePage" } } }, @@ -23207,6 +23830,7 @@ "/teams/{tid}": { "delete": { "description": " [internal route ID: \"delete-team\"]\n\n", + "operationId": "delete-team", "parameters": [ { "in": "path", @@ -23352,6 +23976,7 @@ }, "get": { "description": " [internal route ID: \"get-team\"]\n\n", + "operationId": "get-team", "parameters": [ { "in": "path", @@ -23416,6 +24041,7 @@ }, "put": { "description": " [internal route ID: \"update-team\"]\n\n", + "operationId": "update-team", "parameters": [ { "in": "path", @@ -23486,6 +24112,7 @@ "/teams/{tid}/conversations": { "get": { "description": " [internal route ID: \"get-team-conversations\"]\n\n", + "operationId": "get-team-conversations", "parameters": [ { "in": "path", @@ -23553,6 +24180,7 @@ "/teams/{tid}/conversations/roles": { "get": { "description": " [internal route ID: \"get-team-conversation-roles\"]\n\n", + "operationId": "get-team-conversation-roles", "parameters": [ { "in": "path", @@ -23618,7 +24246,8 @@ }, "/teams/{tid}/conversations/{cid}": { "delete": { - "description": " [internal route ID: \"delete-team-conversation\"]\n\nCalls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"delete-team-conversation\"]\n\n", + "operationId": "delete-team-conversation", "parameters": [ { "in": "path", @@ -23724,6 +24353,7 @@ }, "get": { "description": " [internal route ID: \"get-team-conversation\"]\n\n", + "operationId": "get-team-conversation", "parameters": [ { "in": "path", @@ -23837,6 +24467,7 @@ "/teams/{tid}/features": { "get": { "description": " [internal route ID: \"get-all-feature-configs-for-team\"]\n\nGets feature configs for a team. User must be a member of the team and have permission to view team features.", + "operationId": "get-all-feature-configs-for-team", "parameters": [ { "in": "path", @@ -23941,6 +24572,7 @@ "/teams/{tid}/features/appLock": { "get": { "description": " [internal route ID: (\"get\", AppLockConfig)]\n\n", + "operationId": "get_AppLockConfig", "parameters": [ { "in": "path", @@ -24043,6 +24675,7 @@ }, "put": { "description": " [internal route ID: (\"put\", AppLockConfig)]\n\n", + "operationId": "put_AppLockConfig", "parameters": [ { "in": "path", @@ -24157,6 +24790,7 @@ "/teams/{tid}/features/classifiedDomains": { "get": { "description": " [internal route ID: (\"get\", ClassifiedDomainsConfig)]\n\n", + "operationId": "get_ClassifiedDomainsConfig", "parameters": [ { "in": "path", @@ -24261,6 +24895,7 @@ "/teams/{tid}/features/conferenceCalling": { "get": { "description": " [internal route ID: (\"get\", ConferenceCallingConfig)]\n\n", + "operationId": "get_ConferenceCallingConfig", "parameters": [ { "in": "path", @@ -24363,6 +24998,7 @@ }, "put": { "description": " [internal route ID: (\"put\", ConferenceCallingConfig)]\n\n", + "operationId": "put_ConferenceCallingConfig", "parameters": [ { "in": "path", @@ -24477,6 +25113,7 @@ "/teams/{tid}/features/conversationGuestLinks": { "get": { "description": " [internal route ID: (\"get\", GuestLinksConfig)]\n\n", + "operationId": "get_GuestLinksConfig", "parameters": [ { "in": "path", @@ -24579,6 +25216,7 @@ }, "put": { "description": " [internal route ID: (\"put\", GuestLinksConfig)]\n\n", + "operationId": "put_GuestLinksConfig", "parameters": [ { "in": "path", @@ -24693,6 +25331,7 @@ "/teams/{tid}/features/digitalSignatures": { "get": { "description": " [internal route ID: (\"get\", DigitalSignaturesConfig)]\n\n", + "operationId": "get_DigitalSignaturesConfig", "parameters": [ { "in": "path", @@ -24797,6 +25436,7 @@ "/teams/{tid}/features/enforceFileDownloadLocation": { "get": { "description": " [internal route ID: (\"get\", EnforceFileDownloadLocationConfig)]\n\n

Custom feature: only supported on some dedicated on-prem systems.

", + "operationId": "get_EnforceFileDownloadLocationConfig", "parameters": [ { "in": "path", @@ -24899,6 +25539,7 @@ }, "put": { "description": " [internal route ID: (\"put\", EnforceFileDownloadLocationConfig)]\n\n

Custom feature: only supported on some dedicated on-prem systems.

", + "operationId": "put_EnforceFileDownloadLocationConfig", "parameters": [ { "in": "path", @@ -25013,6 +25654,7 @@ "/teams/{tid}/features/exposeInvitationURLsToTeamAdmin": { "get": { "description": " [internal route ID: (\"get\", ExposeInvitationURLsToTeamAdminConfig)]\n\n", + "operationId": "get_ExposeInvitationURLsToTeamAdminConfig", "parameters": [ { "in": "path", @@ -25115,6 +25757,7 @@ }, "put": { "description": " [internal route ID: (\"put\", ExposeInvitationURLsToTeamAdminConfig)]\n\n", + "operationId": "put_ExposeInvitationURLsToTeamAdminConfig", "parameters": [ { "in": "path", @@ -25229,6 +25872,7 @@ "/teams/{tid}/features/fileSharing": { "get": { "description": " [internal route ID: (\"get\", FileSharingConfig)]\n\n", + "operationId": "get_FileSharingConfig", "parameters": [ { "in": "path", @@ -25331,6 +25975,7 @@ }, "put": { "description": " [internal route ID: (\"put\", FileSharingConfig)]\n\n", + "operationId": "put_FileSharingConfig", "parameters": [ { "in": "path", @@ -25445,6 +26090,7 @@ "/teams/{tid}/features/legalhold": { "get": { "description": " [internal route ID: (\"get\", LegalholdConfig)]\n\n", + "operationId": "get_LegalholdConfig", "parameters": [ { "in": "path", @@ -25547,6 +26193,7 @@ }, "put": { "description": " [internal route ID: (\"put\", LegalholdConfig)]\n\n", + "operationId": "put_LegalholdConfig", "parameters": [ { "in": "path", @@ -25740,6 +26387,7 @@ "/teams/{tid}/features/limitedEventFanout": { "get": { "description": " [internal route ID: (\"get\", LimitedEventFanoutConfig)]\n\n", + "operationId": "get_LimitedEventFanoutConfig", "parameters": [ { "in": "path", @@ -25844,6 +26492,7 @@ "/teams/{tid}/features/mls": { "get": { "description": " [internal route ID: (\"get\", MLSConfig)]\n\n", + "operationId": "get_MLSConfig", "parameters": [ { "in": "path", @@ -25946,6 +26595,7 @@ }, "put": { "description": " [internal route ID: (\"put\", MLSConfig)]\n\n", + "operationId": "put_MLSConfig", "parameters": [ { "in": "path", @@ -26060,6 +26710,7 @@ "/teams/{tid}/features/mlsE2EId": { "get": { "description": " [internal route ID: (\"get\", MlsE2EIdConfig)]\n\n", + "operationId": "get_MlsE2EIdConfig", "parameters": [ { "in": "path", @@ -26162,6 +26813,7 @@ }, "put": { "description": " [internal route ID: (\"put\", MlsE2EIdConfig)]\n\n", + "operationId": "put_MlsE2EIdConfig", "parameters": [ { "in": "path", @@ -26276,6 +26928,7 @@ "/teams/{tid}/features/mlsMigration": { "get": { "description": " [internal route ID: (\"get\", MlsMigrationConfig)]\n\n", + "operationId": "get_MlsMigrationConfig", "parameters": [ { "in": "path", @@ -26378,6 +27031,7 @@ }, "put": { "description": " [internal route ID: (\"put\", MlsMigrationConfig)]\n\n", + "operationId": "put_MlsMigrationConfig", "parameters": [ { "in": "path", @@ -26492,6 +27146,7 @@ "/teams/{tid}/features/outlookCalIntegration": { "get": { "description": " [internal route ID: (\"get\", OutlookCalIntegrationConfig)]\n\n", + "operationId": "get_OutlookCalIntegrationConfig", "parameters": [ { "in": "path", @@ -26594,6 +27249,7 @@ }, "put": { "description": " [internal route ID: (\"put\", OutlookCalIntegrationConfig)]\n\n", + "operationId": "put_OutlookCalIntegrationConfig", "parameters": [ { "in": "path", @@ -26708,6 +27364,7 @@ "/teams/{tid}/features/searchVisibility": { "get": { "description": " [internal route ID: (\"get\", SearchVisibilityAvailableConfig)]\n\n", + "operationId": "get_SearchVisibilityAvailableConfig", "parameters": [ { "in": "path", @@ -26810,6 +27467,7 @@ }, "put": { "description": " [internal route ID: (\"put\", SearchVisibilityAvailableConfig)]\n\n", + "operationId": "put_SearchVisibilityAvailableConfig", "parameters": [ { "in": "path", @@ -26924,6 +27582,7 @@ "/teams/{tid}/features/searchVisibilityInbound": { "get": { "description": " [internal route ID: (\"get\", SearchVisibilityInboundConfig)]\n\n", + "operationId": "get_SearchVisibilityInboundConfig", "parameters": [ { "in": "path", @@ -27026,6 +27685,7 @@ }, "put": { "description": " [internal route ID: (\"put\", SearchVisibilityInboundConfig)]\n\n", + "operationId": "put_SearchVisibilityInboundConfig", "parameters": [ { "in": "path", @@ -27140,6 +27800,7 @@ "/teams/{tid}/features/selfDeletingMessages": { "get": { "description": " [internal route ID: (\"get\", SelfDeletingMessagesConfig)]\n\n", + "operationId": "get_SelfDeletingMessagesConfig", "parameters": [ { "in": "path", @@ -27242,6 +27903,7 @@ }, "put": { "description": " [internal route ID: (\"put\", SelfDeletingMessagesConfig)]\n\n", + "operationId": "put_SelfDeletingMessagesConfig", "parameters": [ { "in": "path", @@ -27356,6 +28018,7 @@ "/teams/{tid}/features/sndFactorPasswordChallenge": { "get": { "description": " [internal route ID: (\"get\", SndFactorPasswordChallengeConfig)]\n\n", + "operationId": "get_SndFactorPasswordChallengeConfig", "parameters": [ { "in": "path", @@ -27458,6 +28121,7 @@ }, "put": { "description": " [internal route ID: (\"put\", SndFactorPasswordChallengeConfig)]\n\n", + "operationId": "put_SndFactorPasswordChallengeConfig", "parameters": [ { "in": "path", @@ -27572,6 +28236,7 @@ "/teams/{tid}/features/sso": { "get": { "description": " [internal route ID: (\"get\", SSOConfig)]\n\n", + "operationId": "get_SSOConfig", "parameters": [ { "in": "path", @@ -27676,6 +28341,7 @@ "/teams/{tid}/features/validateSAMLemails": { "get": { "description": " [internal route ID: (\"get\", ValidateSAMLEmailsConfig)]\n\n", + "operationId": "get_ValidateSAMLEmailsConfig", "parameters": [ { "in": "path", @@ -27780,6 +28446,7 @@ "/teams/{tid}/get-members-by-ids-using-post": { "post": { "description": " [internal route ID: \"get-team-members-by-ids\"]\n\nThe `has_more` field in the response body is always `false`.", + "operationId": "get-team-members-by-ids", "parameters": [ { "in": "path", @@ -27905,6 +28572,7 @@ "/teams/{tid}/invitations": { "get": { "description": " [internal route ID: \"get-team-invitations\"]\n\n", + "operationId": "get-team-invitations", "parameters": [ { "in": "path", @@ -27996,6 +28664,7 @@ }, "post": { "description": " [internal route ID: \"send-team-invitation\"]\n\nInvitations are sent by email. The maximum allowed number of pending team invitations is equal to the team size.", + "operationId": "send-team-invitation", "parameters": [ { "in": "path", @@ -28047,8 +28716,8 @@ "schema": { "example": { "code": 400, - "label": "invalid-email", - "message": "Invalid e-mail address." + "label": "invalid-invitation-code", + "message": "Invalid invitation code." }, "properties": { "code": { @@ -28059,6 +28728,7 @@ }, "label": { "enum": [ + "invalid-invitation-code", "invalid-email" ], "type": "string" @@ -28076,7 +28746,7 @@ } } }, - "description": "Invalid `body`\n\nInvalid e-mail address. (label: `invalid-email`)" + "description": "Invalid `body`\n\nInvalid invitation code. (label: `invalid-invitation-code`)\n\nInvalid e-mail address. (label: `invalid-email`)" }, "403": { "content": { @@ -28126,6 +28796,7 @@ "/teams/{tid}/invitations/{iid}": { "delete": { "description": " [internal route ID: \"delete-team-invitation\"]\n\n", + "operationId": "delete-team-invitation", "parameters": [ { "in": "path", @@ -28192,6 +28863,7 @@ }, "get": { "description": " [internal route ID: \"get-team-invitation\"]\n\n", + "operationId": "get-team-invitation", "parameters": [ { "in": "path", @@ -28340,7 +29012,8 @@ }, "/teams/{tid}/legalhold/consent": { "post": { - "description": " [internal route ID: \"consent-to-legal-hold\"]\n\nCalls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"consent-to-legal-hold\"]\n\n", + "operationId": "consent-to-legal-hold", "parameters": [ { "in": "path", @@ -28478,7 +29151,8 @@ }, "/teams/{tid}/legalhold/settings": { "delete": { - "description": " [internal route ID: \"delete-legal-hold-settings\"]\n\nThis endpoint can lead to the following events being sent:\n- ClientRemoved event to members with a legalhold client (via brig)\n- UserLegalHoldDisabled event to contacts of members with a legalhold client (via brig)
Calls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"delete-legal-hold-settings\"]\n\nThis endpoint can lead to the following events being sent:\n- ClientRemoved event to members with a legalhold client (via brig)\n- UserLegalHoldDisabled event to contacts of members with a legalhold client (via brig)", + "operationId": "delete-legal-hold-settings", "parameters": [ { "in": "path", @@ -28629,6 +29303,7 @@ }, "get": { "description": " [internal route ID: \"get-legal-hold-settings\"]\n\n", + "operationId": "get-legal-hold-settings", "parameters": [ { "in": "path", @@ -28694,6 +29369,7 @@ }, "post": { "description": " [internal route ID: \"create-legal-hold-settings\"]\n\n", + "operationId": "create-legal-hold-settings", "parameters": [ { "in": "path", @@ -28814,7 +29490,8 @@ }, "/teams/{tid}/legalhold/{uid}": { "delete": { - "description": " [internal route ID: \"disable-legal-hold-for-user\"]\n\nThis endpoint can lead to the following events being sent:\n- ClientRemoved event to the user owning the client (via brig)\n- UserLegalHoldDisabled event to contacts of the user owning the client (via brig)
Calls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"disable-legal-hold-for-user\"]\n\nThis endpoint can lead to the following events being sent:\n- ClientRemoved event to the user owning the client (via brig)\n- UserLegalHoldDisabled event to contacts of the user owning the client (via brig)", + "operationId": "disable-legal-hold-for-user", "parameters": [ { "in": "path", @@ -28974,6 +29651,7 @@ }, "get": { "description": " [internal route ID: \"get-legal-hold\"]\n\n", + "operationId": "get-legal-hold", "parameters": [ { "in": "path", @@ -29046,7 +29724,8 @@ "summary": "Get legal hold status" }, "post": { - "description": " [internal route ID: \"request-legal-hold-device\"]\n\nThis endpoint can lead to the following events being sent:\n- LegalHoldClientRequested event to contacts of the user the device is requested for, if they didn't already have a legalhold client (via brig)
Calls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"request-legal-hold-device\"]\n\nThis endpoint can lead to the following events being sent:\n- LegalHoldClientRequested event to contacts of the user the device is requested for, if they didn't already have a legalhold client (via brig)", + "operationId": "request-legal-hold-device", "parameters": [ { "in": "path", @@ -29195,8 +29874,8 @@ "schema": { "example": { "code": 409, - "label": "legalhold-no-consent", - "message": "user has not given consent to using legal hold" + "label": "mls-legal-hold-not-allowed", + "message": "A user who is under legal-hold may not participate in MLS conversations" }, "properties": { "code": { @@ -29207,6 +29886,7 @@ }, "label": { "enum": [ + "mls-legal-hold-not-allowed", "legalhold-no-consent", "legalhold-already-enabled" ], @@ -29225,7 +29905,7 @@ } } }, - "description": "user has not given consent to using legal hold (label: `legalhold-no-consent`)\n\nlegal hold is already enabled for this user (label: `legalhold-already-enabled`)" + "description": "A user who is under legal-hold may not participate in MLS conversations (label: `mls-legal-hold-not-allowed`)\n\nuser has not given consent to using legal hold (label: `legalhold-no-consent`)\n\nlegal hold is already enabled for this user (label: `legalhold-already-enabled`)" }, "500": { "content": { @@ -29271,7 +29951,8 @@ }, "/teams/{tid}/legalhold/{uid}/approve": { "put": { - "description": " [internal route ID: \"approve-legal-hold-device\"]\n\nThis endpoint can lead to the following events being sent:\n- ClientAdded event to the user owning the client (via brig)\n- UserLegalHoldEnabled event to contacts of the user owning the client (via brig)\n- ClientRemoved event to the user, if removing old client due to max number (via brig)
Calls federation service brig on get-users-by-ids
Calls federation service galley on on-mls-message-sent
Calls federation service galley on on-conversation-updated", + "description": " [internal route ID: \"approve-legal-hold-device\"]\n\nThis endpoint can lead to the following events being sent:\n- ClientAdded event to the user owning the client (via brig)\n- UserLegalHoldEnabled event to contacts of the user owning the client (via brig)\n- ClientRemoved event to the user, if removing old client due to max number (via brig)", + "operationId": "approve-legal-hold-device", "parameters": [ { "in": "path", @@ -29541,6 +30222,7 @@ "/teams/{tid}/members": { "get": { "description": " [internal route ID: \"get-team-members\"]\n\n", + "operationId": "get-team-members", "parameters": [ { "in": "path", @@ -29626,6 +30308,7 @@ }, "put": { "description": " [internal route ID: \"update-team-member\"]\n\n", + "operationId": "update-team-member", "parameters": [ { "in": "path", @@ -29737,6 +30420,7 @@ "/teams/{tid}/members/csv": { "get": { "description": " [internal route ID: \"get-team-members-csv\"]\n\nThe endpoint returns data in chunked transfer encoding. Internal server errors might result in a failed transfer instead of a 500 response.", + "operationId": "get-team-members-csv", "parameters": [ { "in": "path", @@ -29799,6 +30483,7 @@ "/teams/{tid}/members/{uid}": { "delete": { "description": " [internal route ID: \"delete-team-member\"]\n\n", + "operationId": "delete-team-member", "parameters": [ { "in": "path", @@ -29920,6 +30605,7 @@ }, "get": { "description": " [internal route ID: \"get-team-member\"]\n\n", + "operationId": "get-team-member", "parameters": [ { "in": "path", @@ -30032,6 +30718,7 @@ "/teams/{tid}/search": { "get": { "description": " [internal route ID: \"browse-team\"]\n\n", + "operationId": "browse-team", "parameters": [ { "in": "path", @@ -30106,7 +30793,6 @@ "name": "size", "required": false, "schema": { - "format": "int32", "maximum": 500, "minimum": 1, "type": "integer" @@ -30145,6 +30831,7 @@ "/teams/{tid}/search-visibility": { "get": { "description": " [internal route ID: \"get-search-visibility\"]\n\n", + "operationId": "get-search-visibility", "parameters": [ { "in": "path", @@ -30210,6 +30897,7 @@ }, "put": { "description": " [internal route ID: \"set-search-visibility\"]\n\n", + "operationId": "set-search-visibility", "parameters": [ { "in": "path", @@ -30318,6 +31006,7 @@ "/teams/{tid}/size": { "get": { "description": " [internal route ID: \"get-team-size\"]\n\nCan be out of sync by roughly the `refresh_interval` of the ES index.", + "operationId": "get-team-size", "parameters": [ { "in": "path", @@ -30386,14 +31075,15 @@ "summary": "Get the number of team members as an integer" } }, - "/users/handles": { + "/upgrade-personal-to-team": { "post": { - "description": " [internal route ID: \"check-user-handles\"]\n\n", + "description": " [internal route ID: \"upgrade-personal-to-team\"]\n\n", + "operationId": "upgrade-personal-to-team", "requestBody": { "content": { "application/json;charset=utf-8": { "schema": { - "$ref": "#/components/schemas/CheckHandles" + "$ref": "#/components/schemas/BindingNewTeamUser" } } }, @@ -30404,81 +31094,105 @@ "content": { "application/json": { "schema": { - "items": { - "$ref": "#/components/schemas/Handle" - }, - "type": "array" + "$ref": "#/components/schemas/CreateUserTeam" } }, "application/json;charset=utf-8": { "schema": { - "items": { - "$ref": "#/components/schemas/Handle" - }, - "type": "array" + "$ref": "#/components/schemas/CreateUserTeam" } } }, - "description": "List of free handles" - } - }, - "summary": "Check availability of user handles" - } - }, - "/users/handles/{handle}": { - "head": { - "description": " [internal route ID: \"check-user-handle\"]\n\n", - "parameters": [ - { - "in": "path", - "name": "handle", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { + "description": "Team created" + }, + "403": { "content": { "application/json": { "schema": { - "example": [], - "items": {}, - "maxItems": 0, - "type": "array" + "example": { + "code": 403, + "label": "user-already-in-a-team", + "message": "Switching teams is not allowed" + }, + "properties": { + "code": { + "enum": [ + 403 + ], + "type": "integer" + }, + "label": { + "enum": [ + "user-already-in-a-team" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" } }, "application/json;charset=utf-8": { "schema": { - "example": [], - "items": {}, - "maxItems": 0, - "type": "array" + "example": { + "code": 403, + "label": "user-already-in-a-team", + "message": "Switching teams is not allowed" + }, + "properties": { + "code": { + "enum": [ + 403 + ], + "type": "integer" + }, + "label": { + "enum": [ + "user-already-in-a-team" + ], + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "label", + "message" + ], + "type": "object" } } }, - "description": "Handle is taken" + "description": "Switching teams is not allowed (label: `user-already-in-a-team`)" }, - "400": { + "404": { "content": { - "application/json;charset=utf-8": { + "application/json": { "schema": { "example": { - "code": 400, - "label": "invalid-handle", - "message": "The given handle is invalid (less than 2 or more than 256 characters; chars not in \"a-z0-9_.-\"; or on the blocklist)" + "code": 404, + "label": "not-found", + "message": "User not found" }, "properties": { "code": { "enum": [ - 400 + 404 ], "type": "integer" }, "label": { "enum": [ - "invalid-handle" + "not-found" ], "type": "string" }, @@ -30493,18 +31207,13 @@ ], "type": "object" } - } - }, - "description": "The given handle is invalid (less than 2 or more than 256 characters; chars not in \"a-z0-9_.-\"; or on the blocklist) (label: `invalid-handle`)" - }, - "404": { - "content": { + }, "application/json;charset=utf-8": { "schema": { "example": { "code": 404, "label": "not-found", - "message": "Handle not found" + "message": "User not found" }, "properties": { "code": { @@ -30532,15 +31241,16 @@ } } }, - "description": "`handle` not found\n\nHandle not found (label: `not-found`)" + "description": "User not found (label: `not-found`)" } }, - "summary": "Check whether a user handle can be taken" + "summary": "Upgrade personal user to team owner" } }, "/users/list-clients": { "post": { - "description": " [internal route ID: \"list-clients-bulk@v2\"]\n\nIf a backend is unreachable, the clients from that backend will be omitted from the responseCalls federation service brig on get-user-clients", + "description": " [internal route ID: \"list-clients-bulk@v2\"]\n\nIf a backend is unreachable, the clients from that backend will be omitted from the response", + "operationId": "list-clients-bulk@v2", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -30573,7 +31283,8 @@ }, "/users/list-prekeys": { "post": { - "description": " [internal route ID: \"get-multi-user-prekey-bundle-qualified\"]\n\nYou can't request information for more users than maximum conversation size.Calls federation service brig on claim-multi-prekey-bundle", + "description": " [internal route ID: \"get-multi-user-prekey-bundle-qualified\"]\n\nYou can't request information for more users than maximum conversation size.", + "operationId": "get-multi-user-prekey-bundle-qualified", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -30601,7 +31312,8 @@ }, "/users/{uid_domain}/{uid}": { "get": { - "description": " [internal route ID: \"get-user-qualified\"]\n\nCalls federation service brig on get-users-by-ids", + "description": " [internal route ID: \"get-user-qualified\"]\n\n", + "operationId": "get-user-qualified", "parameters": [ { "in": "path", @@ -30713,7 +31425,8 @@ }, "/users/{uid_domain}/{uid}/clients": { "get": { - "description": " [internal route ID: \"get-user-clients-qualified\"]\n\nCalls federation service brig on get-user-clients", + "description": " [internal route ID: \"get-user-clients-qualified\"]\n\n", + "operationId": "get-user-clients-qualified", "parameters": [ { "in": "path", @@ -30754,7 +31467,8 @@ }, "/users/{uid_domain}/{uid}/clients/{client}": { "get": { - "description": " [internal route ID: \"get-user-client-qualified\"]\n\nCalls federation service brig on get-user-clients", + "description": " [internal route ID: \"get-user-client-qualified\"]\n\n", + "operationId": "get-user-client-qualified", "parameters": [ { "in": "path", @@ -30801,7 +31515,8 @@ }, "/users/{uid_domain}/{uid}/prekeys": { "get": { - "description": " [internal route ID: \"get-users-prekey-bundle-qualified\"]\n\nCalls federation service brig on claim-prekey-bundle", + "description": " [internal route ID: \"get-users-prekey-bundle-qualified\"]\n\n", + "operationId": "get-users-prekey-bundle-qualified", "parameters": [ { "in": "path", @@ -30839,7 +31554,8 @@ }, "/users/{uid_domain}/{uid}/prekeys/{client}": { "get": { - "description": " [internal route ID: \"get-users-prekeys-client-qualified\"]\n\nCalls federation service brig on claim-prekey", + "description": " [internal route ID: \"get-users-prekeys-client-qualified\"]\n\n", + "operationId": "get-users-prekeys-client-qualified", "parameters": [ { "in": "path", @@ -30887,6 +31603,7 @@ "/users/{uid_domain}/{uid}/supported-protocols": { "get": { "description": " [internal route ID: \"get-supported-protocols\"]\n\n", + "operationId": "get-supported-protocols", "parameters": [ { "in": "path", @@ -30938,6 +31655,7 @@ "/users/{uid}/email": { "put": { "description": " [internal route ID: \"update-user-email\"]\n\nIf the user has a pending email validation, the validation email will be resent.", + "operationId": "update-user-email", "parameters": [ { "description": "User Id", @@ -30981,6 +31699,7 @@ "/users/{uid}/rich-info": { "get": { "description": " [internal route ID: \"get-rich-info\"]\n\n", + "operationId": "get-rich-info", "parameters": [ { "description": "User Id", @@ -31053,6 +31772,7 @@ "/verification-code/send": { "post": { "description": " [internal route ID: \"send-verification-code\"]\n\n", + "operationId": "send-verification-code", "requestBody": { "content": { "application/json;charset=utf-8": { @@ -31079,7 +31799,7 @@ ], "servers": [ { - "url": "/v6" + "url": "/v8" } ] } diff --git a/services/brig/src/Brig/API/Public.hs b/services/brig/src/Brig/API/Public.hs index 1ebeea8615f..5a5171ab9fc 100644 --- a/services/brig/src/Brig/API/Public.hs +++ b/services/brig/src/Brig/API/Public.hs @@ -453,15 +453,20 @@ servantSitemap = userClientAPI :: ServerT UserClientAPI (Handler r) userClientAPI = - Named @"add-client@v7" addClient + Named @"add-client@v6" addClient + :<|> Named @"add-client@v7" addClient :<|> Named @"add-client" addClient + :<|> Named @"update-client@v6" API.updateClient :<|> Named @"update-client@v7" API.updateClient :<|> Named @"update-client" API.updateClient :<|> Named @"delete-client" deleteClient + :<|> Named @"list-clients@v6" listClients :<|> Named @"list-clients@v7" listClients :<|> Named @"list-clients" listClients + :<|> Named @"get-client@v6" getClient :<|> Named @"get-client@v7" getClient :<|> Named @"get-client" getClient + :<|> Named @"get-client-capabilities@v6" getClientCapabilities :<|> Named @"get-client-capabilities@v7" getClientCapabilities :<|> Named @"get-client-capabilities" getClientCapabilities :<|> Named @"get-client-prekeys" getClientPrekeys diff --git a/services/brig/src/Brig/Provider/API.hs b/services/brig/src/Brig/Provider/API.hs index c54362abcd7..a43d284157b 100644 --- a/services/brig/src/Brig/Provider/API.hs +++ b/services/brig/src/Brig/Provider/API.hs @@ -153,6 +153,7 @@ botAPI = :<|> Named @"bot-delete-self" botDeleteSelf :<|> Named @"bot-list-prekeys" botListPrekeys :<|> Named @"bot-update-prekeys" botUpdatePrekeys + :<|> Named @"bot-get-client@v6" botGetClient :<|> Named @"bot-get-client@v7" botGetClient :<|> Named @"bot-get-client" botGetClient :<|> Named @"bot-claim-users-prekeys" botClaimUsersPrekeys diff --git a/services/brig/test/integration/API/User/Client.hs b/services/brig/test/integration/API/User/Client.hs index 82546fd9d8e..c73e81861f0 100644 --- a/services/brig/test/integration/API/User/Client.hs +++ b/services/brig/test/integration/API/User/Client.hs @@ -259,7 +259,7 @@ testAddGetClient params brig cannon = do let etype = j ^? key "type" . _String let eclient = j ^? key "client" etype @?= Just "user.client-add" - fmap fromJSON eclient @?= Just (Success (Versioned @'V7 c)) + fmap fromJSON eclient @?= Just (Success (Versioned @'V6 c)) pure c liftIO $ clientMLSPublicKeys c @?= keys getClient brig uid (clientId c) !!! do