From 96f1ff6cdc033927001eb778f3cb683227cbad0b Mon Sep 17 00:00:00 2001 From: Joshua Hight Date: Sat, 4 Feb 2023 01:10:00 -0800 Subject: [PATCH 1/7] output from spec generator --- awesomeness.sh | 10 + bin/generate-api.sh | 2 +- codegen/specs/stytch/.oauth.yml.swp | Bin 0 -> 16384 bytes codegen/specs/stytch/biometric.yml | 70 + codegen/specs/stytch/cname_records.yml | 2 + .../{crypto_wallets.yml => crypto_wallet.yml} | 33 +- codegen/specs/stytch/debug.yml | 10 + codegen/specs/stytch/email_template.yml | 2 + codegen/specs/stytch/magic.yml | 278 +++ codegen/specs/stytch/magic_link_url.yml | 2 + codegen/specs/stytch/magic_links.yml | 127 -- codegen/specs/stytch/multitenant_magic.yml | 77 + codegen/specs/stytch/multitenant_session.yml | 45 + codegen/specs/stytch/oauth.yml | 549 +++++- codegen/specs/stytch/organization.yml | 107 ++ codegen/specs/stytch/otp.yml | 276 +-- codegen/specs/stytch/password.yml | 176 ++ codegen/specs/stytch/passwords.yml | 159 -- codegen/specs/stytch/project.yml | 2 + codegen/specs/stytch/public_token.yml | 2 + codegen/specs/stytch/script.yml | 2 + codegen/specs/stytch/sdk.yml | 2 + codegen/specs/stytch/secret.yml | 2 + codegen/specs/stytch/session.yml | 59 + codegen/specs/stytch/sessions.yml | 68 - codegen/specs/stytch/sso.yml | 112 ++ codegen/specs/stytch/{totps.yml => totp.yml} | 58 +- codegen/specs/stytch/user.yml | 210 +++ codegen/specs/stytch/users.yml | 193 -- codegen/specs/stytch/webauthn.yml | 41 +- stytch/api/biometric_service.py | 209 +++ stytch/api/cname_record_service.py | 31 + stytch/api/crypto_wallet_service.py | 157 ++ stytch/api/debug_service.py | 50 + stytch/api/email_template_service.py | 31 + stytch/api/magic_link_url_service.py | 31 + stytch/api/magic_service.py | 819 +++++++++ stytch/api/multi_tenant_magic_service.py | 248 +++ stytch/api/multi_tenant_session_service.py | 168 ++ stytch/api/o_auth_service.py | 1547 +++++++++++++++++ stytch/api/organization_service.py | 336 ++++ stytch/api/otp_service.py | 480 +++++ stytch/api/password_service.py | 489 ++++++ stytch/api/project_service.py | 31 + stytch/api/public_token_service.py | 31 + stytch/api/script_service.py | 31 + stytch/api/sdk_service.py | 31 + stytch/api/secret_service.py | 31 + stytch/api/session_service.py | 214 +++ stytch/api/sso_service.py | 335 ++++ stytch/api/totp_service.py | 207 +++ stytch/api/user_service.py | 532 ++++++ stytch/api/web_authn_service.py | 207 +++ stytch/models/biometric_service.py | 39 + stytch/models/cname_record_service.py | 1 + stytch/models/crypto_wallet_service.py | 21 + stytch/models/debug_service.py | 10 + stytch/models/email_template_service.py | 1 + stytch/models/magic_link_url_service.py | 1 + stytch/models/magic_service.py | 85 + stytch/models/multi_tenant_magic_service.py | 29 + stytch/models/multi_tenant_session_service.py | 21 + stytch/models/o_auth_service.py | 200 +++ stytch/models/organization_service.py | 42 + stytch/models/otp_service.py | 55 + stytch/models/password_service.py | 71 + stytch/models/project_service.py | 1 + stytch/models/public_token_service.py | 1 + stytch/models/script_service.py | 1 + stytch/models/sdk_service.py | 1 + stytch/models/secret_service.py | 1 + stytch/models/session_service.py | 32 + stytch/models/sso_service.py | 50 + stytch/models/totp_service.py | 41 + stytch/models/user_service.py | 117 ++ stytch/models/web_authn_service.py | 33 + 76 files changed, 9016 insertions(+), 760 deletions(-) create mode 100755 awesomeness.sh create mode 100644 codegen/specs/stytch/.oauth.yml.swp create mode 100644 codegen/specs/stytch/biometric.yml create mode 100644 codegen/specs/stytch/cname_records.yml rename codegen/specs/stytch/{crypto_wallets.yml => crypto_wallet.yml} (74%) create mode 100644 codegen/specs/stytch/debug.yml create mode 100644 codegen/specs/stytch/email_template.yml create mode 100644 codegen/specs/stytch/magic.yml create mode 100644 codegen/specs/stytch/magic_link_url.yml delete mode 100644 codegen/specs/stytch/magic_links.yml create mode 100644 codegen/specs/stytch/multitenant_magic.yml create mode 100644 codegen/specs/stytch/multitenant_session.yml create mode 100644 codegen/specs/stytch/organization.yml create mode 100644 codegen/specs/stytch/password.yml delete mode 100644 codegen/specs/stytch/passwords.yml create mode 100644 codegen/specs/stytch/project.yml create mode 100644 codegen/specs/stytch/public_token.yml create mode 100644 codegen/specs/stytch/script.yml create mode 100644 codegen/specs/stytch/sdk.yml create mode 100644 codegen/specs/stytch/secret.yml create mode 100644 codegen/specs/stytch/session.yml delete mode 100644 codegen/specs/stytch/sessions.yml create mode 100644 codegen/specs/stytch/sso.yml rename codegen/specs/stytch/{totps.yml => totp.yml} (71%) create mode 100644 codegen/specs/stytch/user.yml delete mode 100644 codegen/specs/stytch/users.yml create mode 100644 stytch/api/biometric_service.py create mode 100644 stytch/api/cname_record_service.py create mode 100644 stytch/api/crypto_wallet_service.py create mode 100644 stytch/api/debug_service.py create mode 100644 stytch/api/email_template_service.py create mode 100644 stytch/api/magic_link_url_service.py create mode 100644 stytch/api/magic_service.py create mode 100644 stytch/api/multi_tenant_magic_service.py create mode 100644 stytch/api/multi_tenant_session_service.py create mode 100644 stytch/api/o_auth_service.py create mode 100644 stytch/api/organization_service.py create mode 100644 stytch/api/otp_service.py create mode 100644 stytch/api/password_service.py create mode 100644 stytch/api/project_service.py create mode 100644 stytch/api/public_token_service.py create mode 100644 stytch/api/script_service.py create mode 100644 stytch/api/sdk_service.py create mode 100644 stytch/api/secret_service.py create mode 100644 stytch/api/session_service.py create mode 100644 stytch/api/sso_service.py create mode 100644 stytch/api/totp_service.py create mode 100644 stytch/api/user_service.py create mode 100644 stytch/api/web_authn_service.py create mode 100644 stytch/models/biometric_service.py create mode 100644 stytch/models/cname_record_service.py create mode 100644 stytch/models/crypto_wallet_service.py create mode 100644 stytch/models/debug_service.py create mode 100644 stytch/models/email_template_service.py create mode 100644 stytch/models/magic_link_url_service.py create mode 100644 stytch/models/magic_service.py create mode 100644 stytch/models/multi_tenant_magic_service.py create mode 100644 stytch/models/multi_tenant_session_service.py create mode 100644 stytch/models/o_auth_service.py create mode 100644 stytch/models/organization_service.py create mode 100644 stytch/models/otp_service.py create mode 100644 stytch/models/password_service.py create mode 100644 stytch/models/project_service.py create mode 100644 stytch/models/public_token_service.py create mode 100644 stytch/models/script_service.py create mode 100644 stytch/models/sdk_service.py create mode 100644 stytch/models/secret_service.py create mode 100644 stytch/models/session_service.py create mode 100644 stytch/models/sso_service.py create mode 100644 stytch/models/totp_service.py create mode 100644 stytch/models/user_service.py create mode 100644 stytch/models/web_authn_service.py diff --git a/awesomeness.sh b/awesomeness.sh new file mode 100755 index 00000000..1d1b995c --- /dev/null +++ b/awesomeness.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# This feels like sliding down a warm fudge mountain; I dearly hope the github action +# we write if this works can maintain this simplicity +find codegen/specs/stytch -name "*.yml" -delete + +find ../protobuf/api -name "*.yml.python" | +while read line +do + cp $line `echo $line | sed 's|.*/\([^.]*\).yml.python$|codegen/specs/stytch/\1.yml|'` +done diff --git a/bin/generate-api.sh b/bin/generate-api.sh index 65772d46..d78812b4 100755 --- a/bin/generate-api.sh +++ b/bin/generate-api.sh @@ -3,4 +3,4 @@ SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) cd "$SCRIPT_DIR/.." || exit 1 -python -m codegen.generate codegen/specs/stytch/ stytch/api stytch/models --docs_dir=codegen/specs/stytch/docs +python3 -m codegen.generate codegen/specs/stytch/ stytch/api stytch/models --docs_dir=codegen/specs/stytch/docs diff --git a/codegen/specs/stytch/.oauth.yml.swp b/codegen/specs/stytch/.oauth.yml.swp new file mode 100644 index 0000000000000000000000000000000000000000..c5ff02e26f9e32f48cd4fd8e1ed97232235f7064 GIT binary patch literal 16384 zcmeI2ZD<@t7{^E3sC~Bwsmw_>sGEJ*lr}`rQ6Rqx6W%JKb|FIpy1{ULN+wsIs;xP zQQq1`od<(puysomtn>nhdNqfQr~xxPaxz>D3#ZT;4vRwIXPh9%^32chkU3npWdd3f zg_Xm_+F@!&HD8SaMuDj*uz;*t-4;LU&CBkzmfW;;YKNI#MggOMQNSo*6fg=H1&jhl z0i(eGLIDvrktc8^*Xpa;r$4W$`Mj(**;j5)st=O%yQJGk^!}tFY5z;N@6+ugx*=(w zrT4e%&r3D!dbjy73K#{90!9I&fKk9GU=%P47zK<1MggOMQD6oN&>SJxGeppDzm*5z91sni_pc6a*R)9s|_XUJ}23`jv zU=VBt>%eW`@_a(Zz=z;9Fbej9e((^u16-U($Z2p490vP=4ekd^!EEryTtd!(6X0Di z3Z4Pm!D?_9SPU-A!8L*pzzbjiYyo$JCh*M-gnSH+fKl)`=mqP+a;j!Y+QKrRH!I#+EuR)y z*5ZtFH}LITDWXFDQ*`~3V4SFKmPMnyErvsM?G9xJ>TTyD+F@<59tnJ=yVZ^+fWvx6@-!03L64<$*NL?RFlz&^iQpLuRLJCyg9kHAn zF-O>?$gAGJtHijlT?}67-Lj!2YxyP5i%%Xg9tJ*VN=mK4G{sdviwZ%VLP|6X+q7kazvb#u)$@c^@tig=Og4gs4JTa{ zC}F{}*GHYf8jqt^D%%c^`c*KH_E72^w&S^QwKWG`nX8fxs!q&&RRl)rMs@qFmxlFj zmzua#fEwTO38pA@Z_+_*TK|7cW1Zzp;w3;#=flt8O z;2@BBzXvvgW^fB=0%OSUPl7`r$^F;j|Ha@ua{8~pQLqQ>1owgEU?E8I{S(OTj{uqT z?*ThO7g!DEgA33?>Tz0XVm70IQNSo*6fg=H1+EeW5NcV~r8pgGPN62E0?s%Zi&)-8 zpr-2F)z#YRR8Ep;%^sp23csl;uT?ImPrs@nOWV4ZqGQJLc~tqm5@MDc{*4+-{g^n; zYlm3m_Pgb(Qaa8pzb`Oln)nq None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "biometric_service" + + def BiometricsRegisterStart( + self, + user_id: str, + public_key: str, + ) -> BiometricsregisterstartResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "public_key": public_key, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/biometrics/register/start" + ) + + res = self.sync_client.post(url, json=payload) + return BiometricsregisterstartResponse.from_json( + res.response.status_code, res.json + ) + + async def BiometricsRegisterStart_async( + self, + user_id: str, + public_key: str, + ) -> BiometricsregisterstartResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "public_key": public_key, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/biometrics/register/start" + ) + + res = await self.async_client.post(url, json=payload) + return BiometricsregisterstartResponse.from_json(res.response.status, res.json) + + def BiometricsRegister( + self, + biometric_registration_id: str, + signature: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> BiometricsregisterResponse: + payload: Dict[str, Any] = { + "biometric_registration_id": biometric_registration_id, + "signature": signature, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/biometrics/register") + + res = self.sync_client.post(url, json=payload) + return BiometricsregisterResponse.from_json(res.response.status_code, res.json) + + async def BiometricsRegister_async( + self, + biometric_registration_id: str, + signature: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> BiometricsregisterResponse: + payload: Dict[str, Any] = { + "biometric_registration_id": biometric_registration_id, + "signature": signature, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/biometrics/register") + + res = await self.async_client.post(url, json=payload) + return BiometricsregisterResponse.from_json(res.response.status, res.json) + + def BiometricsAuthenticateStart( + self, + public_key: str, + ) -> BiometricsauthenticatestartResponse: + payload: Dict[str, Any] = { + "public_key": public_key, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/biometrics/authenticate/start" + ) + + res = self.sync_client.post(url, json=payload) + return BiometricsauthenticatestartResponse.from_json( + res.response.status_code, res.json + ) + + async def BiometricsAuthenticateStart_async( + self, + public_key: str, + ) -> BiometricsauthenticatestartResponse: + payload: Dict[str, Any] = { + "public_key": public_key, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/biometrics/authenticate/start" + ) + + res = await self.async_client.post(url, json=payload) + return BiometricsauthenticatestartResponse.from_json( + res.response.status, res.json + ) + + def BiometricsAuthenticate( + self, + biometric_registration_id: str, + signature: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> BiometricsauthenticateResponse: + payload: Dict[str, Any] = { + "biometric_registration_id": biometric_registration_id, + "signature": signature, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/biometrics/authenticate" + ) + + res = self.sync_client.post(url, json=payload) + return BiometricsauthenticateResponse.from_json( + res.response.status_code, res.json + ) + + async def BiometricsAuthenticate_async( + self, + biometric_registration_id: str, + signature: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> BiometricsauthenticateResponse: + payload: Dict[str, Any] = { + "biometric_registration_id": biometric_registration_id, + "signature": signature, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/biometrics/authenticate" + ) + + res = await self.async_client.post(url, json=payload) + return BiometricsauthenticateResponse.from_json(res.response.status, res.json) diff --git a/stytch/api/cname_record_service.py b/stytch/api/cname_record_service.py new file mode 100644 index 00000000..230f896c --- /dev/null +++ b/stytch/api/cname_record_service.py @@ -0,0 +1,31 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.cname_record_service import ( +) + + +class CNAMERecordService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "cname_record_service" + diff --git a/stytch/api/crypto_wallet_service.py b/stytch/api/crypto_wallet_service.py new file mode 100644 index 00000000..16d423b4 --- /dev/null +++ b/stytch/api/crypto_wallet_service.py @@ -0,0 +1,157 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, Optional + + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.crypto_wallet_service import ( + CryptowalletsauthenticatestartResponse, + CryptowalletsauthenticateResponse, +) + + +class CryptoWalletService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "crypto_wallet_service" + + def CryptoWalletsAuthenticateStart( + self, + crypto_wallet_type: str, + crypto_wallet_address: str, + user_id: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> CryptowalletsauthenticatestartResponse: + payload: Dict[str, Any] = { + "crypto_wallet_type": crypto_wallet_type, + "crypto_wallet_address": crypto_wallet_address, + } + + if user_id is not None: + payload["user_id"] = user_id + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/crypto_wallets/authenticate/start" + ) + + res = self.sync_client.post(url, json=payload) + return CryptowalletsauthenticatestartResponse.from_json( + res.response.status_code, res.json + ) + + async def CryptoWalletsAuthenticateStart_async( + self, + crypto_wallet_type: str, + crypto_wallet_address: str, + user_id: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> CryptowalletsauthenticatestartResponse: + payload: Dict[str, Any] = { + "crypto_wallet_type": crypto_wallet_type, + "crypto_wallet_address": crypto_wallet_address, + } + + if user_id is not None: + payload["user_id"] = user_id + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/crypto_wallets/authenticate/start" + ) + + res = await self.async_client.post(url, json=payload) + return CryptowalletsauthenticatestartResponse.from_json( + res.response.status, res.json + ) + + def CryptoWalletsAuthenticate( + self, + crypto_wallet_type: str, + crypto_wallet_address: str, + signature: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> CryptowalletsauthenticateResponse: + payload: Dict[str, Any] = { + "crypto_wallet_type": crypto_wallet_type, + "crypto_wallet_address": crypto_wallet_address, + "signature": signature, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/crypto_wallets/authenticate" + ) + + res = self.sync_client.post(url, json=payload) + return CryptowalletsauthenticateResponse.from_json( + res.response.status_code, res.json + ) + + async def CryptoWalletsAuthenticate_async( + self, + crypto_wallet_type: str, + crypto_wallet_address: str, + signature: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> CryptowalletsauthenticateResponse: + payload: Dict[str, Any] = { + "crypto_wallet_type": crypto_wallet_type, + "crypto_wallet_address": crypto_wallet_address, + "signature": signature, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/crypto_wallets/authenticate" + ) + + res = await self.async_client.post(url, json=payload) + return CryptowalletsauthenticateResponse.from_json( + res.response.status, res.json + ) diff --git a/stytch/api/debug_service.py b/stytch/api/debug_service.py new file mode 100644 index 00000000..d1c9762c --- /dev/null +++ b/stytch/api/debug_service.py @@ -0,0 +1,50 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict + + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.debug_service import ( + WhoamiResponse, +) + + +class DebugService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "debug_service" + + def WhoAmI( + self, + ) -> WhoamiResponse: + payload: Dict[str, Any] = {} + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/debug/whoami") + + res = self.sync_client.get(url, params=payload) + return WhoamiResponse.from_json(res.response.status_code, res.json) + + async def WhoAmI_async( + self, + ) -> WhoamiResponse: + payload: Dict[str, Any] = {} + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/debug/whoami") + + res = await self.async_client.get(url, params=payload) + return WhoamiResponse.from_json(res.response.status, res.json) diff --git a/stytch/api/email_template_service.py b/stytch/api/email_template_service.py new file mode 100644 index 00000000..3c21db56 --- /dev/null +++ b/stytch/api/email_template_service.py @@ -0,0 +1,31 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.email_template_service import ( +) + + +class EmailTemplateService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "email_template_service" + diff --git a/stytch/api/magic_link_url_service.py b/stytch/api/magic_link_url_service.py new file mode 100644 index 00000000..ef29787d --- /dev/null +++ b/stytch/api/magic_link_url_service.py @@ -0,0 +1,31 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.magic_link_url_service import ( +) + + +class MagicLinkURLService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "magic_link_url_service" + diff --git a/stytch/api/magic_service.py b/stytch/api/magic_service.py new file mode 100644 index 00000000..ba169579 --- /dev/null +++ b/stytch/api/magic_service.py @@ -0,0 +1,819 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.magic_service import ( + SendmagicbyemailResponse, + MagiclinksemailsendResponse, + AuthenticatemagicResponse, + MagiclinksauthenticateResponse, + MagiclinksemailloginorcreateResponse, + SdkmagiclinksemailloginorcreateResponse, + InvitebyemailResponse, + MagiclinksemailinviteResponse, + MagiclinksemailrevokeinviteResponse, + MagiclinkredirectResponse, + MagiclinksredirectcaptchaResponse, + MagiclinkscreateResponse, +) + + +class MagicService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "magic_service" + + def SendMagicByEmail( + self, + email: str, + magic_link_url: Optional[str] = None, + expiration_minutes: Optional[int] = None, + login_template_id: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + login_magic_link_url: str, + signup_magic_link_url: str, + login_expiration_minutes: Optional[int] = None, + signup_expiration_minutes: Optional[int] = None, + code_challenge: Optional[str] = None, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + locale: Optional[str] = None, + signup_template_id: Optional[str] = None, + ) -> SendmagicbyemailResponse: + + payload: Dict[str, Any] = { + "email": email, + "login_magic_link_url": login_magic_link_url, + "signup_magic_link_url": signup_magic_link_url, + "user_id": user_id, + } + + if magic_link_url is not None: + payload["magic_link_url"] = magic_link_url + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if attributes is not None: + payload["attributes"] = attributes + if login_expiration_minutes is not None: + payload["login_expiration_minutes"] = login_expiration_minutes + if signup_expiration_minutes is not None: + payload["signup_expiration_minutes"] = signup_expiration_minutes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if locale is not None: + payload["locale"] = locale + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/send_by_email") + + res = self.sync_client.post(url, json=payload) + return SendmagicbyemailResponse.from_json(res.response.status_code, res.json) + + async def SendMagicByEmail_async( + self, + email: str, + magic_link_url: Optional[str] = None, + expiration_minutes: Optional[int] = None, + login_template_id: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + login_magic_link_url: str, + signup_magic_link_url: str, + login_expiration_minutes: Optional[int] = None, + signup_expiration_minutes: Optional[int] = None, + code_challenge: Optional[str] = None, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + locale: Optional[str] = None, + signup_template_id: Optional[str] = None, + ) -> SendmagicbyemailResponse: + + payload: Dict[str, Any] = { + "email": email, + "login_magic_link_url": login_magic_link_url, + "signup_magic_link_url": signup_magic_link_url, + "user_id": user_id, + } + + if magic_link_url is not None: + payload["magic_link_url"] = magic_link_url + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if attributes is not None: + payload["attributes"] = attributes + if login_expiration_minutes is not None: + payload["login_expiration_minutes"] = login_expiration_minutes + if signup_expiration_minutes is not None: + payload["signup_expiration_minutes"] = signup_expiration_minutes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if locale is not None: + payload["locale"] = locale + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/send_by_email") + + res = await self.async_client.post(url, json=payload) + return SendmagicbyemailResponse.from_json(res.response.status, res.json) + + def MagicLinksEmailSend( + self, + email: str, + magic_link_url: Optional[str] = None, + expiration_minutes: Optional[int] = None, + login_template_id: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + login_magic_link_url: str, + signup_magic_link_url: str, + login_expiration_minutes: Optional[int] = None, + signup_expiration_minutes: Optional[int] = None, + code_challenge: Optional[str] = None, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + locale: Optional[str] = None, + signup_template_id: Optional[str] = None, + ) -> MagiclinksemailsendResponse: + + payload: Dict[str, Any] = { + "email": email, + "login_magic_link_url": login_magic_link_url, + "signup_magic_link_url": signup_magic_link_url, + "user_id": user_id, + } + + if magic_link_url is not None: + payload["magic_link_url"] = magic_link_url + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if attributes is not None: + payload["attributes"] = attributes + if login_expiration_minutes is not None: + payload["login_expiration_minutes"] = login_expiration_minutes + if signup_expiration_minutes is not None: + payload["signup_expiration_minutes"] = signup_expiration_minutes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if locale is not None: + payload["locale"] = locale + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/email/send") + + res = self.sync_client.post(url, json=payload) + return MagiclinksemailsendResponse.from_json(res.response.status_code, res.json) + + async def MagicLinksEmailSend_async( + self, + email: str, + magic_link_url: Optional[str] = None, + expiration_minutes: Optional[int] = None, + login_template_id: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + login_magic_link_url: str, + signup_magic_link_url: str, + login_expiration_minutes: Optional[int] = None, + signup_expiration_minutes: Optional[int] = None, + code_challenge: Optional[str] = None, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + locale: Optional[str] = None, + signup_template_id: Optional[str] = None, + ) -> MagiclinksemailsendResponse: + + payload: Dict[str, Any] = { + "email": email, + "login_magic_link_url": login_magic_link_url, + "signup_magic_link_url": signup_magic_link_url, + "user_id": user_id, + } + + if magic_link_url is not None: + payload["magic_link_url"] = magic_link_url + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if attributes is not None: + payload["attributes"] = attributes + if login_expiration_minutes is not None: + payload["login_expiration_minutes"] = login_expiration_minutes + if signup_expiration_minutes is not None: + payload["signup_expiration_minutes"] = signup_expiration_minutes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if locale is not None: + payload["locale"] = locale + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/email/send") + + res = await self.async_client.post(url, json=payload) + return MagiclinksemailsendResponse.from_json(res.response.status, res.json) + + def AuthenticateMagic( + self, + token: str, + attributes: Optional[Dict[str, str]] = None, + options: Optional[Dict[str, str]] = None, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + code_verifier: Optional[str] = None, + ) -> AuthenticatemagicResponse: + + payload: Dict[str, Any] = { + "token": token, + } + + if attributes is not None: + payload["attributes"] = attributes + if options is not None: + payload["options"] = options + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if code_verifier is not None: + payload["code_verifier"] = code_verifier + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/{token}/authenticate") + + res = self.sync_client.post(url, json=payload) + return AuthenticatemagicResponse.from_json(res.response.status_code, res.json) + + async def AuthenticateMagic_async( + self, + token: str, + attributes: Optional[Dict[str, str]] = None, + options: Optional[Dict[str, str]] = None, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + code_verifier: Optional[str] = None, + ) -> AuthenticatemagicResponse: + + payload: Dict[str, Any] = { + "token": token, + } + + if attributes is not None: + payload["attributes"] = attributes + if options is not None: + payload["options"] = options + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if code_verifier is not None: + payload["code_verifier"] = code_verifier + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/{token}/authenticate") + + res = await self.async_client.post(url, json=payload) + return AuthenticatemagicResponse.from_json(res.response.status, res.json) + + def MagicLinksAuthenticate( + self, + token: str, + attributes: Optional[Dict[str, str]] = None, + options: Optional[Dict[str, str]] = None, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + code_verifier: Optional[str] = None, + ) -> MagiclinksauthenticateResponse: + + payload: Dict[str, Any] = { + "token": token, + } + + if attributes is not None: + payload["attributes"] = attributes + if options is not None: + payload["options"] = options + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if code_verifier is not None: + payload["code_verifier"] = code_verifier + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/authenticate") + + res = self.sync_client.post(url, json=payload) + return MagiclinksauthenticateResponse.from_json(res.response.status_code, res.json) + + async def MagicLinksAuthenticate_async( + self, + token: str, + attributes: Optional[Dict[str, str]] = None, + options: Optional[Dict[str, str]] = None, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + code_verifier: Optional[str] = None, + ) -> MagiclinksauthenticateResponse: + + payload: Dict[str, Any] = { + "token": token, + } + + if attributes is not None: + payload["attributes"] = attributes + if options is not None: + payload["options"] = options + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if code_verifier is not None: + payload["code_verifier"] = code_verifier + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/authenticate") + + res = await self.async_client.post(url, json=payload) + return MagiclinksauthenticateResponse.from_json(res.response.status, res.json) + + def MagicLinksEmailLoginOrCreate( + self, + email: str, + login_magic_link_url: str, + signup_magic_link_url: str, + login_expiration_minutes: Optional[int] = None, + signup_expiration_minutes: Optional[int] = None, + login_template_id: Optional[str] = None, + signup_template_id: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + create_user_as_pending: bool, + code_challenge: Optional[str] = None, + locale: Optional[str] = None, + ) -> MagiclinksemailloginorcreateResponse: + + payload: Dict[str, Any] = { + "email": email, + "login_magic_link_url": login_magic_link_url, + "signup_magic_link_url": signup_magic_link_url, + "create_user_as_pending": create_user_as_pending, + } + + if login_expiration_minutes is not None: + payload["login_expiration_minutes"] = login_expiration_minutes + if signup_expiration_minutes is not None: + payload["signup_expiration_minutes"] = signup_expiration_minutes + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + if attributes is not None: + payload["attributes"] = attributes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/email/login_or_create") + + res = self.sync_client.post(url, json=payload) + return MagiclinksemailloginorcreateResponse.from_json(res.response.status_code, res.json) + + async def MagicLinksEmailLoginOrCreate_async( + self, + email: str, + login_magic_link_url: str, + signup_magic_link_url: str, + login_expiration_minutes: Optional[int] = None, + signup_expiration_minutes: Optional[int] = None, + login_template_id: Optional[str] = None, + signup_template_id: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + create_user_as_pending: bool, + code_challenge: Optional[str] = None, + locale: Optional[str] = None, + ) -> MagiclinksemailloginorcreateResponse: + + payload: Dict[str, Any] = { + "email": email, + "login_magic_link_url": login_magic_link_url, + "signup_magic_link_url": signup_magic_link_url, + "create_user_as_pending": create_user_as_pending, + } + + if login_expiration_minutes is not None: + payload["login_expiration_minutes"] = login_expiration_minutes + if signup_expiration_minutes is not None: + payload["signup_expiration_minutes"] = signup_expiration_minutes + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + if attributes is not None: + payload["attributes"] = attributes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/email/login_or_create") + + res = await self.async_client.post(url, json=payload) + return MagiclinksemailloginorcreateResponse.from_json(res.response.status, res.json) + + def SDKMagicLinksEmailLoginOrCreate( + self, + public_token: str, + request: None, + ) -> SdkmagiclinksemailloginorcreateResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + } + + if request is not None: + payload["request"] = request + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/sdk/magic_links/email/login_or_create") + + res = self.sync_client.post(url, json=payload) + return SdkmagiclinksemailloginorcreateResponse.from_json(res.response.status_code, res.json) + + async def SDKMagicLinksEmailLoginOrCreate_async( + self, + public_token: str, + request: None, + ) -> SdkmagiclinksemailloginorcreateResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + } + + if request is not None: + payload["request"] = request + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/sdk/magic_links/email/login_or_create") + + res = await self.async_client.post(url, json=payload) + return SdkmagiclinksemailloginorcreateResponse.from_json(res.response.status, res.json) + + def InviteByEmail( + self, + email: str, + magic_link_url: Optional[str] = None, + expiration_minutes: Optional[int] = None, + invite_template_id: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + name: None, + invite_magic_link_url: str, + invite_expiration_minutes: Optional[int] = None, + locale: Optional[str] = None, + ) -> InvitebyemailResponse: + + payload: Dict[str, Any] = { + "email": email, + "invite_magic_link_url": invite_magic_link_url, + } + + if magic_link_url is not None: + payload["magic_link_url"] = magic_link_url + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if invite_template_id is not None: + payload["invite_template_id"] = invite_template_id + if attributes is not None: + payload["attributes"] = attributes + if name is not None: + payload["name"] = name + if invite_expiration_minutes is not None: + payload["invite_expiration_minutes"] = invite_expiration_minutes + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/invite_by_email") + + res = self.sync_client.post(url, json=payload) + return InvitebyemailResponse.from_json(res.response.status_code, res.json) + + async def InviteByEmail_async( + self, + email: str, + magic_link_url: Optional[str] = None, + expiration_minutes: Optional[int] = None, + invite_template_id: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + name: None, + invite_magic_link_url: str, + invite_expiration_minutes: Optional[int] = None, + locale: Optional[str] = None, + ) -> InvitebyemailResponse: + + payload: Dict[str, Any] = { + "email": email, + "invite_magic_link_url": invite_magic_link_url, + } + + if magic_link_url is not None: + payload["magic_link_url"] = magic_link_url + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if invite_template_id is not None: + payload["invite_template_id"] = invite_template_id + if attributes is not None: + payload["attributes"] = attributes + if name is not None: + payload["name"] = name + if invite_expiration_minutes is not None: + payload["invite_expiration_minutes"] = invite_expiration_minutes + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/invite_by_email") + + res = await self.async_client.post(url, json=payload) + return InvitebyemailResponse.from_json(res.response.status, res.json) + + def MagicLinksEmailInvite( + self, + email: str, + magic_link_url: Optional[str] = None, + expiration_minutes: Optional[int] = None, + invite_template_id: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + name: None, + invite_magic_link_url: str, + invite_expiration_minutes: Optional[int] = None, + locale: Optional[str] = None, + ) -> MagiclinksemailinviteResponse: + + payload: Dict[str, Any] = { + "email": email, + "invite_magic_link_url": invite_magic_link_url, + } + + if magic_link_url is not None: + payload["magic_link_url"] = magic_link_url + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if invite_template_id is not None: + payload["invite_template_id"] = invite_template_id + if attributes is not None: + payload["attributes"] = attributes + if name is not None: + payload["name"] = name + if invite_expiration_minutes is not None: + payload["invite_expiration_minutes"] = invite_expiration_minutes + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/email/invite") + + res = self.sync_client.post(url, json=payload) + return MagiclinksemailinviteResponse.from_json(res.response.status_code, res.json) + + async def MagicLinksEmailInvite_async( + self, + email: str, + magic_link_url: Optional[str] = None, + expiration_minutes: Optional[int] = None, + invite_template_id: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + name: None, + invite_magic_link_url: str, + invite_expiration_minutes: Optional[int] = None, + locale: Optional[str] = None, + ) -> MagiclinksemailinviteResponse: + + payload: Dict[str, Any] = { + "email": email, + "invite_magic_link_url": invite_magic_link_url, + } + + if magic_link_url is not None: + payload["magic_link_url"] = magic_link_url + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if invite_template_id is not None: + payload["invite_template_id"] = invite_template_id + if attributes is not None: + payload["attributes"] = attributes + if name is not None: + payload["name"] = name + if invite_expiration_minutes is not None: + payload["invite_expiration_minutes"] = invite_expiration_minutes + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/email/invite") + + res = await self.async_client.post(url, json=payload) + return MagiclinksemailinviteResponse.from_json(res.response.status, res.json) + + def MagicLinksEmailRevokeInvite( + self, + email: str, + ) -> MagiclinksemailrevokeinviteResponse: + + payload: Dict[str, Any] = { + "email": email, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/email/revoke_invite") + + res = self.sync_client.post(url, json=payload) + return MagiclinksemailrevokeinviteResponse.from_json(res.response.status_code, res.json) + + async def MagicLinksEmailRevokeInvite_async( + self, + email: str, + ) -> MagiclinksemailrevokeinviteResponse: + + payload: Dict[str, Any] = { + "email": email, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/email/revoke_invite") + + res = await self.async_client.post(url, json=payload) + return MagiclinksemailrevokeinviteResponse.from_json(res.response.status, res.json) + + def MagicLinkRedirect( + self, + public_token: str, + token: str, + ) -> MagiclinkredirectResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "token": token, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/redirect") + + res = self.sync_client.get(url, params=payload) + return MagiclinkredirectResponse.from_json(res.response.status_code, res.json) + + async def MagicLinkRedirect_async( + self, + public_token: str, + token: str, + ) -> MagiclinkredirectResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "token": token, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/redirect") + + res = await self.async_client.get(url, params=payload) + return MagiclinkredirectResponse.from_json(res.response.status, res.json) + + def MagicLinksRedirectCaptcha( + self, + public_token: str, + redirect_url: str, + captcha: str, + ) -> MagiclinksredirectcaptchaResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "redirect_url": redirect_url, + "captcha": captcha, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/redirect/captcha") + + res = self.sync_client.post(url, json=payload) + return MagiclinksredirectcaptchaResponse.from_json(res.response.status_code, res.json) + + async def MagicLinksRedirectCaptcha_async( + self, + public_token: str, + redirect_url: str, + captcha: str, + ) -> MagiclinksredirectcaptchaResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "redirect_url": redirect_url, + "captcha": captcha, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/redirect/captcha") + + res = await self.async_client.post(url, json=payload) + return MagiclinksredirectcaptchaResponse.from_json(res.response.status, res.json) + + def MagicLinksCreate( + self, + user_id: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + ) -> MagiclinkscreateResponse: + + payload: Dict[str, Any] = { + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links") + + res = self.sync_client.post(url, json=payload) + return MagiclinkscreateResponse.from_json(res.response.status_code, res.json) + + async def MagicLinksCreate_async( + self, + user_id: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + ) -> MagiclinkscreateResponse: + + payload: Dict[str, Any] = { + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links") + + res = await self.async_client.post(url, json=payload) + return MagiclinkscreateResponse.from_json(res.response.status, res.json) + diff --git a/stytch/api/multi_tenant_magic_service.py b/stytch/api/multi_tenant_magic_service.py new file mode 100644 index 00000000..6444eb34 --- /dev/null +++ b/stytch/api/multi_tenant_magic_service.py @@ -0,0 +1,248 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, Optional + + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.multi_tenant_magic_service import ( + MultitenantmagiclinksemailloginorsignupResponse, + MultitenantmagiclinksemailinviteResponse, + MultitenantmagiclinksauthenticateResponse, +) + + +class MultiTenantMagicService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "multi_tenant_magic_service" + + def MultiTenantMagicLinksEmailLoginOrSignup( + self, + organization_id: str, + email_address: str, + create_user_as_pending: bool, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + pkce_code_challenge: Optional[str] = None, + login_template_id: Optional[str] = None, + signup_template_id: Optional[str] = None, + ) -> MultitenantmagiclinksemailloginorsignupResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "create_user_as_pending": create_user_as_pending, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if pkce_code_challenge is not None: + payload["pkce_code_challenge"] = pkce_code_challenge + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/login_or_signup" + ) + + res = self.sync_client.post(url, json=payload) + return MultitenantmagiclinksemailloginorsignupResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantMagicLinksEmailLoginOrSignup_async( + self, + organization_id: str, + email_address: str, + create_user_as_pending: bool, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + pkce_code_challenge: Optional[str] = None, + login_template_id: Optional[str] = None, + signup_template_id: Optional[str] = None, + ) -> MultitenantmagiclinksemailloginorsignupResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "create_user_as_pending": create_user_as_pending, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if pkce_code_challenge is not None: + payload["pkce_code_challenge"] = pkce_code_challenge + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/login_or_signup" + ) + + res = await self.async_client.post(url, json=payload) + return MultitenantmagiclinksemailloginorsignupResponse.from_json( + res.response.status, res.json + ) + + def MultiTenantMagicLinksEmailInvite( + self, + organization_id: str, + email_address: str, + invite_redirect_url: Optional[str] = None, + invited_by_member_id: Optional[str] = None, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + invite_template_id: Optional[str] = None, + ) -> MultitenantmagiclinksemailinviteResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + } + + if invite_redirect_url is not None: + payload["invite_redirect_url"] = invite_redirect_url + if invited_by_member_id is not None: + payload["invited_by_member_id"] = invited_by_member_id + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + if invite_template_id is not None: + payload["invite_template_id"] = invite_template_id + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/invite" + ) + + res = self.sync_client.post(url, json=payload) + return MultitenantmagiclinksemailinviteResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantMagicLinksEmailInvite_async( + self, + organization_id: str, + email_address: str, + invite_redirect_url: Optional[str] = None, + invited_by_member_id: Optional[str] = None, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + invite_template_id: Optional[str] = None, + ) -> MultitenantmagiclinksemailinviteResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + } + + if invite_redirect_url is not None: + payload["invite_redirect_url"] = invite_redirect_url + if invited_by_member_id is not None: + payload["invited_by_member_id"] = invited_by_member_id + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + if invite_template_id is not None: + payload["invite_template_id"] = invite_template_id + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/invite" + ) + + res = await self.async_client.post(url, json=payload) + return MultitenantmagiclinksemailinviteResponse.from_json( + res.response.status, res.json + ) + + def MultiTenantMagicLinksAuthenticate( + self, + magic_links_token: str, + pkce_code_verifier: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantmagiclinksauthenticateResponse: + payload: Dict[str, Any] = { + "magic_links_token": magic_links_token, + } + + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/authenticate" + ) + + res = self.sync_client.post(url, json=payload) + return MultitenantmagiclinksauthenticateResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantMagicLinksAuthenticate_async( + self, + magic_links_token: str, + pkce_code_verifier: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantmagiclinksauthenticateResponse: + payload: Dict[str, Any] = { + "magic_links_token": magic_links_token, + } + + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/authenticate" + ) + + res = await self.async_client.post(url, json=payload) + return MultitenantmagiclinksauthenticateResponse.from_json( + res.response.status, res.json + ) diff --git a/stytch/api/multi_tenant_session_service.py b/stytch/api/multi_tenant_session_service.py new file mode 100644 index 00000000..8b0bec4e --- /dev/null +++ b/stytch/api/multi_tenant_session_service.py @@ -0,0 +1,168 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, Optional + + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.multi_tenant_session_service import ( + MultitenantsessionsgetResponse, + MultitenantsessionsauthenticateResponse, + MultitenantsessionsrevokeResponse, +) + + +class MultiTenantSessionService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "multi_tenant_session_service" + + def MultiTenantSessionsGet( + self, + organization_id: str, + member_id: str, + ) -> MultitenantsessionsgetResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "member_id": member_id, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions") + + res = self.sync_client.get(url, params=payload) + return MultitenantsessionsgetResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantSessionsGet_async( + self, + organization_id: str, + member_id: str, + ) -> MultitenantsessionsgetResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "member_id": member_id, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions") + + res = await self.async_client.get(url, params=payload) + return MultitenantsessionsgetResponse.from_json(res.response.status, res.json) + + def MultiTenantSessionsAuthenticate( + self, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantsessionsauthenticateResponse: + payload: Dict[str, Any] = {} + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/authenticate" + ) + + res = self.sync_client.post(url, json=payload) + return MultitenantsessionsauthenticateResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantSessionsAuthenticate_async( + self, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantsessionsauthenticateResponse: + payload: Dict[str, Any] = {} + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/authenticate" + ) + + res = await self.async_client.post(url, json=payload) + return MultitenantsessionsauthenticateResponse.from_json( + res.response.status, res.json + ) + + def MultiTenantSessionsRevoke( + self, + member_session_id: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + member_id: Optional[str] = None, + ) -> MultitenantsessionsrevokeResponse: + payload: Dict[str, Any] = {} + + if member_session_id is not None: + payload["member_session_id"] = member_session_id + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if member_id is not None: + payload["member_id"] = member_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions/revoke") + + res = self.sync_client.post(url, json=payload) + return MultitenantsessionsrevokeResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantSessionsRevoke_async( + self, + member_session_id: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + member_id: Optional[str] = None, + ) -> MultitenantsessionsrevokeResponse: + payload: Dict[str, Any] = {} + + if member_session_id is not None: + payload["member_session_id"] = member_session_id + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if member_id is not None: + payload["member_id"] = member_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions/revoke") + + res = await self.async_client.post(url, json=payload) + return MultitenantsessionsrevokeResponse.from_json( + res.response.status, res.json + ) diff --git a/stytch/api/o_auth_service.py b/stytch/api/o_auth_service.py new file mode 100644 index 00000000..e8a9f230 --- /dev/null +++ b/stytch/api/o_auth_service.py @@ -0,0 +1,1547 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.o_auth_service import ( + OauthattachResponse, + OauthgoogleonetapstartResponse, + OauthgooglestartResponse, + OauthgoogleidtokenauthenticateResponse, + OauthmicrosoftstartResponse, + OauthapplestartResponse, + OauthappleidtokenauthenticateResponse, + OauthgithubstartResponse, + OauthfacebookstartResponse, + OauthamazonstartResponse, + OauthbitbucketstartResponse, + OauthcoinbasestartResponse, + OauthdiscordstartResponse, + OauthfigmastartResponse, + OauthgitlabstartResponse, + OauthinstagramstartResponse, + OauthlinkedinstartResponse, + OauthshopifystartResponse, + OauthslackstartResponse, + OauthsnapchatstartResponse, + OauthspotifystartResponse, + OauthsteamstartResponse, + OauthtiktokstartResponse, + OauthtwitchstartResponse, + OauthtwitterstartResponse, + OauthauthenticateResponse, +) + + +class OAuthService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "o_auth_service" + + def OAuthAttach( + self, + provider: str, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> OauthattachResponse: + + payload: Dict[str, Any] = { + "provider": provider, + "user_id": user_id, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/attach") + + res = self.sync_client.post(url, json=payload) + return OauthattachResponse.from_json(res.response.status_code, res.json) + + async def OAuthAttach_async( + self, + provider: str, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> OauthattachResponse: + + payload: Dict[str, Any] = { + "provider": provider, + "user_id": user_id, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/attach") + + res = await self.async_client.post(url, json=payload) + return OauthattachResponse.from_json(res.response.status, res.json) + + def OAuthGoogleOneTapStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + ) -> OauthgoogleonetapstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/google/onetap/start") + + res = self.sync_client.get(url, params=payload) + return OauthgoogleonetapstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthGoogleOneTapStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + ) -> OauthgoogleonetapstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/google/onetap/start") + + res = await self.async_client.get(url, params=payload) + return OauthgoogleonetapstartResponse.from_json(res.response.status, res.json) + + def OAuthGoogleStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthgooglestartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/google/start") + + res = self.sync_client.get(url, params=payload) + return OauthgooglestartResponse.from_json(res.response.status_code, res.json) + + async def OAuthGoogleStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthgooglestartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/google/start") + + res = await self.async_client.get(url, params=payload) + return OauthgooglestartResponse.from_json(res.response.status, res.json) + + def OAuthGoogleIDTokenAuthenticate( + self, + id_token: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> OauthgoogleidtokenauthenticateResponse: + + payload: Dict[str, Any] = { + "id_token": id_token, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/google/id_token/authenticate") + + res = self.sync_client.post(url, json=payload) + return OauthgoogleidtokenauthenticateResponse.from_json(res.response.status_code, res.json) + + async def OAuthGoogleIDTokenAuthenticate_async( + self, + id_token: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> OauthgoogleidtokenauthenticateResponse: + + payload: Dict[str, Any] = { + "id_token": id_token, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/google/id_token/authenticate") + + res = await self.async_client.post(url, json=payload) + return OauthgoogleidtokenauthenticateResponse.from_json(res.response.status, res.json) + + def OAuthMicrosoftStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthmicrosoftstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/microsoft/start") + + res = self.sync_client.get(url, params=payload) + return OauthmicrosoftstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthMicrosoftStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthmicrosoftstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/microsoft/start") + + res = await self.async_client.get(url, params=payload) + return OauthmicrosoftstartResponse.from_json(res.response.status, res.json) + + def OAuthAppleStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthapplestartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/apple/start") + + res = self.sync_client.get(url, params=payload) + return OauthapplestartResponse.from_json(res.response.status_code, res.json) + + async def OAuthAppleStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthapplestartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/apple/start") + + res = await self.async_client.get(url, params=payload) + return OauthapplestartResponse.from_json(res.response.status, res.json) + + def OAuthAppleIDTokenAuthenticate( + self, + id_token: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + name: None, + nonce: str, + ) -> OauthappleidtokenauthenticateResponse: + + payload: Dict[str, Any] = { + "id_token": id_token, + "nonce": nonce, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if name is not None: + payload["name"] = name + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/apple/id_token/authenticate") + + res = self.sync_client.post(url, json=payload) + return OauthappleidtokenauthenticateResponse.from_json(res.response.status_code, res.json) + + async def OAuthAppleIDTokenAuthenticate_async( + self, + id_token: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + name: None, + nonce: str, + ) -> OauthappleidtokenauthenticateResponse: + + payload: Dict[str, Any] = { + "id_token": id_token, + "nonce": nonce, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if name is not None: + payload["name"] = name + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/apple/id_token/authenticate") + + res = await self.async_client.post(url, json=payload) + return OauthappleidtokenauthenticateResponse.from_json(res.response.status, res.json) + + def OAuthGithubStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthgithubstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/github/start") + + res = self.sync_client.get(url, params=payload) + return OauthgithubstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthGithubStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthgithubstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/github/start") + + res = await self.async_client.get(url, params=payload) + return OauthgithubstartResponse.from_json(res.response.status, res.json) + + def OAuthFacebookStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthfacebookstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/facebook/start") + + res = self.sync_client.get(url, params=payload) + return OauthfacebookstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthFacebookStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthfacebookstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/facebook/start") + + res = await self.async_client.get(url, params=payload) + return OauthfacebookstartResponse.from_json(res.response.status, res.json) + + def OAuthAmazonStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthamazonstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/amazon/start") + + res = self.sync_client.get(url, params=payload) + return OauthamazonstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthAmazonStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthamazonstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/amazon/start") + + res = await self.async_client.get(url, params=payload) + return OauthamazonstartResponse.from_json(res.response.status, res.json) + + def OAuthBitbucketStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthbitbucketstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/bitbucket/start") + + res = self.sync_client.get(url, params=payload) + return OauthbitbucketstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthBitbucketStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthbitbucketstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/bitbucket/start") + + res = await self.async_client.get(url, params=payload) + return OauthbitbucketstartResponse.from_json(res.response.status, res.json) + + def OAuthCoinbaseStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthcoinbasestartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/coinbase/start") + + res = self.sync_client.get(url, params=payload) + return OauthcoinbasestartResponse.from_json(res.response.status_code, res.json) + + async def OAuthCoinbaseStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthcoinbasestartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/coinbase/start") + + res = await self.async_client.get(url, params=payload) + return OauthcoinbasestartResponse.from_json(res.response.status, res.json) + + def OAuthDiscordStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthdiscordstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/discord/start") + + res = self.sync_client.get(url, params=payload) + return OauthdiscordstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthDiscordStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthdiscordstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/discord/start") + + res = await self.async_client.get(url, params=payload) + return OauthdiscordstartResponse.from_json(res.response.status, res.json) + + def OAuthFigmaStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthfigmastartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/figma/start") + + res = self.sync_client.get(url, params=payload) + return OauthfigmastartResponse.from_json(res.response.status_code, res.json) + + async def OAuthFigmaStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthfigmastartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/figma/start") + + res = await self.async_client.get(url, params=payload) + return OauthfigmastartResponse.from_json(res.response.status, res.json) + + def OAuthGitLabStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthgitlabstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/gitlab/start") + + res = self.sync_client.get(url, params=payload) + return OauthgitlabstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthGitLabStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthgitlabstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/gitlab/start") + + res = await self.async_client.get(url, params=payload) + return OauthgitlabstartResponse.from_json(res.response.status, res.json) + + def OAuthInstagramStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthinstagramstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/instagram/start") + + res = self.sync_client.get(url, params=payload) + return OauthinstagramstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthInstagramStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthinstagramstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/instagram/start") + + res = await self.async_client.get(url, params=payload) + return OauthinstagramstartResponse.from_json(res.response.status, res.json) + + def OAuthLinkedInStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthlinkedinstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/linkedin/start") + + res = self.sync_client.get(url, params=payload) + return OauthlinkedinstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthLinkedInStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthlinkedinstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/linkedin/start") + + res = await self.async_client.get(url, params=payload) + return OauthlinkedinstartResponse.from_json(res.response.status, res.json) + + def OAuthShopifyStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthshopifystartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/shopify/start") + + res = self.sync_client.get(url, params=payload) + return OauthshopifystartResponse.from_json(res.response.status_code, res.json) + + async def OAuthShopifyStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthshopifystartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/shopify/start") + + res = await self.async_client.get(url, params=payload) + return OauthshopifystartResponse.from_json(res.response.status, res.json) + + def OAuthSlackStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthslackstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/slack/start") + + res = self.sync_client.get(url, params=payload) + return OauthslackstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthSlackStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthslackstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/slack/start") + + res = await self.async_client.get(url, params=payload) + return OauthslackstartResponse.from_json(res.response.status, res.json) + + def OAuthSnapchatStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthsnapchatstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/snapchat/start") + + res = self.sync_client.get(url, params=payload) + return OauthsnapchatstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthSnapchatStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthsnapchatstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/snapchat/start") + + res = await self.async_client.get(url, params=payload) + return OauthsnapchatstartResponse.from_json(res.response.status, res.json) + + def OAuthSpotifyStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthspotifystartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/spotify/start") + + res = self.sync_client.get(url, params=payload) + return OauthspotifystartResponse.from_json(res.response.status_code, res.json) + + async def OAuthSpotifyStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthspotifystartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/spotify/start") + + res = await self.async_client.get(url, params=payload) + return OauthspotifystartResponse.from_json(res.response.status, res.json) + + def OAuthSteamStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthsteamstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/steam/start") + + res = self.sync_client.get(url, params=payload) + return OauthsteamstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthSteamStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthsteamstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/steam/start") + + res = await self.async_client.get(url, params=payload) + return OauthsteamstartResponse.from_json(res.response.status, res.json) + + def OAuthTikTokStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthtiktokstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/tiktok/start") + + res = self.sync_client.get(url, params=payload) + return OauthtiktokstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthTikTokStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthtiktokstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/tiktok/start") + + res = await self.async_client.get(url, params=payload) + return OauthtiktokstartResponse.from_json(res.response.status, res.json) + + def OAuthTwitchStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthtwitchstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/twitch/start") + + res = self.sync_client.get(url, params=payload) + return OauthtwitchstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthTwitchStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthtwitchstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/twitch/start") + + res = await self.async_client.get(url, params=payload) + return OauthtwitchstartResponse.from_json(res.response.status, res.json) + + def OAuthTwitterStart( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthtwitterstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/twitter/start") + + res = self.sync_client.get(url, params=payload) + return OauthtwitterstartResponse.from_json(res.response.status_code, res.json) + + async def OAuthTwitterStart_async( + self, + public_token: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + custom_scopes: str, + code_challenge: Optional[str] = None, + oauth_attach_token: Optional[str] = None, + ) -> OauthtwitterstartResponse: + + payload: Dict[str, Any] = { + "public_token": public_token, + "custom_scopes": custom_scopes, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if oauth_attach_token is not None: + payload["oauth_attach_token"] = oauth_attach_token + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/twitter/start") + + res = await self.async_client.get(url, params=payload) + return OauthtwitterstartResponse.from_json(res.response.status, res.json) + + def OAuthAuthenticate( + self, + token: str, + session_management_type: Optional[str] = None, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + code_verifier: Optional[str] = None, + ) -> OauthauthenticateResponse: + + payload: Dict[str, Any] = { + "token": token, + } + + if session_management_type is not None: + payload["session_management_type"] = session_management_type + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if code_verifier is not None: + payload["code_verifier"] = code_verifier + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/authenticate") + + res = self.sync_client.post(url, json=payload) + return OauthauthenticateResponse.from_json(res.response.status_code, res.json) + + async def OAuthAuthenticate_async( + self, + token: str, + session_management_type: Optional[str] = None, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + code_verifier: Optional[str] = None, + ) -> OauthauthenticateResponse: + + payload: Dict[str, Any] = { + "token": token, + } + + if session_management_type is not None: + payload["session_management_type"] = session_management_type + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if code_verifier is not None: + payload["code_verifier"] = code_verifier + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/authenticate") + + res = await self.async_client.post(url, json=payload) + return OauthauthenticateResponse.from_json(res.response.status, res.json) + diff --git a/stytch/api/organization_service.py b/stytch/api/organization_service.py new file mode 100644 index 00000000..0d28d0d0 --- /dev/null +++ b/stytch/api/organization_service.py @@ -0,0 +1,336 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.organization_service import ( + OrganizationscreateResponse, + OrganizationsdeleteResponse, + OrganizationsgetResponse, + OrganizationsmemberdeleteResponse, + OrganizationsmembersearchexternalResponse, + OrganizationssearchexternalResponse, + OrganizationsupdateResponse, +) + + +class OrganizationService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "organization_service" + + def OrganizationsCreate( + self, + organization_name: str, + organization_slug: str, + organization_logo_url: str, + trusted_metadata: Optional[Dict[str, str]] = None, + email_allowed_domains: List[str], + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + ) -> OrganizationscreateResponse: + + payload: Dict[str, Any] = { + "organization_name": organization_name, + "organization_slug": organization_slug, + "organization_logo_url": organization_logo_url, + "email_allowed_domains": email_allowed_domains, + } + + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations") + + res = self.sync_client.post(url, json=payload) + return OrganizationscreateResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsCreate_async( + self, + organization_name: str, + organization_slug: str, + organization_logo_url: str, + trusted_metadata: Optional[Dict[str, str]] = None, + email_allowed_domains: List[str], + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + ) -> OrganizationscreateResponse: + + payload: Dict[str, Any] = { + "organization_name": organization_name, + "organization_slug": organization_slug, + "organization_logo_url": organization_logo_url, + "email_allowed_domains": email_allowed_domains, + } + + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations") + + res = await self.async_client.post(url, json=payload) + return OrganizationscreateResponse.from_json(res.response.status, res.json) + + def OrganizationsGet( + self, + organization_id: str, + ) -> OrganizationsgetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = self.sync_client.get(url, params=payload) + return OrganizationsgetResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsGet_async( + self, + organization_id: str, + ) -> OrganizationsgetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = await self.async_client.get(url, params=payload) + return OrganizationsgetResponse.from_json(res.response.status, res.json) + + def OrganizationsUpdate( + self, + organization_id: str, + organization_name: Optional[str] = None, + organization_slug: Optional[str] = None, + organization_logo_url: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + sso_default_connection_id: Optional[str] = None, + email_allowed_domains: Optional[List[str]] = None, + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + ) -> OrganizationsupdateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if organization_name is not None: + payload["organization_name"] = organization_name + if organization_slug is not None: + payload["organization_slug"] = organization_slug + if organization_logo_url is not None: + payload["organization_logo_url"] = organization_logo_url + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if sso_default_connection_id is not None: + payload["sso_default_connection_id"] = sso_default_connection_id + if email_allowed_domains is not None: + payload["email_allowed_domains"] = email_allowed_domains + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = self.sync_client.put(url, json=payload) + return OrganizationsupdateResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsUpdate_async( + self, + organization_id: str, + organization_name: Optional[str] = None, + organization_slug: Optional[str] = None, + organization_logo_url: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + sso_default_connection_id: Optional[str] = None, + email_allowed_domains: Optional[List[str]] = None, + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + ) -> OrganizationsupdateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if organization_name is not None: + payload["organization_name"] = organization_name + if organization_slug is not None: + payload["organization_slug"] = organization_slug + if organization_logo_url is not None: + payload["organization_logo_url"] = organization_logo_url + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if sso_default_connection_id is not None: + payload["sso_default_connection_id"] = sso_default_connection_id + if email_allowed_domains is not None: + payload["email_allowed_domains"] = email_allowed_domains + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = await self.async_client.put(url, json=payload) + return OrganizationsupdateResponse.from_json(res.response.status, res.json) + + def OrganizationsDelete( + self, + organization_id: str, + ) -> OrganizationsdeleteResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = self.sync_client.delete(url) + return OrganizationsdeleteResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsDelete_async( + self, + organization_id: str, + ) -> OrganizationsdeleteResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = await self.async_client.delete(url) + return OrganizationsdeleteResponse.from_json(res.response.status, res.json) + + def OrganizationsMemberDelete( + self, + organization_id: str, + member_id: str, + ) -> OrganizationsmemberdeleteResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/member/{member_id}") + + res = self.sync_client.delete(url) + return OrganizationsmemberdeleteResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberDelete_async( + self, + organization_id: str, + member_id: str, + ) -> OrganizationsmemberdeleteResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/member/{member_id}") + + res = await self.async_client.delete(url) + return OrganizationsmemberdeleteResponse.from_json(res.response.status, res.json) + + def OrganizationsSearchExternal( + self, + cursor: str, + limit: Optional[int] = None, + query: ExternalSearchQuery, + ) -> OrganizationssearchexternalResponse: + + payload: Dict[str, Any] = { + "cursor": cursor, + "query": query, + } + + if limit is not None: + payload["limit"] = limit + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/search") + + res = self.sync_client.post(url, json=payload) + return OrganizationssearchexternalResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsSearchExternal_async( + self, + cursor: str, + limit: Optional[int] = None, + query: ExternalSearchQuery, + ) -> OrganizationssearchexternalResponse: + + payload: Dict[str, Any] = { + "cursor": cursor, + "query": query, + } + + if limit is not None: + payload["limit"] = limit + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/search") + + res = await self.async_client.post(url, json=payload) + return OrganizationssearchexternalResponse.from_json(res.response.status, res.json) + + def OrganizationsMemberSearchExternal( + self, + cursor: str, + limit: Optional[int] = None, + query: ExternalSearchQuery, + organization_id: str, + ) -> OrganizationsmembersearchexternalResponse: + + payload: Dict[str, Any] = { + "cursor": cursor, + "query": query, + "organization_id": organization_id, + } + + if limit is not None: + payload["limit"] = limit + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/members/search") + + res = self.sync_client.post(url, json=payload) + return OrganizationsmembersearchexternalResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberSearchExternal_async( + self, + cursor: str, + limit: Optional[int] = None, + query: ExternalSearchQuery, + organization_id: str, + ) -> OrganizationsmembersearchexternalResponse: + + payload: Dict[str, Any] = { + "cursor": cursor, + "query": query, + "organization_id": organization_id, + } + + if limit is not None: + payload["limit"] = limit + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/members/search") + + res = await self.async_client.post(url, json=payload) + return OrganizationsmembersearchexternalResponse.from_json(res.response.status, res.json) + diff --git a/stytch/api/otp_service.py b/stytch/api/otp_service.py new file mode 100644 index 00000000..e404b4a6 --- /dev/null +++ b/stytch/api/otp_service.py @@ -0,0 +1,480 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.otp_service import ( + OtpssmssendResponse, + OtpssmsloginorcreateResponse, + OtpswhatsappsendResponse, + OtpswhatsapploginorcreateResponse, + OtpsemailsendResponse, + OtpsemailloginorcreateResponse, + OtpsauthenticateResponse, +) + + +class OTPService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "otp_service" + + def OTPsSMSSend( + self, + phone_number: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + locale: Optional[str] = None, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> OtpssmssendResponse: + + payload: Dict[str, Any] = { + "phone_number": phone_number, + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/sms/send") + + res = self.sync_client.post(url, json=payload) + return OtpssmssendResponse.from_json(res.response.status_code, res.json) + + async def OTPsSMSSend_async( + self, + phone_number: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + locale: Optional[str] = None, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> OtpssmssendResponse: + + payload: Dict[str, Any] = { + "phone_number": phone_number, + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/sms/send") + + res = await self.async_client.post(url, json=payload) + return OtpssmssendResponse.from_json(res.response.status, res.json) + + def OTPsSMSLoginOrCreate( + self, + phone_number: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + create_user_as_pending: bool, + locale: Optional[str] = None, + ) -> OtpssmsloginorcreateResponse: + + payload: Dict[str, Any] = { + "phone_number": phone_number, + "create_user_as_pending": create_user_as_pending, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/sms/login_or_create") + + res = self.sync_client.post(url, json=payload) + return OtpssmsloginorcreateResponse.from_json(res.response.status_code, res.json) + + async def OTPsSMSLoginOrCreate_async( + self, + phone_number: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + create_user_as_pending: bool, + locale: Optional[str] = None, + ) -> OtpssmsloginorcreateResponse: + + payload: Dict[str, Any] = { + "phone_number": phone_number, + "create_user_as_pending": create_user_as_pending, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/sms/login_or_create") + + res = await self.async_client.post(url, json=payload) + return OtpssmsloginorcreateResponse.from_json(res.response.status, res.json) + + def OTPsWhatsAppSend( + self, + phone_number: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + locale: Optional[str] = None, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> OtpswhatsappsendResponse: + + payload: Dict[str, Any] = { + "phone_number": phone_number, + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/whatsapp/send") + + res = self.sync_client.post(url, json=payload) + return OtpswhatsappsendResponse.from_json(res.response.status_code, res.json) + + async def OTPsWhatsAppSend_async( + self, + phone_number: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + locale: Optional[str] = None, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> OtpswhatsappsendResponse: + + payload: Dict[str, Any] = { + "phone_number": phone_number, + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/whatsapp/send") + + res = await self.async_client.post(url, json=payload) + return OtpswhatsappsendResponse.from_json(res.response.status, res.json) + + def OTPsWhatsAppLoginOrCreate( + self, + phone_number: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + create_user_as_pending: bool, + locale: Optional[str] = None, + ) -> OtpswhatsapploginorcreateResponse: + + payload: Dict[str, Any] = { + "phone_number": phone_number, + "create_user_as_pending": create_user_as_pending, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/whatsapp/login_or_create") + + res = self.sync_client.post(url, json=payload) + return OtpswhatsapploginorcreateResponse.from_json(res.response.status_code, res.json) + + async def OTPsWhatsAppLoginOrCreate_async( + self, + phone_number: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + create_user_as_pending: bool, + locale: Optional[str] = None, + ) -> OtpswhatsapploginorcreateResponse: + + payload: Dict[str, Any] = { + "phone_number": phone_number, + "create_user_as_pending": create_user_as_pending, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/whatsapp/login_or_create") + + res = await self.async_client.post(url, json=payload) + return OtpswhatsapploginorcreateResponse.from_json(res.response.status, res.json) + + def OTPsEmailSend( + self, + email: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + locale: Optional[str] = None, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + login_template_id: Optional[str] = None, + signup_template_id: Optional[str] = None, + ) -> OtpsemailsendResponse: + + payload: Dict[str, Any] = { + "email": email, + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/email/send") + + res = self.sync_client.post(url, json=payload) + return OtpsemailsendResponse.from_json(res.response.status_code, res.json) + + async def OTPsEmailSend_async( + self, + email: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + locale: Optional[str] = None, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + login_template_id: Optional[str] = None, + signup_template_id: Optional[str] = None, + ) -> OtpsemailsendResponse: + + payload: Dict[str, Any] = { + "email": email, + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/email/send") + + res = await self.async_client.post(url, json=payload) + return OtpsemailsendResponse.from_json(res.response.status, res.json) + + def OTPsEmailLoginOrCreate( + self, + email: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + create_user_as_pending: bool, + locale: Optional[str] = None, + login_template_id: Optional[str] = None, + signup_template_id: Optional[str] = None, + ) -> OtpsemailloginorcreateResponse: + + payload: Dict[str, Any] = { + "email": email, + "create_user_as_pending": create_user_as_pending, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/email/login_or_create") + + res = self.sync_client.post(url, json=payload) + return OtpsemailloginorcreateResponse.from_json(res.response.status_code, res.json) + + async def OTPsEmailLoginOrCreate_async( + self, + email: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + create_user_as_pending: bool, + locale: Optional[str] = None, + login_template_id: Optional[str] = None, + signup_template_id: Optional[str] = None, + ) -> OtpsemailloginorcreateResponse: + + payload: Dict[str, Any] = { + "email": email, + "create_user_as_pending": create_user_as_pending, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/email/login_or_create") + + res = await self.async_client.post(url, json=payload) + return OtpsemailloginorcreateResponse.from_json(res.response.status, res.json) + + def OTPsAuthenticate( + self, + method_id: str, + code: str, + attributes: Optional[Dict[str, str]] = None, + options: Optional[Dict[str, str]] = None, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> OtpsauthenticateResponse: + + payload: Dict[str, Any] = { + "method_id": method_id, + "code": code, + } + + if attributes is not None: + payload["attributes"] = attributes + if options is not None: + payload["options"] = options + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/authenticate") + + res = self.sync_client.post(url, json=payload) + return OtpsauthenticateResponse.from_json(res.response.status_code, res.json) + + async def OTPsAuthenticate_async( + self, + method_id: str, + code: str, + attributes: Optional[Dict[str, str]] = None, + options: Optional[Dict[str, str]] = None, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> OtpsauthenticateResponse: + + payload: Dict[str, Any] = { + "method_id": method_id, + "code": code, + } + + if attributes is not None: + payload["attributes"] = attributes + if options is not None: + payload["options"] = options + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/otps/authenticate") + + res = await self.async_client.post(url, json=payload) + return OtpsauthenticateResponse.from_json(res.response.status, res.json) + diff --git a/stytch/api/password_service.py b/stytch/api/password_service.py new file mode 100644 index 00000000..33019d56 --- /dev/null +++ b/stytch/api/password_service.py @@ -0,0 +1,489 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.password_service import ( + PasswordscreateResponse, + PasswordsauthenticateResponse, + PasswordsstrengthcheckResponse, + PasswordsemailresetstartResponse, + PasswordsemailresetResponse, + PasswordsexistingpasswordresetResponse, + PasswordssessionresetResponse, + PasswordsmigrateResponse, +) + + +class PasswordService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "password_service" + + def PasswordsCreate( + self, + email: str, + password: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> PasswordscreateResponse: + + payload: Dict[str, Any] = { + "email": email, + "password": password, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords") + + res = self.sync_client.post(url, json=payload) + return PasswordscreateResponse.from_json(res.response.status_code, res.json) + + async def PasswordsCreate_async( + self, + email: str, + password: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> PasswordscreateResponse: + + payload: Dict[str, Any] = { + "email": email, + "password": password, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords") + + res = await self.async_client.post(url, json=payload) + return PasswordscreateResponse.from_json(res.response.status, res.json) + + def PasswordsAuthenticate( + self, + email: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> PasswordsauthenticateResponse: + + payload: Dict[str, Any] = { + "email": email, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/authenticate") + + res = self.sync_client.post(url, json=payload) + return PasswordsauthenticateResponse.from_json(res.response.status_code, res.json) + + async def PasswordsAuthenticate_async( + self, + email: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> PasswordsauthenticateResponse: + + payload: Dict[str, Any] = { + "email": email, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/authenticate") + + res = await self.async_client.post(url, json=payload) + return PasswordsauthenticateResponse.from_json(res.response.status, res.json) + + def PasswordsStrengthCheck( + self, + password: str, + email: Optional[str] = None, + ) -> PasswordsstrengthcheckResponse: + + payload: Dict[str, Any] = { + "password": password, + } + + if email is not None: + payload["email"] = email + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/strength_check") + + res = self.sync_client.post(url, json=payload) + return PasswordsstrengthcheckResponse.from_json(res.response.status_code, res.json) + + async def PasswordsStrengthCheck_async( + self, + password: str, + email: Optional[str] = None, + ) -> PasswordsstrengthcheckResponse: + + payload: Dict[str, Any] = { + "password": password, + } + + if email is not None: + payload["email"] = email + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/strength_check") + + res = await self.async_client.post(url, json=payload) + return PasswordsstrengthcheckResponse.from_json(res.response.status, res.json) + + def PasswordsEmailResetStart( + self, + email: str, + reset_password_redirect_url: str, + reset_password_expiration_minutes: Optional[int] = None, + code_challenge: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + login_redirect_url: str, + locale: Optional[str] = None, + reset_password_template_id: Optional[str] = None, + ) -> PasswordsemailresetstartResponse: + + payload: Dict[str, Any] = { + "email": email, + "reset_password_redirect_url": reset_password_redirect_url, + "login_redirect_url": login_redirect_url, + } + + if reset_password_expiration_minutes is not None: + payload["reset_password_expiration_minutes"] = reset_password_expiration_minutes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + if reset_password_template_id is not None: + payload["reset_password_template_id"] = reset_password_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/email/reset/start") + + res = self.sync_client.post(url, json=payload) + return PasswordsemailresetstartResponse.from_json(res.response.status_code, res.json) + + async def PasswordsEmailResetStart_async( + self, + email: str, + reset_password_redirect_url: str, + reset_password_expiration_minutes: Optional[int] = None, + code_challenge: Optional[str] = None, + attributes: Optional[Dict[str, str]] = None, + login_redirect_url: str, + locale: Optional[str] = None, + reset_password_template_id: Optional[str] = None, + ) -> PasswordsemailresetstartResponse: + + payload: Dict[str, Any] = { + "email": email, + "reset_password_redirect_url": reset_password_redirect_url, + "login_redirect_url": login_redirect_url, + } + + if reset_password_expiration_minutes is not None: + payload["reset_password_expiration_minutes"] = reset_password_expiration_minutes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if attributes is not None: + payload["attributes"] = attributes + if locale is not None: + payload["locale"] = locale + if reset_password_template_id is not None: + payload["reset_password_template_id"] = reset_password_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/email/reset/start") + + res = await self.async_client.post(url, json=payload) + return PasswordsemailresetstartResponse.from_json(res.response.status, res.json) + + def PasswordsEmailReset( + self, + token: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + code_verifier: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + attributes: Optional[Dict[str, str]] = None, + options: Optional[Dict[str, str]] = None, + ) -> PasswordsemailresetResponse: + + payload: Dict[str, Any] = { + "token": token, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if code_verifier is not None: + payload["code_verifier"] = code_verifier + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if attributes is not None: + payload["attributes"] = attributes + if options is not None: + payload["options"] = options + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/email/reset") + + res = self.sync_client.post(url, json=payload) + return PasswordsemailresetResponse.from_json(res.response.status_code, res.json) + + async def PasswordsEmailReset_async( + self, + token: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + code_verifier: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + attributes: Optional[Dict[str, str]] = None, + options: Optional[Dict[str, str]] = None, + ) -> PasswordsemailresetResponse: + + payload: Dict[str, Any] = { + "token": token, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if code_verifier is not None: + payload["code_verifier"] = code_verifier + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if attributes is not None: + payload["attributes"] = attributes + if options is not None: + payload["options"] = options + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/email/reset") + + res = await self.async_client.post(url, json=payload) + return PasswordsemailresetResponse.from_json(res.response.status, res.json) + + def PasswordsExistingPasswordReset( + self, + email: str, + existing_password: str, + new_password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> PasswordsexistingpasswordresetResponse: + + payload: Dict[str, Any] = { + "email": email, + "existing_password": existing_password, + "new_password": new_password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/existing_password/reset") + + res = self.sync_client.post(url, json=payload) + return PasswordsexistingpasswordresetResponse.from_json(res.response.status_code, res.json) + + async def PasswordsExistingPasswordReset_async( + self, + email: str, + existing_password: str, + new_password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> PasswordsexistingpasswordresetResponse: + + payload: Dict[str, Any] = { + "email": email, + "existing_password": existing_password, + "new_password": new_password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/existing_password/reset") + + res = await self.async_client.post(url, json=payload) + return PasswordsexistingpasswordresetResponse.from_json(res.response.status, res.json) + + def PasswordsSessionReset( + self, + password: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> PasswordssessionresetResponse: + + payload: Dict[str, Any] = { + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/session/reset") + + res = self.sync_client.post(url, json=payload) + return PasswordssessionresetResponse.from_json(res.response.status_code, res.json) + + async def PasswordsSessionReset_async( + self, + password: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> PasswordssessionresetResponse: + + payload: Dict[str, Any] = { + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/session/reset") + + res = await self.async_client.post(url, json=payload) + return PasswordssessionresetResponse.from_json(res.response.status, res.json) + + def PasswordsMigrate( + self, + email: str, + hash: str, + hash_type: str, + md_5_config: None, + argon_2_config: None, + sha_1_config: None, + scrypt_config: None, + ) -> PasswordsmigrateResponse: + + payload: Dict[str, Any] = { + "email": email, + "hash": hash, + "hash_type": hash_type, + } + + if md_5_config is not None: + payload["md_5_config"] = md_5_config + if argon_2_config is not None: + payload["argon_2_config"] = argon_2_config + if sha_1_config is not None: + payload["sha_1_config"] = sha_1_config + if scrypt_config is not None: + payload["scrypt_config"] = scrypt_config + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/migrate") + + res = self.sync_client.post(url, json=payload) + return PasswordsmigrateResponse.from_json(res.response.status_code, res.json) + + async def PasswordsMigrate_async( + self, + email: str, + hash: str, + hash_type: str, + md_5_config: None, + argon_2_config: None, + sha_1_config: None, + scrypt_config: None, + ) -> PasswordsmigrateResponse: + + payload: Dict[str, Any] = { + "email": email, + "hash": hash, + "hash_type": hash_type, + } + + if md_5_config is not None: + payload["md_5_config"] = md_5_config + if argon_2_config is not None: + payload["argon_2_config"] = argon_2_config + if sha_1_config is not None: + payload["sha_1_config"] = sha_1_config + if scrypt_config is not None: + payload["scrypt_config"] = scrypt_config + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/migrate") + + res = await self.async_client.post(url, json=payload) + return PasswordsmigrateResponse.from_json(res.response.status, res.json) + diff --git a/stytch/api/project_service.py b/stytch/api/project_service.py new file mode 100644 index 00000000..1a6247aa --- /dev/null +++ b/stytch/api/project_service.py @@ -0,0 +1,31 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.project_service import ( +) + + +class ProjectService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "project_service" + diff --git a/stytch/api/public_token_service.py b/stytch/api/public_token_service.py new file mode 100644 index 00000000..ac3138f0 --- /dev/null +++ b/stytch/api/public_token_service.py @@ -0,0 +1,31 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.public_token_service import ( +) + + +class PublicTokenService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "public_token_service" + diff --git a/stytch/api/script_service.py b/stytch/api/script_service.py new file mode 100644 index 00000000..70b56570 --- /dev/null +++ b/stytch/api/script_service.py @@ -0,0 +1,31 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.script_service import ( +) + + +class ScriptService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "script_service" + diff --git a/stytch/api/sdk_service.py b/stytch/api/sdk_service.py new file mode 100644 index 00000000..fae92c11 --- /dev/null +++ b/stytch/api/sdk_service.py @@ -0,0 +1,31 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.sdk_service import ( +) + + +class SDKService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "sdk_service" + diff --git a/stytch/api/secret_service.py b/stytch/api/secret_service.py new file mode 100644 index 00000000..eee8ee48 --- /dev/null +++ b/stytch/api/secret_service.py @@ -0,0 +1,31 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.secret_service import ( +) + + +class SecretService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "secret_service" + diff --git a/stytch/api/session_service.py b/stytch/api/session_service.py new file mode 100644 index 00000000..fdc511d2 --- /dev/null +++ b/stytch/api/session_service.py @@ -0,0 +1,214 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, Optional + + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.session_service import ( + SessionsgetResponse, + SessionsauthenticateResponse, + SessionsrevokeResponse, + SessionsjwksResponse, + MultitenantsessionsjwksResponse, +) + + +class SessionService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "session_service" + + def SessionsGet( + self, + user_id: str, + ) -> SessionsgetResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/sessions") + + res = self.sync_client.get(url, params=payload) + return SessionsgetResponse.from_json(res.response.status_code, res.json) + + async def SessionsGet_async( + self, + user_id: str, + ) -> SessionsgetResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/sessions") + + res = await self.async_client.get(url, params=payload) + return SessionsgetResponse.from_json(res.response.status, res.json) + + def SessionsAuthenticate( + self, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> SessionsauthenticateResponse: + payload: Dict[str, Any] = {} + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/sessions/authenticate" + ) + + res = self.sync_client.post(url, json=payload) + return SessionsauthenticateResponse.from_json( + res.response.status_code, res.json + ) + + async def SessionsAuthenticate_async( + self, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> SessionsauthenticateResponse: + payload: Dict[str, Any] = {} + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/sessions/authenticate" + ) + + res = await self.async_client.post(url, json=payload) + return SessionsauthenticateResponse.from_json(res.response.status, res.json) + + def SessionsRevoke( + self, + session_id: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> SessionsrevokeResponse: + payload: Dict[str, Any] = {} + + if session_id is not None: + payload["session_id"] = session_id + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/sessions/revoke") + + res = self.sync_client.post(url, json=payload) + return SessionsrevokeResponse.from_json(res.response.status_code, res.json) + + async def SessionsRevoke_async( + self, + session_id: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> SessionsrevokeResponse: + payload: Dict[str, Any] = {} + + if session_id is not None: + payload["session_id"] = session_id + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/sessions/revoke") + + res = await self.async_client.post(url, json=payload) + return SessionsrevokeResponse.from_json(res.response.status, res.json) + + def SessionsJwks( + self, + project_id: str, + ) -> SessionsjwksResponse: + payload: Dict[str, Any] = { + "project_id": project_id, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/sessions/jwks/{project_id}" + ) + + res = self.sync_client.get(url, params=payload) + return SessionsjwksResponse.from_json(res.response.status_code, res.json) + + async def SessionsJwks_async( + self, + project_id: str, + ) -> SessionsjwksResponse: + payload: Dict[str, Any] = { + "project_id": project_id, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/sessions/jwks/{project_id}" + ) + + res = await self.async_client.get(url, params=payload) + return SessionsjwksResponse.from_json(res.response.status, res.json) + + def MultiTenantSessionsJwks( + self, + project_id: str, + ) -> MultitenantsessionsjwksResponse: + payload: Dict[str, Any] = { + "project_id": project_id, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/jwks/{project_id}" + ) + + res = self.sync_client.get(url, params=payload) + return MultitenantsessionsjwksResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantSessionsJwks_async( + self, + project_id: str, + ) -> MultitenantsessionsjwksResponse: + payload: Dict[str, Any] = { + "project_id": project_id, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/jwks/{project_id}" + ) + + res = await self.async_client.get(url, params=payload) + return MultitenantsessionsjwksResponse.from_json(res.response.status, res.json) diff --git a/stytch/api/sso_service.py b/stytch/api/sso_service.py new file mode 100644 index 00000000..464e1667 --- /dev/null +++ b/stytch/api/sso_service.py @@ -0,0 +1,335 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.sso_service import ( + CreatesamlconnectionResponse, + UpdatesamlconnectionResponse, + UpdatesamlconnectionbyurlResponse, + UpdatesamlconnectionbydocResponse, + GetssoconnectionsResponse, + DeletessoconnectionResponse, + SsoauthenticateResponse, + DeletesamlverificationcertificateResponse, +) + + +class SSOService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "sso_service" + + def CreateSAMLConnection( + self, + organization_id: str, + identity_provider: str, + ) -> CreatesamlconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "identity_provider": identity_provider, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}") + + res = self.sync_client.post(url, json=payload) + return CreatesamlconnectionResponse.from_json(res.response.status_code, res.json) + + async def CreateSAMLConnection_async( + self, + organization_id: str, + identity_provider: str, + ) -> CreatesamlconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "identity_provider": identity_provider, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}") + + res = await self.async_client.post(url, json=payload) + return CreatesamlconnectionResponse.from_json(res.response.status, res.json) + + def UpdateSAMLConnection( + self, + organization_id: str, + connection_id: str, + entity_id: str, + display_name: str, + attribute_mapping: Optional[Dict[str, str]] = None, + x509_certificate: str, + ) -> UpdatesamlconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "connection_id": connection_id, + "entity_id": entity_id, + "display_name": display_name, + "x509_certificate": x509_certificate, + } + + if attribute_mapping is not None: + payload["attribute_mapping"] = attribute_mapping + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}") + + res = self.sync_client.put(url, json=payload) + return UpdatesamlconnectionResponse.from_json(res.response.status_code, res.json) + + async def UpdateSAMLConnection_async( + self, + organization_id: str, + connection_id: str, + entity_id: str, + display_name: str, + attribute_mapping: Optional[Dict[str, str]] = None, + x509_certificate: str, + ) -> UpdatesamlconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "connection_id": connection_id, + "entity_id": entity_id, + "display_name": display_name, + "x509_certificate": x509_certificate, + } + + if attribute_mapping is not None: + payload["attribute_mapping"] = attribute_mapping + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}") + + res = await self.async_client.put(url, json=payload) + return UpdatesamlconnectionResponse.from_json(res.response.status, res.json) + + def UpdateSAMLConnectionByURL( + self, + connection_id: str, + metadata_url: str, + ) -> UpdatesamlconnectionbyurlResponse: + + payload: Dict[str, Any] = { + "connection_id": connection_id, + "metadata_url": metadata_url, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/url") + + res = self.sync_client.put(url, json=payload) + return UpdatesamlconnectionbyurlResponse.from_json(res.response.status_code, res.json) + + async def UpdateSAMLConnectionByURL_async( + self, + connection_id: str, + metadata_url: str, + ) -> UpdatesamlconnectionbyurlResponse: + + payload: Dict[str, Any] = { + "connection_id": connection_id, + "metadata_url": metadata_url, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/url") + + res = await self.async_client.put(url, json=payload) + return UpdatesamlconnectionbyurlResponse.from_json(res.response.status, res.json) + + def UpdateSAMLConnectionByDoc( + self, + connection_id: str, + metadata: None, + ) -> UpdatesamlconnectionbydocResponse: + + payload: Dict[str, Any] = { + "connection_id": connection_id, + } + + if metadata is not None: + payload["metadata"] = metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/doc") + + res = self.sync_client.put(url, json=payload) + return UpdatesamlconnectionbydocResponse.from_json(res.response.status_code, res.json) + + async def UpdateSAMLConnectionByDoc_async( + self, + connection_id: str, + metadata: None, + ) -> UpdatesamlconnectionbydocResponse: + + payload: Dict[str, Any] = { + "connection_id": connection_id, + } + + if metadata is not None: + payload["metadata"] = metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/doc") + + res = await self.async_client.put(url, json=payload) + return UpdatesamlconnectionbydocResponse.from_json(res.response.status, res.json) + + def GetSSOConnections( + self, + organization_id: str, + ) -> GetssoconnectionsResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}") + + res = self.sync_client.get(url, params=payload) + return GetssoconnectionsResponse.from_json(res.response.status_code, res.json) + + async def GetSSOConnections_async( + self, + organization_id: str, + ) -> GetssoconnectionsResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}") + + res = await self.async_client.get(url, params=payload) + return GetssoconnectionsResponse.from_json(res.response.status, res.json) + + def DeleteSSOConnection( + self, + organization_id: str, + connection_id: str, + ) -> DeletessoconnectionResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}/connections/{connection_id}") + + res = self.sync_client.delete(url) + return DeletessoconnectionResponse.from_json(res.response.status_code, res.json) + + async def DeleteSSOConnection_async( + self, + organization_id: str, + connection_id: str, + ) -> DeletessoconnectionResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}/connections/{connection_id}") + + res = await self.async_client.delete(url) + return DeletessoconnectionResponse.from_json(res.response.status, res.json) + + def SSOAuthenticate( + self, + token: str, + code_verifier: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> SsoauthenticateResponse: + + payload: Dict[str, Any] = { + "token": token, + } + + if code_verifier is not None: + payload["code_verifier"] = code_verifier + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/authenticate") + + res = self.sync_client.post(url, json=payload) + return SsoauthenticateResponse.from_json(res.response.status_code, res.json) + + async def SSOAuthenticate_async( + self, + token: str, + code_verifier: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> SsoauthenticateResponse: + + payload: Dict[str, Any] = { + "token": token, + } + + if code_verifier is not None: + payload["code_verifier"] = code_verifier + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/authenticate") + + res = await self.async_client.post(url, json=payload) + return SsoauthenticateResponse.from_json(res.response.status, res.json) + + def DeleteSAMLVerificationCertificate( + self, + organization_id: str, + connection_id: str, + certificate_id: str, + ) -> DeletesamlverificationcertificateResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}/connections/{connection_id}/verification_certificate/{certificate_id}") + + res = self.sync_client.delete(url) + return DeletesamlverificationcertificateResponse.from_json(res.response.status_code, res.json) + + async def DeleteSAMLVerificationCertificate_async( + self, + organization_id: str, + connection_id: str, + certificate_id: str, + ) -> DeletesamlverificationcertificateResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}/connections/{connection_id}/verification_certificate/{certificate_id}") + + res = await self.async_client.delete(url) + return DeletesamlverificationcertificateResponse.from_json(res.response.status, res.json) + diff --git a/stytch/api/totp_service.py b/stytch/api/totp_service.py new file mode 100644 index 00000000..d492b127 --- /dev/null +++ b/stytch/api/totp_service.py @@ -0,0 +1,207 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, Optional + + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.totp_service import ( + TotpscreateResponse, + TotpsauthenticateResponse, + TotpsgetrecoverycodesResponse, + TotpsrecoverResponse, +) + + +class TOTPService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "totp_service" + + def TOTPsCreate( + self, + user_id: str, + expiration_minutes: Optional[int] = None, + ) -> TotpscreateResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/totps") + + res = self.sync_client.post(url, json=payload) + return TotpscreateResponse.from_json(res.response.status_code, res.json) + + async def TOTPsCreate_async( + self, + user_id: str, + expiration_minutes: Optional[int] = None, + ) -> TotpscreateResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/totps") + + res = await self.async_client.post(url, json=payload) + return TotpscreateResponse.from_json(res.response.status, res.json) + + def TOTPsAuthenticate( + self, + user_id: str, + totp_code: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> TotpsauthenticateResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "totp_code": totp_code, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/totps/authenticate") + + res = self.sync_client.post(url, json=payload) + return TotpsauthenticateResponse.from_json(res.response.status_code, res.json) + + async def TOTPsAuthenticate_async( + self, + user_id: str, + totp_code: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> TotpsauthenticateResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "totp_code": totp_code, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/totps/authenticate") + + res = await self.async_client.post(url, json=payload) + return TotpsauthenticateResponse.from_json(res.response.status, res.json) + + def TOTPsGetRecoveryCodes( + self, + user_id: str, + ) -> TotpsgetrecoverycodesResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/totps/recovery_codes") + + res = self.sync_client.post(url, json=payload) + return TotpsgetrecoverycodesResponse.from_json( + res.response.status_code, res.json + ) + + async def TOTPsGetRecoveryCodes_async( + self, + user_id: str, + ) -> TotpsgetrecoverycodesResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/totps/recovery_codes") + + res = await self.async_client.post(url, json=payload) + return TotpsgetrecoverycodesResponse.from_json(res.response.status, res.json) + + def TOTPsRecover( + self, + user_id: str, + recovery_code: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> TotpsrecoverResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "recovery_code": recovery_code, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/totps/recover") + + res = self.sync_client.post(url, json=payload) + return TotpsrecoverResponse.from_json(res.response.status_code, res.json) + + async def TOTPsRecover_async( + self, + user_id: str, + recovery_code: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> TotpsrecoverResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "recovery_code": recovery_code, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/totps/recover") + + res = await self.async_client.post(url, json=payload) + return TotpsrecoverResponse.from_json(res.response.status, res.json) diff --git a/stytch/api/user_service.py b/stytch/api/user_service.py new file mode 100644 index 00000000..e39839fb --- /dev/null +++ b/stytch/api/user_service.py @@ -0,0 +1,532 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.user_service import ( + CreateuserResponse, + GetpendingusersResponse, + GetuserResponse, + SearchusersexternalResponse, + UpdateuserResponse, + DeleteuserResponse, + GetuserbyemailandprojectidResponse, + DeleteuseremailResponse, + DeleteuserphonenumberResponse, + DeleteuserwebauthnregistrationResponse, + DeleteuserbiometricregistrationResponse, + DeleteusertotpResponse, + DeleteusercryptowalletResponse, + DeleteuserpasswordResponse, + DeleteuseroauthuserregistrationResponse, +) + + +class UserService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "user_service" + + def CreateUser( + self, + email: Optional[str] = None, + name: None, + attributes: Optional[Dict[str, str]] = None, + phone_number: Optional[str] = None, + create_user_as_pending: bool, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + ) -> CreateuserResponse: + + payload: Dict[str, Any] = { + "create_user_as_pending": create_user_as_pending, + } + + if email is not None: + payload["email"] = email + if name is not None: + payload["name"] = name + if attributes is not None: + payload["attributes"] = attributes + if phone_number is not None: + payload["phone_number"] = phone_number + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users") + + res = self.sync_client.post(url, json=payload) + return CreateuserResponse.from_json(res.response.status_code, res.json) + + async def CreateUser_async( + self, + email: Optional[str] = None, + name: None, + attributes: Optional[Dict[str, str]] = None, + phone_number: Optional[str] = None, + create_user_as_pending: bool, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + ) -> CreateuserResponse: + + payload: Dict[str, Any] = { + "create_user_as_pending": create_user_as_pending, + } + + if email is not None: + payload["email"] = email + if name is not None: + payload["name"] = name + if attributes is not None: + payload["attributes"] = attributes + if phone_number is not None: + payload["phone_number"] = phone_number + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users") + + res = await self.async_client.post(url, json=payload) + return CreateuserResponse.from_json(res.response.status, res.json) + + def GetPendingUsers( + self, + starting_after_id: Optional[str] = None, + limit: Optional[int] = None, + ) -> GetpendingusersResponse: + + payload: Dict[str, Any] = { + } + + if starting_after_id is not None: + payload["starting_after_id"] = starting_after_id + if limit is not None: + payload["limit"] = limit + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/pending") + + res = self.sync_client.get(url, params=payload) + return GetpendingusersResponse.from_json(res.response.status_code, res.json) + + async def GetPendingUsers_async( + self, + starting_after_id: Optional[str] = None, + limit: Optional[int] = None, + ) -> GetpendingusersResponse: + + payload: Dict[str, Any] = { + } + + if starting_after_id is not None: + payload["starting_after_id"] = starting_after_id + if limit is not None: + payload["limit"] = limit + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/pending") + + res = await self.async_client.get(url, params=payload) + return GetpendingusersResponse.from_json(res.response.status, res.json) + + def GetUser( + self, + user_id: str, + ) -> GetuserResponse: + + payload: Dict[str, Any] = { + "user_id": user_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/{user_id}") + + res = self.sync_client.get(url, params=payload) + return GetuserResponse.from_json(res.response.status_code, res.json) + + async def GetUser_async( + self, + user_id: str, + ) -> GetuserResponse: + + payload: Dict[str, Any] = { + "user_id": user_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/{user_id}") + + res = await self.async_client.get(url, params=payload) + return GetuserResponse.from_json(res.response.status, res.json) + + def SearchUsersExternal( + self, + cursor: str, + limit: Optional[int] = None, + SearchUsersExternalQuery: None, + operands: None, + ) -> SearchusersexternalResponse: + + payload: Dict[str, Any] = { + "cursor": cursor, + } + + if limit is not None: + payload["limit"] = limit + if SearchUsersExternalQuery is not None: + payload["SearchUsersExternalQuery"] = SearchUsersExternalQuery + if operands is not None: + payload["operands"] = operands + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/search") + + res = self.sync_client.post(url, json=payload) + return SearchusersexternalResponse.from_json(res.response.status_code, res.json) + + async def SearchUsersExternal_async( + self, + cursor: str, + limit: Optional[int] = None, + SearchUsersExternalQuery: None, + operands: None, + ) -> SearchusersexternalResponse: + + payload: Dict[str, Any] = { + "cursor": cursor, + } + + if limit is not None: + payload["limit"] = limit + if SearchUsersExternalQuery is not None: + payload["SearchUsersExternalQuery"] = SearchUsersExternalQuery + if operands is not None: + payload["operands"] = operands + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/search") + + res = await self.async_client.post(url, json=payload) + return SearchusersexternalResponse.from_json(res.response.status, res.json) + + def UpdateUser( + self, + user_id: str, + name: None, + emails: None, + attributes: Optional[Dict[str, str]] = None, + phone_numbers: None, + crypto_wallets: None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + ) -> UpdateuserResponse: + + payload: Dict[str, Any] = { + "user_id": user_id, + } + + if name is not None: + payload["name"] = name + if emails is not None: + payload["emails"] = emails + if attributes is not None: + payload["attributes"] = attributes + if phone_numbers is not None: + payload["phone_numbers"] = phone_numbers + if crypto_wallets is not None: + payload["crypto_wallets"] = crypto_wallets + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/{user_id}") + + res = self.sync_client.put(url, json=payload) + return UpdateuserResponse.from_json(res.response.status_code, res.json) + + async def UpdateUser_async( + self, + user_id: str, + name: None, + emails: None, + attributes: Optional[Dict[str, str]] = None, + phone_numbers: None, + crypto_wallets: None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + ) -> UpdateuserResponse: + + payload: Dict[str, Any] = { + "user_id": user_id, + } + + if name is not None: + payload["name"] = name + if emails is not None: + payload["emails"] = emails + if attributes is not None: + payload["attributes"] = attributes + if phone_numbers is not None: + payload["phone_numbers"] = phone_numbers + if crypto_wallets is not None: + payload["crypto_wallets"] = crypto_wallets + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/{user_id}") + + res = await self.async_client.put(url, json=payload) + return UpdateuserResponse.from_json(res.response.status, res.json) + + def DeleteUser( + self, + user_id: str, + ) -> DeleteuserResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/{user_id}") + + res = self.sync_client.delete(url) + return DeleteuserResponse.from_json(res.response.status_code, res.json) + + async def DeleteUser_async( + self, + user_id: str, + ) -> DeleteuserResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/{user_id}") + + res = await self.async_client.delete(url) + return DeleteuserResponse.from_json(res.response.status, res.json) + + def GetUserByEmailAndProjectID( + self, + email: str, + project_id: str, + ) -> GetuserbyemailandprojectidResponse: + + payload: Dict[str, Any] = { + "email": email, + "project_id": project_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/sdk/users") + + res = self.sync_client.get(url, params=payload) + return GetuserbyemailandprojectidResponse.from_json(res.response.status_code, res.json) + + async def GetUserByEmailAndProjectID_async( + self, + email: str, + project_id: str, + ) -> GetuserbyemailandprojectidResponse: + + payload: Dict[str, Any] = { + "email": email, + "project_id": project_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/sdk/users") + + res = await self.async_client.get(url, params=payload) + return GetuserbyemailandprojectidResponse.from_json(res.response.status, res.json) + + def DeleteUserEmail( + self, + email_id: str, + ) -> DeleteuseremailResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/emails/{email_id}") + + res = self.sync_client.delete(url) + return DeleteuseremailResponse.from_json(res.response.status_code, res.json) + + async def DeleteUserEmail_async( + self, + email_id: str, + ) -> DeleteuseremailResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/emails/{email_id}") + + res = await self.async_client.delete(url) + return DeleteuseremailResponse.from_json(res.response.status, res.json) + + def DeleteUserPhoneNumber( + self, + phone_id: str, + ) -> DeleteuserphonenumberResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/phone_numbers/{phone_id}") + + res = self.sync_client.delete(url) + return DeleteuserphonenumberResponse.from_json(res.response.status_code, res.json) + + async def DeleteUserPhoneNumber_async( + self, + phone_id: str, + ) -> DeleteuserphonenumberResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/phone_numbers/{phone_id}") + + res = await self.async_client.delete(url) + return DeleteuserphonenumberResponse.from_json(res.response.status, res.json) + + def DeleteUserWebAuthnRegistration( + self, + webauthn_registration_id: str, + ) -> DeleteuserwebauthnregistrationResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/webauthn_registrations/{webauthn_registration_id}") + + res = self.sync_client.delete(url) + return DeleteuserwebauthnregistrationResponse.from_json(res.response.status_code, res.json) + + async def DeleteUserWebAuthnRegistration_async( + self, + webauthn_registration_id: str, + ) -> DeleteuserwebauthnregistrationResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/webauthn_registrations/{webauthn_registration_id}") + + res = await self.async_client.delete(url) + return DeleteuserwebauthnregistrationResponse.from_json(res.response.status, res.json) + + def DeleteUserBiometricRegistration( + self, + biometric_registration_id: str, + ) -> DeleteuserbiometricregistrationResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/biometric_registrations/{biometric_registration_id}") + + res = self.sync_client.delete(url) + return DeleteuserbiometricregistrationResponse.from_json(res.response.status_code, res.json) + + async def DeleteUserBiometricRegistration_async( + self, + biometric_registration_id: str, + ) -> DeleteuserbiometricregistrationResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/biometric_registrations/{biometric_registration_id}") + + res = await self.async_client.delete(url) + return DeleteuserbiometricregistrationResponse.from_json(res.response.status, res.json) + + def DeleteUserTOTP( + self, + totp_id: str, + ) -> DeleteusertotpResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/totps/{totp_id}") + + res = self.sync_client.delete(url) + return DeleteusertotpResponse.from_json(res.response.status_code, res.json) + + async def DeleteUserTOTP_async( + self, + totp_id: str, + ) -> DeleteusertotpResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/totps/{totp_id}") + + res = await self.async_client.delete(url) + return DeleteusertotpResponse.from_json(res.response.status, res.json) + + def DeleteUserCryptoWallet( + self, + crypto_wallet_id: str, + ) -> DeleteusercryptowalletResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/crypto_wallets/{crypto_wallet_id}") + + res = self.sync_client.delete(url) + return DeleteusercryptowalletResponse.from_json(res.response.status_code, res.json) + + async def DeleteUserCryptoWallet_async( + self, + crypto_wallet_id: str, + ) -> DeleteusercryptowalletResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/crypto_wallets/{crypto_wallet_id}") + + res = await self.async_client.delete(url) + return DeleteusercryptowalletResponse.from_json(res.response.status, res.json) + + def DeleteUserPassword( + self, + password_id: str, + ) -> DeleteuserpasswordResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/passwords/{password_id}") + + res = self.sync_client.delete(url) + return DeleteuserpasswordResponse.from_json(res.response.status_code, res.json) + + async def DeleteUserPassword_async( + self, + password_id: str, + ) -> DeleteuserpasswordResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/passwords/{password_id}") + + res = await self.async_client.delete(url) + return DeleteuserpasswordResponse.from_json(res.response.status, res.json) + + def DeleteUserOAuthUserRegistration( + self, + oauth_user_registration_id: str, + ) -> DeleteuseroauthuserregistrationResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/oauth/{oauth_user_registration_id}") + + res = self.sync_client.delete(url) + return DeleteuseroauthuserregistrationResponse.from_json(res.response.status_code, res.json) + + async def DeleteUserOAuthUserRegistration_async( + self, + oauth_user_registration_id: str, + ) -> DeleteuseroauthuserregistrationResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/users/oauth/{oauth_user_registration_id}") + + res = await self.async_client.delete(url) + return DeleteuseroauthuserregistrationResponse.from_json(res.response.status, res.json) + diff --git a/stytch/api/web_authn_service.py b/stytch/api/web_authn_service.py new file mode 100644 index 00000000..ad68539f --- /dev/null +++ b/stytch/api/web_authn_service.py @@ -0,0 +1,207 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, Optional + + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.web_authn_service import ( + WebauthnregisterstartResponse, + WebauthnregisterResponse, + WebauthnauthenticatestartResponse, + WebauthnauthenticateResponse, +) + + +class WebAuthnService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "web_authn_service" + + def WebAuthnRegisterStart( + self, + user_id: str, + domain: str, + user_agent: str, + authenticator_type: Optional[str] = None, + ) -> WebauthnregisterstartResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "domain": domain, + "user_agent": user_agent, + } + + if authenticator_type is not None: + payload["authenticator_type"] = authenticator_type + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/webauthn/register/start" + ) + + res = self.sync_client.post(url, json=payload) + return WebauthnregisterstartResponse.from_json( + res.response.status_code, res.json + ) + + async def WebAuthnRegisterStart_async( + self, + user_id: str, + domain: str, + user_agent: str, + authenticator_type: Optional[str] = None, + ) -> WebauthnregisterstartResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "domain": domain, + "user_agent": user_agent, + } + + if authenticator_type is not None: + payload["authenticator_type"] = authenticator_type + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/webauthn/register/start" + ) + + res = await self.async_client.post(url, json=payload) + return WebauthnregisterstartResponse.from_json(res.response.status, res.json) + + def WebAuthnRegister( + self, + user_id: str, + public_key_credential: str, + ) -> WebauthnregisterResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "public_key_credential": public_key_credential, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/webauthn/register") + + res = self.sync_client.post(url, json=payload) + return WebauthnregisterResponse.from_json(res.response.status_code, res.json) + + async def WebAuthnRegister_async( + self, + user_id: str, + public_key_credential: str, + ) -> WebauthnregisterResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "public_key_credential": public_key_credential, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/webauthn/register") + + res = await self.async_client.post(url, json=payload) + return WebauthnregisterResponse.from_json(res.response.status, res.json) + + def WebAuthnAuthenticateStart( + self, + user_id: str, + domain: str, + ) -> WebauthnauthenticatestartResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "domain": domain, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/webauthn/authenticate/start" + ) + + res = self.sync_client.post(url, json=payload) + return WebauthnauthenticatestartResponse.from_json( + res.response.status_code, res.json + ) + + async def WebAuthnAuthenticateStart_async( + self, + user_id: str, + domain: str, + ) -> WebauthnauthenticatestartResponse: + payload: Dict[str, Any] = { + "user_id": user_id, + "domain": domain, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/webauthn/authenticate/start" + ) + + res = await self.async_client.post(url, json=payload) + return WebauthnauthenticatestartResponse.from_json( + res.response.status, res.json + ) + + def WebAuthnAuthenticate( + self, + public_key_credential: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> WebauthnauthenticateResponse: + payload: Dict[str, Any] = { + "public_key_credential": public_key_credential, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/webauthn/authenticate" + ) + + res = self.sync_client.post(url, json=payload) + return WebauthnauthenticateResponse.from_json( + res.response.status_code, res.json + ) + + async def WebAuthnAuthenticate_async( + self, + public_key_credential: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> WebauthnauthenticateResponse: + payload: Dict[str, Any] = { + "public_key_credential": public_key_credential, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/webauthn/authenticate" + ) + + res = await self.async_client.post(url, json=payload) + return WebauthnauthenticateResponse.from_json(res.response.status, res.json) diff --git a/stytch/models/biometric_service.py b/stytch/models/biometric_service.py new file mode 100644 index 00000000..c1c697b9 --- /dev/null +++ b/stytch/models/biometric_service.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +from typing import Optional + +from stytch.core.models import ResponseBase, StytchSession, User + + +class BiometricsregisterstartResponse(ResponseBase): + request_id: str + user_id: str + biometric_registration_id: str + challenge: str + + +class BiometricsregisterResponse(ResponseBase): + request_id: str + user_id: str + biometric_registration_id: str + user: User + session_token: str + session: Optional[StytchSession] + session_jwt: str + + +class BiometricsauthenticatestartResponse(ResponseBase): + request_id: str + user_id: str + biometric_registration_id: str + challenge: str + + +class BiometricsauthenticateResponse(ResponseBase): + request_id: str + user_id: str + biometric_registration_id: str + session_token: str + session: Optional[StytchSession] + session_jwt: str + user: User diff --git a/stytch/models/cname_record_service.py b/stytch/models/cname_record_service.py new file mode 100644 index 00000000..e5a0d9b4 --- /dev/null +++ b/stytch/models/cname_record_service.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/stytch/models/crypto_wallet_service.py b/stytch/models/crypto_wallet_service.py new file mode 100644 index 00000000..092cd2e4 --- /dev/null +++ b/stytch/models/crypto_wallet_service.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +from typing import Optional + +from stytch.core.models import ResponseBase, StytchSession, User + + +class CryptowalletsauthenticatestartResponse(ResponseBase): + request_id: str + user_id: str + challenge: str + user_created: bool + + +class CryptowalletsauthenticateResponse(ResponseBase): + request_id: str + user_id: str + session_token: str + session: Optional[StytchSession] + session_jwt: str + user: User diff --git a/stytch/models/debug_service.py b/stytch/models/debug_service.py new file mode 100644 index 00000000..5f6c96e5 --- /dev/null +++ b/stytch/models/debug_service.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class WhoamiResponse(ResponseBase): + request_id: str + project_id: str + name: str diff --git a/stytch/models/email_template_service.py b/stytch/models/email_template_service.py new file mode 100644 index 00000000..e5a0d9b4 --- /dev/null +++ b/stytch/models/email_template_service.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/stytch/models/magic_link_url_service.py b/stytch/models/magic_link_url_service.py new file mode 100644 index 00000000..e5a0d9b4 --- /dev/null +++ b/stytch/models/magic_link_url_service.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/stytch/models/magic_service.py b/stytch/models/magic_service.py new file mode 100644 index 00000000..17bf4ae7 --- /dev/null +++ b/stytch/models/magic_service.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 + +from typing import Optional + +from stytch.core.models import ResponseBase, StytchSession, User + + +class SendmagicbyemailResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + + +class MagiclinksemailsendResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + + +class AuthenticatemagicResponse(ResponseBase): + request_id: str + user_id: str + method_id: str + session_token: str + session: Optional[StytchSession] + session_jwt: str + user: User + reset_sessions: bool + + +class MagiclinksauthenticateResponse(ResponseBase): + request_id: str + user_id: str + method_id: str + session_token: str + session: Optional[StytchSession] + session_jwt: str + user: User + reset_sessions: bool + + +class MagiclinksemailloginorcreateResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + user_created: bool + + +class SdkmagiclinksemailloginorcreateResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + + +class InvitebyemailResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + + +class MagiclinksemailinviteResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + + +class MagiclinksemailrevokeinviteResponse(ResponseBase): + request_id: str + + +class MagiclinkredirectResponse(ResponseBase): + request_id: str + redirect_url: str + html_response_data: None + + +class MagiclinksredirectcaptchaResponse(ResponseBase): + request_id: str + redirect_url: str + + +class MagiclinkscreateResponse(ResponseBase): + request_id: str + user_id: str + token: str diff --git a/stytch/models/multi_tenant_magic_service.py b/stytch/models/multi_tenant_magic_service.py new file mode 100644 index 00000000..38fceb71 --- /dev/null +++ b/stytch/models/multi_tenant_magic_service.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class MultitenantmagiclinksemailloginorsignupResponse(ResponseBase): + request_id: str + member_id: str + member_created: bool + member: None + + +class MultitenantmagiclinksemailinviteResponse(ResponseBase): + request_id: str + member_id: str + member: None + + +class MultitenantmagiclinksauthenticateResponse(ResponseBase): + request_id: str + member_id: str + method_id: str + reset_sessions: bool + organization_id: str + member: None + session_token: str + session_jwt: str + session: None diff --git a/stytch/models/multi_tenant_session_service.py b/stytch/models/multi_tenant_session_service.py new file mode 100644 index 00000000..fd9b9c9e --- /dev/null +++ b/stytch/models/multi_tenant_session_service.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class MultitenantsessionsgetResponse(ResponseBase): + request_id: str + sessions: None + + +class MultitenantsessionsauthenticateResponse(ResponseBase): + request_id: str + member_session: None + session_token: str + session_jwt: str + member: None + + +class MultitenantsessionsrevokeResponse(ResponseBase): + request_id: str diff --git a/stytch/models/o_auth_service.py b/stytch/models/o_auth_service.py new file mode 100644 index 00000000..2abc004e --- /dev/null +++ b/stytch/models/o_auth_service.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 + +from typing import Optional + +from stytch.core.models import OAuthSession, ResponseBase, StytchSession, User + + +class OauthattachResponse(ResponseBase): + request_id: str + oauth_attach_token: str + + +class OauthgoogleonetapstartResponse(ResponseBase): + request_id: str + google_client_id: str + stytch_csrf_token: str + oauth_callback_id: str + + +class OauthgooglestartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthgoogleidtokenauthenticateResponse(ResponseBase): + request_id: str + user_id: str + provider_subject: str + session: Optional[StytchSession] + session_token: str + session_jwt: str + user: User + reset_sessions: bool + + +class OauthmicrosoftstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthapplestartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthappleidtokenauthenticateResponse(ResponseBase): + request_id: str + user_id: str + provider_subject: str + session: Optional[StytchSession] + session_token: str + session_jwt: str + user: User + reset_sessions: bool + + +class OauthgithubstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthfacebookstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthamazonstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthbitbucketstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthcoinbasestartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthdiscordstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthfigmastartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthgitlabstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthinstagramstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthlinkedinstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthshopifystartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthslackstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthsnapchatstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthspotifystartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthsteamstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthtiktokstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthtwitchstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthtwitterstartResponse(ResponseBase): + request_id: str + redirect_url: str + oauth_state: str + cname_domain: str + + +class OauthauthenticateResponse(ResponseBase): + request_id: str + user_id: str + provider_subject: str + provider_type: str + session: OAuthSession + session_token: str + session_jwt: str + provider_values: None + user: User + reset_sessions: bool + oauth_user_registration_id: str diff --git a/stytch/models/organization_service.py b/stytch/models/organization_service.py new file mode 100644 index 00000000..33023ccb --- /dev/null +++ b/stytch/models/organization_service.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 + +from typing import List + +from stytch.core.models import ResponseBase + + +class OrganizationscreateResponse(ResponseBase): + request_id: str + organization: Organization + + +class OrganizationsgetResponse(ResponseBase): + request_id: str + organization: Organization + + +class OrganizationsupdateResponse(ResponseBase): + request_id: str + organization: Organization + + +class OrganizationsdeleteResponse(ResponseBase): + request_id: str + organization_id: str + + +class OrganizationsmemberdeleteResponse(ResponseBase): + request_id: str + member_id: str + + +class OrganizationssearchexternalResponse(ResponseBase): + request_id: str + organizations: List[Organization] + results_metadata: ResultsMetadata + + +class OrganizationsmembersearchexternalResponse(ResponseBase): + request_id: str + members: List[Member] + results_metadata: ResultsMetadata diff --git a/stytch/models/otp_service.py b/stytch/models/otp_service.py new file mode 100644 index 00000000..d9971069 --- /dev/null +++ b/stytch/models/otp_service.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 + +from typing import Optional + +from stytch.core.models import ResponseBase, StytchSession, User + + +class OtpssmssendResponse(ResponseBase): + request_id: str + user_id: str + phone_id: str + + +class OtpssmsloginorcreateResponse(ResponseBase): + request_id: str + user_id: str + phone_id: str + user_created: bool + + +class OtpswhatsappsendResponse(ResponseBase): + request_id: str + user_id: str + phone_id: str + + +class OtpswhatsapploginorcreateResponse(ResponseBase): + request_id: str + user_id: str + phone_id: str + user_created: bool + + +class OtpsemailsendResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + + +class OtpsemailloginorcreateResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + user_created: bool + + +class OtpsauthenticateResponse(ResponseBase): + request_id: str + user_id: str + method_id: str + session_token: str + session: Optional[StytchSession] + session_jwt: str + user: User + reset_sessions: bool diff --git a/stytch/models/password_service.py b/stytch/models/password_service.py new file mode 100644 index 00000000..7910a2e2 --- /dev/null +++ b/stytch/models/password_service.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 + +from typing import Optional + +from stytch.core.models import ResponseBase, StytchSession, User + + +class PasswordscreateResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + session_token: str + session: Optional[StytchSession] + session_jwt: str + user: User + + +class PasswordsauthenticateResponse(ResponseBase): + request_id: str + user_id: str + session_token: str + session: Optional[StytchSession] + session_jwt: str + user: User + + +class PasswordsstrengthcheckResponse(ResponseBase): + request_id: str + valid_password: bool + score: None + breached_password: bool + feedback: None + + +class PasswordsemailresetstartResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + + +class PasswordsemailresetResponse(ResponseBase): + request_id: str + user_id: str + session_token: str + session: Optional[StytchSession] + session_jwt: str + user: User + + +class PasswordsexistingpasswordresetResponse(ResponseBase): + request_id: str + user_id: str + session_token: str + session: Optional[StytchSession] + session_jwt: str + user: User + + +class PasswordssessionresetResponse(ResponseBase): + request_id: str + user_id: str + session: Optional[StytchSession] + user: User + + +class PasswordsmigrateResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + user_created: bool + user: User diff --git a/stytch/models/project_service.py b/stytch/models/project_service.py new file mode 100644 index 00000000..e5a0d9b4 --- /dev/null +++ b/stytch/models/project_service.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/stytch/models/public_token_service.py b/stytch/models/public_token_service.py new file mode 100644 index 00000000..e5a0d9b4 --- /dev/null +++ b/stytch/models/public_token_service.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/stytch/models/script_service.py b/stytch/models/script_service.py new file mode 100644 index 00000000..e5a0d9b4 --- /dev/null +++ b/stytch/models/script_service.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/stytch/models/sdk_service.py b/stytch/models/sdk_service.py new file mode 100644 index 00000000..e5a0d9b4 --- /dev/null +++ b/stytch/models/sdk_service.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/stytch/models/secret_service.py b/stytch/models/secret_service.py new file mode 100644 index 00000000..e5a0d9b4 --- /dev/null +++ b/stytch/models/secret_service.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/stytch/models/session_service.py b/stytch/models/session_service.py new file mode 100644 index 00000000..d94ccf9e --- /dev/null +++ b/stytch/models/session_service.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 + +from typing import Any, Dict, List, Optional + +from stytch.core.models import ResponseBase, StytchSession, User + + +class SessionsgetResponse(ResponseBase): + request_id: str + sessions: List[StytchSession] + + +class SessionsauthenticateResponse(ResponseBase): + request_id: str + session: Optional[StytchSession] + session_token: str + session_jwt: str + user: User + + +class SessionsrevokeResponse(ResponseBase): + request_id: str + + +class SessionsjwksResponse(ResponseBase): + keys: List[Dict[str, Any]] + request_id: str + + +class MultitenantsessionsjwksResponse(ResponseBase): + keys: List[Dict[str, Any]] + request_id: str diff --git a/stytch/models/sso_service.py b/stytch/models/sso_service.py new file mode 100644 index 00000000..4b93777d --- /dev/null +++ b/stytch/models/sso_service.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class CreatesamlconnectionResponse(ResponseBase): + request_id: str + connection: None + + +class UpdatesamlconnectionResponse(ResponseBase): + request_id: str + connection: None + + +class UpdatesamlconnectionbyurlResponse(ResponseBase): + request_id: str + connection: None + + +class UpdatesamlconnectionbydocResponse(ResponseBase): + request_id: str + connection: None + + +class GetssoconnectionsResponse(ResponseBase): + request_id: str + saml_connections: None + + +class DeletessoconnectionResponse(ResponseBase): + request_id: str + connection_id: str + + +class SsoauthenticateResponse(ResponseBase): + request_id: str + member_id: str + organization_id: str + member: None + session_token: str + session_jwt: str + session: None + reset_session: bool + + +class DeletesamlverificationcertificateResponse(ResponseBase): + request_id: str + certificate_id: str diff --git a/stytch/models/totp_service.py b/stytch/models/totp_service.py new file mode 100644 index 00000000..9a0c6fbf --- /dev/null +++ b/stytch/models/totp_service.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 + +from typing import List, Optional + +from stytch.core.models import ResponseBase, StytchSession, User + + +class TotpscreateResponse(ResponseBase): + request_id: str + totp_id: str + secret: str + qr_code: str + recovery_codes: List[str] + user: User + user_id: str + + +class TotpsauthenticateResponse(ResponseBase): + request_id: str + user_id: str + session_token: str + session: Optional[StytchSession] + totp_id: str + session_jwt: str + user: User + + +class TotpsgetrecoverycodesResponse(ResponseBase): + request_id: str + user_id: str + totps: None + + +class TotpsrecoverResponse(ResponseBase): + request_id: str + totp_id: str + user_id: str + session_token: str + session: Optional[StytchSession] + session_jwt: str + user: User diff --git a/stytch/models/user_service.py b/stytch/models/user_service.py new file mode 100644 index 00000000..5085c1e8 --- /dev/null +++ b/stytch/models/user_service.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 + +from typing import Dict, Optional + +from stytch.core.models import ResponseBase, User + + +class CreateuserResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + status: str + phone_id: str + user: User + + +class GetpendingusersResponse(ResponseBase): + request_id: str + users: None + has_more: bool + next_starting_after_id: str + total: None + + +class GetuserResponse(ResponseBase): + request_id: str + user_id: str + name: None + emails: None + status: str + phone_numbers: None + birthday: None + webauthn_registrations: None + created_at: None + providers: None + totps: None + crypto_wallets: None + password: None + biometric_registrations: None + trusted_metadata: Optional[Dict[str, str]] = None + untrusted_metadata: Optional[Dict[str, str]] = None + project_id: str + + +class SearchusersexternalResponse(ResponseBase): + request_id: str + results: None + ResultsMetadata: None + next_cursor: Optional[str] = None + + +class UpdateuserResponse(ResponseBase): + request_id: str + user_id: str + emails: None + phone_numbers: None + crypto_wallets: None + user: User + + +class DeleteuserResponse(ResponseBase): + request_id: str + user_id: str + + +class GetuserbyemailandprojectidResponse(ResponseBase): + request_id: str + user_id: str + email_id: str + + +class DeleteuseremailResponse(ResponseBase): + request_id: str + user_id: str + user: User + + +class DeleteuserphonenumberResponse(ResponseBase): + request_id: str + user_id: str + user: User + + +class DeleteuserwebauthnregistrationResponse(ResponseBase): + request_id: str + user_id: str + user: User + + +class DeleteuserbiometricregistrationResponse(ResponseBase): + request_id: str + user_id: str + user: User + + +class DeleteusertotpResponse(ResponseBase): + request_id: str + user_id: str + user: User + + +class DeleteusercryptowalletResponse(ResponseBase): + request_id: str + user_id: str + user: User + + +class DeleteuserpasswordResponse(ResponseBase): + request_id: str + user_id: str + user: User + + +class DeleteuseroauthuserregistrationResponse(ResponseBase): + request_id: str + user_id: str + user: User diff --git a/stytch/models/web_authn_service.py b/stytch/models/web_authn_service.py new file mode 100644 index 00000000..9d7d36e8 --- /dev/null +++ b/stytch/models/web_authn_service.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + +from typing import Optional + +from stytch.core.models import ResponseBase, StytchSession, User + + +class WebauthnregisterstartResponse(ResponseBase): + request_id: str + user_id: str + public_key_credential_creation_options: str + + +class WebauthnregisterResponse(ResponseBase): + request_id: str + user_id: str + webauthn_registration_id: str + + +class WebauthnauthenticatestartResponse(ResponseBase): + request_id: str + user_id: str + public_key_credential_request_options: str + + +class WebauthnauthenticateResponse(ResponseBase): + request_id: str + user_id: str + webauthn_registration_id: str + session_token: str + session: Optional[StytchSession] + session_jwt: str + user: User From 92132fe620f5143baa19938e449036256102336a Mon Sep 17 00:00:00 2001 From: Joshua Hight Date: Fri, 24 Feb 2023 17:13:25 -0800 Subject: [PATCH 2/7] delete swap file --- codegen/specs/stytch/.oauth.yml.swp | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 codegen/specs/stytch/.oauth.yml.swp diff --git a/codegen/specs/stytch/.oauth.yml.swp b/codegen/specs/stytch/.oauth.yml.swp deleted file mode 100644 index c5ff02e26f9e32f48cd4fd8e1ed97232235f7064..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI2ZD<@t7{^E3sC~Bwsmw_>sGEJ*lr}`rQ6Rqx6W%JKb|FIpy1{ULN+wsIs;xP zQQq1`od<(puysomtn>nhdNqfQr~xxPaxz>D3#ZT;4vRwIXPh9%^32chkU3npWdd3f zg_Xm_+F@!&HD8SaMuDj*uz;*t-4;LU&CBkzmfW;;YKNI#MggOMQNSo*6fg=H1&jhl z0i(eGLIDvrktc8^*Xpa;r$4W$`Mj(**;j5)st=O%yQJGk^!}tFY5z;N@6+ugx*=(w zrT4e%&r3D!dbjy73K#{90!9I&fKk9GU=%P47zK<1MggOMQD6oN&>SJxGeppDzm*5z91sni_pc6a*R)9s|_XUJ}23`jv zU=VBt>%eW`@_a(Zz=z;9Fbej9e((^u16-U($Z2p490vP=4ekd^!EEryTtd!(6X0Di z3Z4Pm!D?_9SPU-A!8L*pzzbjiYyo$JCh*M-gnSH+fKl)`=mqP+a;j!Y+QKrRH!I#+EuR)y z*5ZtFH}LITDWXFDQ*`~3V4SFKmPMnyErvsM?G9xJ>TTyD+F@<59tnJ=yVZ^+fWvx6@-!03L64<$*NL?RFlz&^iQpLuRLJCyg9kHAn zF-O>?$gAGJtHijlT?}67-Lj!2YxyP5i%%Xg9tJ*VN=mK4G{sdviwZ%VLP|6X+q7kazvb#u)$@c^@tig=Og4gs4JTa{ zC}F{}*GHYf8jqt^D%%c^`c*KH_E72^w&S^QwKWG`nX8fxs!q&&RRl)rMs@qFmxlFj zmzua#fEwTO38pA@Z_+_*TK|7cW1Zzp;w3;#=flt8O z;2@BBzXvvgW^fB=0%OSUPl7`r$^F;j|Ha@ua{8~pQLqQ>1owgEU?E8I{S(OTj{uqT z?*ThO7g!DEgA33?>Tz0XVm70IQNSo*6fg=H1+EeW5NcV~r8pgGPN62E0?s%Zi&)-8 zpr-2F)z#YRR8Ep;%^sp23csl;uT?ImPrs@nOWV4ZqGQJLc~tqm5@MDc{*4+-{g^n; zYlm3m_Pgb(Qaa8pzb`Oln)nq Date: Tue, 18 Apr 2023 11:53:13 -0700 Subject: [PATCH 3/7] update spec output --- codegen/specs/stytch/billing.yml | 2 + codegen/specs/stytch/discovery.yml | 74 +++ codegen/specs/stytch/magic.yml | 2 + codegen/specs/stytch/magic_links.yml | 137 ------ codegen/specs/stytch/multitenant_magic.yml | 40 +- codegen/specs/stytch/multitenant_password.yml | 176 +++++++ codegen/specs/stytch/multitenant_session.yml | 25 +- codegen/specs/stytch/oauth.yml | 2 + codegen/specs/stytch/organization.yml | 92 +++- codegen/specs/stytch/otp.yml | 137 +----- codegen/specs/stytch/password.yml | 18 + codegen/specs/stytch/passwords.yml | 177 ------- codegen/specs/stytch/sso.yml | 57 ++- stytch/api/billing_service.py | 25 + stytch/api/biometric_service.py | 7 +- stytch/api/cname_record_service.py | 14 +- stytch/api/crypto_wallet_service.py | 3 +- stytch/api/debug_service.py | 5 +- stytch/api/discovery_service.py | 216 ++++++++ stytch/api/email_template_service.py | 14 +- stytch/api/magic_link_url_service.py | 14 +- stytch/api/magic_service.py | 28 +- stytch/api/multi_tenant_magic_service.py | 125 ++++- stytch/api/multi_tenant_password_service.py | 460 ++++++++++++++++++ stytch/api/multi_tenant_session_service.py | 64 ++- stytch/api/o_auth_service.py | 52 +- stytch/api/organization_service.py | 240 ++++++++- stytch/api/otp_service.py | 14 +- stytch/api/password_service.py | 58 ++- stytch/api/project_service.py | 14 +- stytch/api/public_token_service.py | 14 +- stytch/api/script_service.py | 14 +- stytch/api/sdk_service.py | 14 +- stytch/api/secret_service.py | 14 +- stytch/api/session_service.py | 7 +- stytch/api/sso_service.py | 168 +++++-- stytch/api/totp_service.py | 3 +- stytch/api/user_service.py | 30 +- stytch/api/web_authn_service.py | 7 +- stytch/models/billing_service.py | 1 + stytch/models/discovery_service.py | 30 ++ stytch/models/multi_tenant_magic_service.py | 16 +- .../models/multi_tenant_password_service.py | 70 +++ stytch/models/multi_tenant_session_service.py | 13 +- stytch/models/o_auth_service.py | 2 + stytch/models/organization_service.py | 29 ++ stytch/models/password_service.py | 2 + stytch/models/sso_service.py | 16 +- 48 files changed, 2069 insertions(+), 673 deletions(-) create mode 100644 codegen/specs/stytch/billing.yml create mode 100644 codegen/specs/stytch/discovery.yml delete mode 100644 codegen/specs/stytch/magic_links.yml create mode 100644 codegen/specs/stytch/multitenant_password.yml delete mode 100644 codegen/specs/stytch/passwords.yml create mode 100644 stytch/api/billing_service.py create mode 100644 stytch/api/discovery_service.py create mode 100644 stytch/api/multi_tenant_password_service.py create mode 100644 stytch/models/billing_service.py create mode 100644 stytch/models/discovery_service.py create mode 100644 stytch/models/multi_tenant_password_service.py diff --git a/codegen/specs/stytch/billing.yml b/codegen/specs/stytch/billing.yml new file mode 100644 index 00000000..9598c137 --- /dev/null +++ b/codegen/specs/stytch/billing.yml @@ -0,0 +1,2 @@ +classname: BillingService +methods: [] diff --git a/codegen/specs/stytch/discovery.yml b/codegen/specs/stytch/discovery.yml new file mode 100644 index 00000000..e09b5313 --- /dev/null +++ b/codegen/specs/stytch/discovery.yml @@ -0,0 +1,74 @@ +classname: DiscoveryService +methods: + - name: DiscoveryOrganizations + args: + - name: intermediate_session_token + arg_type: Optional[str] = None + - name: session_token + arg_type: Optional[str] = None + - name: session_jwt + arg_type: Optional[str] = None + response_type: + request_id: str + email_address: str + discovered_organizations: null + method: post + api_path: /v1/b2b/discovery/organizations + - name: DiscoveryIntermediateSessionExchange + args: + - name: intermediate_session_token + arg_type: str + - name: organization_id + arg_type: str + - name: session_duration_minutes + arg_type: Optional[int] = None + - name: session_custom_claims + arg_type: Optional[Dict[str, str]] = None + response_type: + request_id: str + member_id: str + member_session: null + session_token: str + session_jwt: str + member: null + organization: null + method: post + api_path: /v1/b2b/discovery/intermediate_sessions/exchange + - name: DiscoveryOrganizationCreate + args: + - name: intermediate_session_token + arg_type: str + - name: session_duration_minutes + arg_type: Optional[int] = None + - name: session_custom_claims + arg_type: Optional[Dict[str, str]] = None + - name: organization_name + arg_type: str + - name: organization_slug + arg_type: str + - name: organization_logo_url + arg_type: str + - name: trusted_metadata + arg_type: Optional[Dict[str, str]] = None + - name: sso_jit_provisioning + arg_type: Optional[str] = None + - name: email_allowed_domains + arg_type: List[str] + - name: email_jit_provisioning + arg_type: Optional[str] = None + - name: email_invites + arg_type: Optional[str] = None + - name: auth_methods + arg_type: Optional[str] = None + - name: allowed_auth_methods + arg_type: List[str] + response_type: + request_id: str + member_id: str + member_session: null + session_token: str + session_jwt: str + member: null + organization: null + method: post + api_path: /v1/b2b/discovery/organizations/create diff --git a/codegen/specs/stytch/magic.yml b/codegen/specs/stytch/magic.yml index 0fca139f..5624feca 100644 --- a/codegen/specs/stytch/magic.yml +++ b/codegen/specs/stytch/magic.yml @@ -243,6 +243,8 @@ methods: arg_type: str - name: token arg_type: str + - name: stytch_token_type + arg_type: str response_type: request_id: str redirect_url: str diff --git a/codegen/specs/stytch/magic_links.yml b/codegen/specs/stytch/magic_links.yml deleted file mode 100644 index 176168fd..00000000 --- a/codegen/specs/stytch/magic_links.yml +++ /dev/null @@ -1,137 +0,0 @@ -classname: MagicLinks -methods: - - name: create - use_base_path_as_api_path: True - method: POST - args: - - name: user_id - arg_type: str - - name: expiration_minutes - arg_type: Optional[int] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - response_type: - status_code: int - request_id: str - user_id: str - token: str - - name: authenticate - method: POST - args: - - name: token - arg_type: str - - name: attributes - arg_type: Optional[Dict[str, str]] = None - - name: options - arg_type: Optional[Dict[str, str]] = None - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - - name: code_verifier - arg_type: Optional[str] = None - response_type: - status_code: int - request_id: str - user_id: str - user: User - method_id: str - reset_sessions: bool - session_jwt: str - session_token: str - session: Optional[StytchSession] -sub_apis: - - classname: Email - additional_imports: - - from stytch.core.models import Name - sub_url: magic_links/email - filename: magic_links_email - methods: - - name: send - method: POST - args: - - name: email - arg_type: str - - name: login_magic_link_url - arg_type: Optional[str] = None - - name: signup_magic_link_url - arg_type: Optional[str] = None - - name: login_expiration_minutes - arg_type: Optional[int] = None - - name: signup_expiration_minutes - arg_type: Optional[int] = None - - name: locale - arg_type: Optional[str] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - - name: code_challenge - arg_type: Optional[str] = None - - name: user_id - arg_type: Optional[str] = None - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: login_template_id - arg_type: Optional[str] = None - - name: signup_template_id - arg_type: Optional[str] = None - response_type: - user_id: str - email_id: str - - name: login_or_create - method: POST - args: - - name: email - arg_type: str - - name: login_magic_link_url - arg_type: Optional[str] = None - - name: signup_magic_link_url - arg_type: Optional[str] = None - - name: login_expiration_minutes - arg_type: Optional[int] = None - - name: signup_expiration_minutes - arg_type: Optional[int] = None - - name: create_user_as_pending - arg_type: Optional[bool] = None - - name: locale - arg_type: Optional[str] = None - - name: login_template_id - arg_type: Optional[str] = None - - name: signup_template_id - arg_type: Optional[str] = None - response_type: - user_id: str - email_id: str - user_created: bool - - name: invite - method: POST - args: - - name: email - arg_type: str - - name: invite_magic_link_url - arg_type: Optional[str] = None - - name: invite_expiration_minutes - arg_type: Optional[int] = None - - name: name - arg_type: Optional[Union[Name, Dict[str, str]]] = None - map_pydantic: true - - name: locale - arg_type: Optional[str] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - - name: invite_template_id - arg_type: Optional[str] = None - response_type: - user_id: str - email_id: str - - name: revoke_invite - method: POST - args: - - name: email - arg_type: str - response_type: {} diff --git a/codegen/specs/stytch/multitenant_magic.yml b/codegen/specs/stytch/multitenant_magic.yml index f70723d8..b7942b41 100644 --- a/codegen/specs/stytch/multitenant_magic.yml +++ b/codegen/specs/stytch/multitenant_magic.yml @@ -6,8 +6,6 @@ methods: arg_type: str - name: email_address arg_type: str - - name: create_user_as_pending - arg_type: bool - name: login_redirect_url arg_type: Optional[str] = None - name: signup_redirect_url @@ -18,11 +16,14 @@ methods: arg_type: Optional[str] = None - name: signup_template_id arg_type: Optional[str] = None + - name: locale + arg_type: Optional[str] = None response_type: request_id: str member_id: str member_created: bool member: null + organization: null method: post api_path: /v1/b2b/magic_links/email/login_or_signup - name: MultiTenantMagicLinksEmailInvite @@ -43,10 +44,13 @@ methods: arg_type: Optional[Dict[str, str]] = None - name: invite_template_id arg_type: Optional[str] = None + - name: locale + arg_type: Optional[str] = None response_type: request_id: str member_id: str member: null + organization: null method: post api_path: /v1/b2b/magic_links/email/invite - name: MultiTenantMagicLinksAuthenticate @@ -72,6 +76,36 @@ methods: member: null session_token: str session_jwt: str - session: null + member_session: null + organization: null method: post api_path: /v1/b2b/magic_links/authenticate + - name: B2BMagicLinksEmailDiscoverySend + args: + - name: email_address + arg_type: str + - name: discovery_redirect_url + arg_type: Optional[str] = None + - name: pkce_code_challenge + arg_type: Optional[str] = None + - name: login_template_id + arg_type: Optional[str] = None + - name: locale + arg_type: Optional[str] = None + response_type: + request_id: str + method: post + api_path: /v1/b2b/magic_links/email/discovery/send + - name: B2BMagicLinksDiscoveryAuthenticate + args: + - name: discovery_magic_links_token + arg_type: str + - name: pkce_code_verifier + arg_type: Optional[str] = None + response_type: + request_id: str + intermediate_session_token: str + email_address: str + discovered_organizations: null + method: post + api_path: /v1/b2b/magic_links/discovery/authenticate diff --git a/codegen/specs/stytch/multitenant_password.yml b/codegen/specs/stytch/multitenant_password.yml new file mode 100644 index 00000000..18f2e29a --- /dev/null +++ b/codegen/specs/stytch/multitenant_password.yml @@ -0,0 +1,176 @@ +classname: MultiTenantPasswordService +methods: + - name: MultiTenantPasswordStrengthCheck + args: + - name: password + arg_type: str + - name: email_address + arg_type: Optional[str] = None + response_type: + request_id: str + valid_password: bool + score: null + breached_password: bool + luds_feedback: null + strength_policy: str + breach_detection_on_create: bool + zxcvbn_feedback: null + method: post + api_path: /v1/b2b/passwords/strength_check + - name: MultiTenantPasswordMigrate + args: + - name: email_address + arg_type: str + - name: hash + arg_type: str + - name: hash_type + arg_type: str + - name: md_5_config + arg_type: null + - name: argon_2_config + arg_type: null + - name: sha_1_config + arg_type: null + - name: scrypt_config + arg_type: null + - name: organization_id + arg_type: str + - name: name + arg_type: str + - name: trusted_metadata + arg_type: Optional[Dict[str, str]] = None + - name: untrusted_metadata + arg_type: Optional[Dict[str, str]] = None + response_type: + request_id: str + member_id: str + member_created: bool + member: null + organization: null + method: post + api_path: /v1/b2b/passwords/migrate + - name: MultiTenantPasswordAuthenticate + args: + - name: organization_id + arg_type: str + - name: email_address + arg_type: str + - name: password + arg_type: str + - name: session_token + arg_type: Optional[str] = None + - name: session_duration_minutes + arg_type: Optional[int] = None + - name: session_jwt + arg_type: Optional[str] = None + - name: session_custom_claims + arg_type: Optional[Dict[str, str]] = None + response_type: + request_id: str + member_id: str + organization_id: str + member: null + session_token: str + session_jwt: str + member_session: null + organization: null + method: post + api_path: /v1/b2b/passwords/authenticate + - name: MultiTenantPasswordEmailResetStart + args: + - name: organization_id + arg_type: str + - name: email_address + arg_type: str + - name: reset_password_redirect_url + arg_type: str + - name: reset_password_expiration_minutes + arg_type: Optional[int] = None + - name: code_challenge + arg_type: Optional[str] = None + - name: login_redirect_url + arg_type: str + - name: locale + arg_type: Optional[str] = None + - name: reset_password_template_id + arg_type: Optional[str] = None + response_type: + request_id: str + member_id: str + member_email_id: str + method: post + api_path: /v1/b2b/passwords/email/reset/start + - name: MultiTenantPasswordEmailReset + args: + - name: password_reset_token + arg_type: str + - name: password + arg_type: str + - name: session_token + arg_type: Optional[str] = None + - name: session_duration_minutes + arg_type: Optional[int] = None + - name: session_jwt + arg_type: Optional[str] = None + - name: code_verifier + arg_type: Optional[str] = None + - name: session_custom_claims + arg_type: Optional[Dict[str, str]] = None + response_type: + request_id: str + member_id: str + member_email_id: str + organization_id: str + member: null + session_token: str + session_jwt: str + member_session: null + organization: null + method: post + api_path: /v1/b2b/passwords/email/reset + - name: MultiTenantPasswordSessionReset + args: + - name: organization_id + arg_type: str + - name: password + arg_type: str + - name: session_token + arg_type: Optional[str] = None + - name: session_jwt + arg_type: Optional[str] = None + response_type: + request_id: str + member_id: str + member_session: null + member: null + organization: null + method: post + api_path: /v1/b2b/passwords/session/reset + - name: MultiTenantPasswordExistingPasswordReset + args: + - name: email_address + arg_type: str + - name: existing_password + arg_type: str + - name: new_password + arg_type: str + - name: session_token + arg_type: Optional[str] = None + - name: session_duration_minutes + arg_type: Optional[int] = None + - name: session_jwt + arg_type: Optional[str] = None + - name: session_custom_claims + arg_type: Optional[Dict[str, str]] = None + - name: organization_id + arg_type: str + response_type: + request_id: str + member_id: str + member_session: null + member: null + session_token: str + session_jwt: str + organization: null + method: post + api_path: /v1/b2b/passwords/existing_password/reset diff --git a/codegen/specs/stytch/multitenant_session.yml b/codegen/specs/stytch/multitenant_session.yml index db1b9272..0e910033 100644 --- a/codegen/specs/stytch/multitenant_session.yml +++ b/codegen/specs/stytch/multitenant_session.yml @@ -8,7 +8,7 @@ methods: arg_type: str response_type: request_id: str - sessions: null + member_sessions: null method: get api_path: /v1/b2b/sessions - name: MultiTenantSessionsAuthenticate @@ -27,6 +27,7 @@ methods: session_token: str session_jwt: str member: null + organization: null method: post api_path: /v1/b2b/sessions/authenticate - name: MultiTenantSessionsRevoke @@ -43,3 +44,25 @@ methods: request_id: str method: post api_path: /v1/b2b/sessions/revoke + - name: MultiTenantSessionsExchange + args: + - name: organization_id + arg_type: str + - name: session_token + arg_type: Optional[str] = None + - name: session_jwt + arg_type: Optional[str] = None + - name: session_duration_minutes + arg_type: Optional[int] = None + - name: session_custom_claims + arg_type: Optional[Dict[str, str]] = None + response_type: + request_id: str + member_id: str + member_session: null + session_token: str + session_jwt: str + member: null + organization: null + method: post + api_path: /v1/b2b/sessions/exchange diff --git a/codegen/specs/stytch/oauth.yml b/codegen/specs/stytch/oauth.yml index 52d59fac..f412368c 100644 --- a/codegen/specs/stytch/oauth.yml +++ b/codegen/specs/stytch/oauth.yml @@ -72,6 +72,7 @@ methods: session_jwt: str user: User reset_sessions: bool + user_created: bool method: post api_path: /v1/oauth/google/id_token/authenticate - name: OAuthMicrosoftStart @@ -141,6 +142,7 @@ methods: session_jwt: str user: User reset_sessions: bool + user_created: bool method: post api_path: /v1/oauth/apple/id_token/authenticate - name: OAuthGithubStart diff --git a/codegen/specs/stytch/organization.yml b/codegen/specs/stytch/organization.yml index b65aabaa..1100d4c7 100644 --- a/codegen/specs/stytch/organization.yml +++ b/codegen/specs/stytch/organization.yml @@ -10,12 +10,18 @@ methods: arg_type: str - name: trusted_metadata arg_type: Optional[Dict[str, str]] = None + - name: sso_jit_provisioning + arg_type: Optional[str] = None - name: email_allowed_domains arg_type: List[str] - name: email_jit_provisioning arg_type: Optional[str] = None - name: email_invites arg_type: Optional[str] = None + - name: auth_methods + arg_type: Optional[str] = None + - name: allowed_auth_methods + arg_type: List[str] response_type: request_id: str organization: Organization @@ -44,12 +50,20 @@ methods: arg_type: Optional[Dict[str, str]] = None - name: sso_default_connection_id arg_type: Optional[str] = None + - name: sso_jit_provisioning + arg_type: Optional[str] = None + - name: sso_jit_provisioning_allowed_connections + arg_type: Optional[List[str]] = None - name: email_allowed_domains arg_type: Optional[List[str]] = None - name: email_jit_provisioning arg_type: Optional[str] = None - name: email_invites arg_type: Optional[str] = None + - name: auth_methods + arg_type: Optional[str] = None + - name: allowed_auth_methods + arg_type: Optional[List[str]] = None response_type: request_id: str organization: Organization @@ -64,6 +78,50 @@ methods: organization_id: str method: delete api_path: /v1/b2b/organizations/{organization_id} + - name: OrganizationsMemberCreate + args: + - name: organization_id + arg_type: str + - name: email_address + arg_type: str + - name: name + arg_type: Optional[str] = None + - name: trusted_metadata + arg_type: Optional[Dict[str, str]] = None + - name: untrusted_metadata + arg_type: Optional[Dict[str, str]] = None + - name: create_member_as_pending + arg_type: bool + - name: is_breakglass + arg_type: bool + response_type: + request_id: str + member_id: str + member: null + organization: Organization + method: post + api_path: /v1/b2b/organizations/{organization_id}/members + - name: OrganizationsMemberUpdate + args: + - name: organization_id + arg_type: str + - name: member_id + arg_type: str + - name: name + arg_type: Optional[str] = None + - name: trusted_metadata + arg_type: Optional[Dict[str, str]] = None + - name: untrusted_metadata + arg_type: Optional[Dict[str, str]] = None + - name: is_breakglass + arg_type: Optional[bool] = None + response_type: + request_id: str + member_id: str + member: null + organization: Organization + method: put + api_path: /v1/b2b/organizations/{organization_id}/members/{member_id} - name: OrganizationsMemberDelete args: - name: organization_id @@ -74,7 +132,7 @@ methods: request_id: str member_id: str method: delete - api_path: /v1/b2b/organizations/{organization_id}/member/{member_id} + api_path: /v1/b2b/organizations/{organization_id}/members/{member_id} - name: OrganizationsSearchExternal args: - name: cursor @@ -97,11 +155,39 @@ methods: arg_type: Optional[int] = None - name: query arg_type: ExternalSearchQuery - - name: organization_id - arg_type: str + - name: organization_ids + arg_type: List[str] response_type: request_id: str members: List[Member] results_metadata: ResultsMetadata method: post api_path: /v1/b2b/organizations/members/search + - name: OrganizationsMemberDeletePassword + args: + - name: organization_id + arg_type: str + - name: member_password_id + arg_type: str + response_type: + request_id: str + member_id: str + member: null + organization: null + method: delete + api_path: /v1/b2b/organizations/{organization_id}/members/passwords/{member_password_id} + - name: OrganizationsMemberGet + args: + - name: organization_id + arg_type: str + - name: member_id + arg_type: Optional[str] = None + - name: email_address + arg_type: Optional[str] = None + response_type: + request_id: str + member_id: str + member: null + organization: null + method: get + api_path: /v1/b2b/organizations/{organization_id}/member diff --git a/codegen/specs/stytch/otp.yml b/codegen/specs/stytch/otp.yml index b7dac3a4..25cdd93d 100644 --- a/codegen/specs/stytch/otp.yml +++ b/codegen/specs/stytch/otp.yml @@ -155,135 +155,8 @@ methods: method_id: str session_token: str session: Optional[StytchSession] -sub_apis: - - classname: Email - sub_url: otps/email - filename: otp_email - methods: - - name: send - method: POST - args: - - name: email - arg_type: str - - name: expiration_minutes - arg_type: Optional[int] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - - name: locale - arg_type: Optional[str] = None - - name: user_id - arg_type: Optional[str] = None - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: login_template_id - arg_type: Optional[str] = None - - name: signup_template_id - arg_type: Optional[str] = None - response_type: - user_id: str - email_id: str - - name: login_or_create - method: POST - args: - - name: email - arg_type: str - - name: expiration_minutes - arg_type: Optional[int] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - - name: create_user_as_pending - arg_type: bool = False - - name: locale - arg_type: Optional[str] = None - - name: login_template_id - arg_type: Optional[str] = None - - name: signup_template_id - arg_type: Optional[str] = None - response_type: - user_id: str - email_id: str - user_created: bool - - classname: SMS - sub_url: otps/sms - filename: otp_sms - methods: - - name: send - method: POST - args: - - name: phone_number - arg_type: str - - name: expiration_minutes - arg_type: Optional[int] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - - name: locale - arg_type: Optional[str] = None - - name: user_id - arg_type: Optional[str] = None - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - response_type: - user_id: str - phone_id: str - - name: login_or_create - method: POST - args: - - name: phone_number - arg_type: str - - name: expiration_minutes - arg_type: Optional[int] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - - name: create_user_as_pending - arg_type: bool = False - - name: locale - arg_type: Optional[str] = None - response_type: - user_id: str - phone_id: str - user_created: bool - - classname: Whatsapp - sub_url: otps/whatsapp - filename: otp_whatsapp - methods: - - name: send - method: POST - args: - - name: phone_number - arg_type: str - - name: expiration_minutes - arg_type: Optional[int] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - - name: locale - arg_type: Optional[str] = None - - name: user_id - arg_type: Optional[str] = None - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - response_type: - user_id: str - phone_id: str - - name: login_or_create - method: POST - args: - - name: phone_number - arg_type: str - - name: expiration_minutes - arg_type: Optional[int] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - - name: create_user_as_pending - arg_type: bool = False - - name: locale - arg_type: Optional[str] = None - response_type: - user_id: str - phone_id: str - user_created: bool + session_jwt: str + user: User + reset_sessions: bool + method: post + api_path: /v1/otps/authenticate diff --git a/codegen/specs/stytch/password.yml b/codegen/specs/stytch/password.yml index cd141d5a..e8c67ddf 100644 --- a/codegen/specs/stytch/password.yml +++ b/codegen/specs/stytch/password.yml @@ -10,6 +10,12 @@ methods: arg_type: Optional[int] = None - name: session_custom_claims arg_type: Optional[Dict[str, str]] = None + - name: trusted_metadata + arg_type: Optional[Dict[str, str]] = None + - name: untrusted_metadata + arg_type: Optional[Dict[str, str]] = None + - name: name + arg_type: null response_type: request_id: str user_id: str @@ -55,6 +61,8 @@ methods: score: null breached_password: bool feedback: null + strength_policy: str + breach_detection_on_create: bool method: post api_path: /v1/passwords/strength_check - name: PasswordsEmailResetStart @@ -166,6 +174,16 @@ methods: arg_type: null - name: scrypt_config arg_type: null + - name: first_name + arg_type: str + - name: last_name + arg_type: str + - name: trusted_metadata + arg_type: Optional[Dict[str, str]] = None + - name: untrusted_metadata + arg_type: Optional[Dict[str, str]] = None + - name: set_email_verified + arg_type: bool response_type: request_id: str user_id: str diff --git a/codegen/specs/stytch/passwords.yml b/codegen/specs/stytch/passwords.yml deleted file mode 100644 index 64dc61ea..00000000 --- a/codegen/specs/stytch/passwords.yml +++ /dev/null @@ -1,177 +0,0 @@ -classname: Passwords -additional_imports: - - from stytch.core.models import Name -methods: - - name: create - method: POST - use_base_path_as_api_path: True - args: - - name: email - arg_type: str - - name: password - arg_type: str - - name: name - arg_type: Optional[Union[Name, Dict[str, str]]] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - - name: trusted_metadata - arg_type: Optional[Dict[str, Any]] = None - - name: untrusted_metadata - arg_type: Optional[Dict[str, Any]] = None - response_type: - user_id: str - email_id: str - - name: authenticate - method: POST - args: - - name: email - arg_type: str - - name: password - arg_type: str - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - response_type: - user_id: str - user: User - session_jwt: str - session_token: str - session: Optional[StytchSession] - - name: strength_check - method: POST - args: - - name: password - arg_type: str - - name: email - arg_type: Optional[str] = None - response_type: - valid_password: bool - score: int - breached_password: bool - feedback: Dict[str, Any] - strength_policy: str - breach_detection_on_create: bool - - name: migrate - method: POST - args: - - name: email - arg_type: str - - name: hash - arg_type: str - - name: hash_type - arg_type: str - - name: md_5_config - arg_type: Optional[Dict[str, Any]] = None - - name: argon_2_config - arg_type: Optional[Dict[str, Any]] = None - - name: sha_1_config - arg_type: Optional[Dict[str, Any]] = None - - name: scrypt_config - arg_type: Optional[Dict[str, Any]] = None - - name: name - arg_type: Optional[Union[Name, Dict[str, str]]] = None - - name: trusted_metadata - arg_type: Optional[Dict[str, Any]] = None - - name: untrusted_metadata - arg_type: Optional[Dict[str, Any]] = None - response_type: - user_id: str - email_id: str - user_created: bool -sub_apis: - - classname: Email - sub_url: passwords/email - filename: passwords_email - methods: - - name: reset_start - api_path: reset/start - method: POST - args: - - name: email - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: reset_password_redirect_url - arg_type: Optional[str] = None - - name: reset_password_expiration_minutes - arg_type: Optional[int] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - - name: code_challenge - arg_type: Optional[str] = None - - name: locale - arg_type: Optional[str] = None - - name: reset_password_template_id - arg_type: Optional[str] = None - response_type: - user_id: str - email_id: str - - name: reset - method: POST - args: - - name: token - arg_type: str - - name: password - arg_type: str - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - - name: options - arg_type: Optional[Dict[str, str]] = None - - name: code_verifier - arg_type: Optional[str] = None - response_type: - user_id: str - - classname: ExistingPassword - sub_url: passwords/existing_password - filename: passwords_existing_password - methods: - - name: reset - method: POST - args: - - name: email - arg_type: str - - name: existing_password - arg_type: str - - name: new_password - arg_type: str - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - response_type: - user_id: str - - classname: Session - sub_url: passwords/session - filename: passwords_session - methods: - - name: reset - method: POST - args: - - name: password - arg_type: str - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - response_type: - user_id: str - session: Optional[StytchSession] diff --git a/codegen/specs/stytch/sso.yml b/codegen/specs/stytch/sso.yml index 472ee363..ae9c9e1a 100644 --- a/codegen/specs/stytch/sso.yml +++ b/codegen/specs/stytch/sso.yml @@ -1,23 +1,62 @@ classname: SSOService methods: + - name: CreateOIDCConnection + args: + - name: organization_id + arg_type: str + - name: display_name + arg_type: str + response_type: + request_id: str + connection: null + method: post + api_path: /v1/b2b/sso/oidc/{organization_id} - name: CreateSAMLConnection args: - name: organization_id arg_type: str - - name: identity_provider + - name: display_name arg_type: str response_type: request_id: str connection: null method: post api_path: /v1/b2b/sso/saml/{organization_id} + - name: UpdateOIDCConnection + args: + - name: organization_id + arg_type: str + - name: connection_id + arg_type: str + - name: display_name + arg_type: str + - name: client_id + arg_type: str + - name: client_secret + arg_type: str + - name: issuer + arg_type: str + - name: authorization_url + arg_type: str + - name: token_url + arg_type: str + - name: userinfo_url + arg_type: str + - name: jwks_url + arg_type: str + response_type: + request_id: str + connection: null + warning: Optional[str] = None + method: put + api_path: /v1/b2b/sso/oidc/{organization_id}/connections/{connection_id} - name: UpdateSAMLConnection args: - name: organization_id arg_type: str - name: connection_id arg_type: str - - name: entity_id + - name: idp_entity_id arg_type: str - name: display_name arg_type: str @@ -25,6 +64,10 @@ methods: arg_type: Optional[Dict[str, str]] = None - name: x509_certificate arg_type: str + - name: idp_sso_url + arg_type: str + - name: null + arg_type: null response_type: request_id: str connection: null @@ -59,6 +102,7 @@ methods: response_type: request_id: str saml_connections: null + oidc_connections: null method: get api_path: /v1/b2b/sso/{organization_id} - name: DeleteSSOConnection @@ -74,9 +118,9 @@ methods: api_path: /v1/b2b/sso/{organization_id}/connections/{connection_id} - name: SSOAuthenticate args: - - name: token + - name: sso_token arg_type: str - - name: code_verifier + - name: pkce_code_verifier arg_type: Optional[str] = None - name: session_token arg_type: Optional[str] = None @@ -93,8 +137,9 @@ methods: member: null session_token: str session_jwt: str - session: null + member_session: null reset_session: bool + organization: null method: post api_path: /v1/b2b/sso/authenticate - name: DeleteSAMLVerificationCertificate @@ -109,4 +154,4 @@ methods: request_id: str certificate_id: str method: delete - api_path: /v1/b2b/sso/{organization_id}/connections/{connection_id}/verification_certificate/{certificate_id} + api_path: /v1/b2b/sso/saml/{organization_id}/connections/{connection_id}/verification_certificates/{certificate_id} diff --git a/stytch/api/billing_service.py b/stytch/api/billing_service.py new file mode 100644 index 00000000..30215617 --- /dev/null +++ b/stytch/api/billing_service.py @@ -0,0 +1,25 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient + + +class BillingService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "billing_service" diff --git a/stytch/api/biometric_service.py b/stytch/api/biometric_service.py index 24b897ed..541826d3 100644 --- a/stytch/api/biometric_service.py +++ b/stytch/api/biometric_service.py @@ -6,14 +6,13 @@ from typing import Any, Dict, Optional - from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.biometric_service import ( - BiometricsregisterstartResponse, - BiometricsregisterResponse, - BiometricsauthenticatestartResponse, BiometricsauthenticateResponse, + BiometricsauthenticatestartResponse, + BiometricsregisterResponse, + BiometricsregisterstartResponse, ) diff --git a/stytch/api/cname_record_service.py b/stytch/api/cname_record_service.py index 230f896c..c4fa18ee 100644 --- a/stytch/api/cname_record_service.py +++ b/stytch/api/cname_record_service.py @@ -4,22 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.cname_record_service import ( -) class CNAMERecordService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -28,4 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "cname_record_service" - diff --git a/stytch/api/crypto_wallet_service.py b/stytch/api/crypto_wallet_service.py index 16d423b4..759bc1b1 100644 --- a/stytch/api/crypto_wallet_service.py +++ b/stytch/api/crypto_wallet_service.py @@ -6,12 +6,11 @@ from typing import Any, Dict, Optional - from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.crypto_wallet_service import ( - CryptowalletsauthenticatestartResponse, CryptowalletsauthenticateResponse, + CryptowalletsauthenticatestartResponse, ) diff --git a/stytch/api/debug_service.py b/stytch/api/debug_service.py index d1c9762c..7691ec9a 100644 --- a/stytch/api/debug_service.py +++ b/stytch/api/debug_service.py @@ -6,12 +6,9 @@ from typing import Any, Dict - from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.debug_service import ( - WhoamiResponse, -) +from stytch.models.debug_service import WhoamiResponse class DebugService: diff --git a/stytch/api/discovery_service.py b/stytch/api/discovery_service.py new file mode 100644 index 00000000..46f299b1 --- /dev/null +++ b/stytch/api/discovery_service.py @@ -0,0 +1,216 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.discovery_service import ( + DiscoveryintermediatesessionexchangeResponse, + DiscoveryorganizationcreateResponse, + DiscoveryorganizationsResponse, +) + + +class DiscoveryService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "discovery_service" + + def DiscoveryOrganizations( + self, + intermediate_session_token: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> DiscoveryorganizationsResponse: + + payload: Dict[str, Any] = { + } + + if intermediate_session_token is not None: + payload["intermediate_session_token"] = intermediate_session_token + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations") + + res = self.sync_client.post(url, json=payload) + return DiscoveryorganizationsResponse.from_json(res.response.status_code, res.json) + + async def DiscoveryOrganizations_async( + self, + intermediate_session_token: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> DiscoveryorganizationsResponse: + + payload: Dict[str, Any] = { + } + + if intermediate_session_token is not None: + payload["intermediate_session_token"] = intermediate_session_token + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations") + + res = await self.async_client.post(url, json=payload) + return DiscoveryorganizationsResponse.from_json(res.response.status, res.json) + + def DiscoveryIntermediateSessionExchange( + self, + intermediate_session_token: str, + organization_id: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> DiscoveryintermediatesessionexchangeResponse: + + payload: Dict[str, Any] = { + "intermediate_session_token": intermediate_session_token, + "organization_id": organization_id, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/intermediate_sessions/exchange") + + res = self.sync_client.post(url, json=payload) + return DiscoveryintermediatesessionexchangeResponse.from_json(res.response.status_code, res.json) + + async def DiscoveryIntermediateSessionExchange_async( + self, + intermediate_session_token: str, + organization_id: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> DiscoveryintermediatesessionexchangeResponse: + + payload: Dict[str, Any] = { + "intermediate_session_token": intermediate_session_token, + "organization_id": organization_id, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/intermediate_sessions/exchange") + + res = await self.async_client.post(url, json=payload) + return DiscoveryintermediatesessionexchangeResponse.from_json(res.response.status, res.json) + + def DiscoveryOrganizationCreate( + self, + intermediate_session_token: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + organization_name: str, + organization_slug: str, + organization_logo_url: str, + trusted_metadata: Optional[Dict[str, str]] = None, + sso_jit_provisioning: Optional[str] = None, + email_allowed_domains: List[str], + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: List[str], + ) -> DiscoveryorganizationcreateResponse: + + payload: Dict[str, Any] = { + "intermediate_session_token": intermediate_session_token, + "organization_name": organization_name, + "organization_slug": organization_slug, + "organization_logo_url": organization_logo_url, + "email_allowed_domains": email_allowed_domains, + "allowed_auth_methods": allowed_auth_methods, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations/create") + + res = self.sync_client.post(url, json=payload) + return DiscoveryorganizationcreateResponse.from_json(res.response.status_code, res.json) + + async def DiscoveryOrganizationCreate_async( + self, + intermediate_session_token: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + organization_name: str, + organization_slug: str, + organization_logo_url: str, + trusted_metadata: Optional[Dict[str, str]] = None, + sso_jit_provisioning: Optional[str] = None, + email_allowed_domains: List[str], + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: List[str], + ) -> DiscoveryorganizationcreateResponse: + + payload: Dict[str, Any] = { + "intermediate_session_token": intermediate_session_token, + "organization_name": organization_name, + "organization_slug": organization_slug, + "organization_logo_url": organization_logo_url, + "email_allowed_domains": email_allowed_domains, + "allowed_auth_methods": allowed_auth_methods, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations/create") + + res = await self.async_client.post(url, json=payload) + return DiscoveryorganizationcreateResponse.from_json(res.response.status, res.json) + diff --git a/stytch/api/email_template_service.py b/stytch/api/email_template_service.py index 3c21db56..3d92cee7 100644 --- a/stytch/api/email_template_service.py +++ b/stytch/api/email_template_service.py @@ -4,22 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.email_template_service import ( -) class EmailTemplateService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -28,4 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "email_template_service" - diff --git a/stytch/api/magic_link_url_service.py b/stytch/api/magic_link_url_service.py index ef29787d..db2f10b1 100644 --- a/stytch/api/magic_link_url_service.py +++ b/stytch/api/magic_link_url_service.py @@ -4,22 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.magic_link_url_service import ( -) class MagicLinkURLService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -28,4 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "magic_link_url_service" - diff --git a/stytch/api/magic_service.py b/stytch/api/magic_service.py index ba169579..808bb214 100644 --- a/stytch/api/magic_service.py +++ b/stytch/api/magic_service.py @@ -11,18 +11,18 @@ from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.magic_service import ( - SendmagicbyemailResponse, - MagiclinksemailsendResponse, - AuthenticatemagicResponse, - MagiclinksauthenticateResponse, - MagiclinksemailloginorcreateResponse, - SdkmagiclinksemailloginorcreateResponse, - InvitebyemailResponse, - MagiclinksemailinviteResponse, - MagiclinksemailrevokeinviteResponse, - MagiclinkredirectResponse, - MagiclinksredirectcaptchaResponse, - MagiclinkscreateResponse, + AuthenticatemagicResponse, + InvitebyemailResponse, + MagiclinkredirectResponse, + MagiclinksauthenticateResponse, + MagiclinkscreateResponse, + MagiclinksemailinviteResponse, + MagiclinksemailloginorcreateResponse, + MagiclinksemailrevokeinviteResponse, + MagiclinksemailsendResponse, + MagiclinksredirectcaptchaResponse, + SdkmagiclinksemailloginorcreateResponse, + SendmagicbyemailResponse, ) @@ -707,11 +707,13 @@ def MagicLinkRedirect( self, public_token: str, token: str, + stytch_token_type: str, ) -> MagiclinkredirectResponse: payload: Dict[str, Any] = { "public_token": public_token, "token": token, + "stytch_token_type": stytch_token_type, } @@ -724,11 +726,13 @@ async def MagicLinkRedirect_async( self, public_token: str, token: str, + stytch_token_type: str, ) -> MagiclinkredirectResponse: payload: Dict[str, Any] = { "public_token": public_token, "token": token, + "stytch_token_type": stytch_token_type, } diff --git a/stytch/api/multi_tenant_magic_service.py b/stytch/api/multi_tenant_magic_service.py index 6444eb34..26eca60a 100644 --- a/stytch/api/multi_tenant_magic_service.py +++ b/stytch/api/multi_tenant_magic_service.py @@ -6,13 +6,14 @@ from typing import Any, Dict, Optional - from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.multi_tenant_magic_service import ( - MultitenantmagiclinksemailloginorsignupResponse, - MultitenantmagiclinksemailinviteResponse, + B2BmagiclinksdiscoveryauthenticateResponse, + B2BmagiclinksemaildiscoverysendResponse, MultitenantmagiclinksauthenticateResponse, + MultitenantmagiclinksemailinviteResponse, + MultitenantmagiclinksemailloginorsignupResponse, ) @@ -35,17 +36,16 @@ def MultiTenantMagicLinksEmailLoginOrSignup( self, organization_id: str, email_address: str, - create_user_as_pending: bool, login_redirect_url: Optional[str] = None, signup_redirect_url: Optional[str] = None, pkce_code_challenge: Optional[str] = None, login_template_id: Optional[str] = None, signup_template_id: Optional[str] = None, + locale: Optional[str] = None, ) -> MultitenantmagiclinksemailloginorsignupResponse: payload: Dict[str, Any] = { "organization_id": organization_id, "email_address": email_address, - "create_user_as_pending": create_user_as_pending, } if login_redirect_url is not None: @@ -58,6 +58,8 @@ def MultiTenantMagicLinksEmailLoginOrSignup( payload["login_template_id"] = login_template_id if signup_template_id is not None: payload["signup_template_id"] = signup_template_id + if locale is not None: + payload["locale"] = locale url = self.api_base.route_with_sub_url( self.sub_url, "/v1/b2b/magic_links/email/login_or_signup" @@ -72,17 +74,16 @@ async def MultiTenantMagicLinksEmailLoginOrSignup_async( self, organization_id: str, email_address: str, - create_user_as_pending: bool, login_redirect_url: Optional[str] = None, signup_redirect_url: Optional[str] = None, pkce_code_challenge: Optional[str] = None, login_template_id: Optional[str] = None, signup_template_id: Optional[str] = None, + locale: Optional[str] = None, ) -> MultitenantmagiclinksemailloginorsignupResponse: payload: Dict[str, Any] = { "organization_id": organization_id, "email_address": email_address, - "create_user_as_pending": create_user_as_pending, } if login_redirect_url is not None: @@ -95,6 +96,8 @@ async def MultiTenantMagicLinksEmailLoginOrSignup_async( payload["login_template_id"] = login_template_id if signup_template_id is not None: payload["signup_template_id"] = signup_template_id + if locale is not None: + payload["locale"] = locale url = self.api_base.route_with_sub_url( self.sub_url, "/v1/b2b/magic_links/email/login_or_signup" @@ -115,6 +118,7 @@ def MultiTenantMagicLinksEmailInvite( trusted_metadata: Optional[Dict[str, str]] = None, untrusted_metadata: Optional[Dict[str, str]] = None, invite_template_id: Optional[str] = None, + locale: Optional[str] = None, ) -> MultitenantmagiclinksemailinviteResponse: payload: Dict[str, Any] = { "organization_id": organization_id, @@ -133,6 +137,8 @@ def MultiTenantMagicLinksEmailInvite( payload["untrusted_metadata"] = untrusted_metadata if invite_template_id is not None: payload["invite_template_id"] = invite_template_id + if locale is not None: + payload["locale"] = locale url = self.api_base.route_with_sub_url( self.sub_url, "/v1/b2b/magic_links/email/invite" @@ -153,6 +159,7 @@ async def MultiTenantMagicLinksEmailInvite_async( trusted_metadata: Optional[Dict[str, str]] = None, untrusted_metadata: Optional[Dict[str, str]] = None, invite_template_id: Optional[str] = None, + locale: Optional[str] = None, ) -> MultitenantmagiclinksemailinviteResponse: payload: Dict[str, Any] = { "organization_id": organization_id, @@ -171,6 +178,8 @@ async def MultiTenantMagicLinksEmailInvite_async( payload["untrusted_metadata"] = untrusted_metadata if invite_template_id is not None: payload["invite_template_id"] = invite_template_id + if locale is not None: + payload["locale"] = locale url = self.api_base.route_with_sub_url( self.sub_url, "/v1/b2b/magic_links/email/invite" @@ -246,3 +255,105 @@ async def MultiTenantMagicLinksAuthenticate_async( return MultitenantmagiclinksauthenticateResponse.from_json( res.response.status, res.json ) + + def B2BMagicLinksEmailDiscoverySend( + self, + email_address: str, + discovery_redirect_url: Optional[str] = None, + pkce_code_challenge: Optional[str] = None, + login_template_id: Optional[str] = None, + locale: Optional[str] = None, + ) -> B2BmagiclinksemaildiscoverysendResponse: + payload: Dict[str, Any] = { + "email_address": email_address, + } + + if discovery_redirect_url is not None: + payload["discovery_redirect_url"] = discovery_redirect_url + if pkce_code_challenge is not None: + payload["pkce_code_challenge"] = pkce_code_challenge + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/discovery/send" + ) + + res = self.sync_client.post(url, json=payload) + return B2BmagiclinksemaildiscoverysendResponse.from_json( + res.response.status_code, res.json + ) + + async def B2BMagicLinksEmailDiscoverySend_async( + self, + email_address: str, + discovery_redirect_url: Optional[str] = None, + pkce_code_challenge: Optional[str] = None, + login_template_id: Optional[str] = None, + locale: Optional[str] = None, + ) -> B2BmagiclinksemaildiscoverysendResponse: + payload: Dict[str, Any] = { + "email_address": email_address, + } + + if discovery_redirect_url is not None: + payload["discovery_redirect_url"] = discovery_redirect_url + if pkce_code_challenge is not None: + payload["pkce_code_challenge"] = pkce_code_challenge + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/discovery/send" + ) + + res = await self.async_client.post(url, json=payload) + return B2BmagiclinksemaildiscoverysendResponse.from_json( + res.response.status, res.json + ) + + def B2BMagicLinksDiscoveryAuthenticate( + self, + discovery_magic_links_token: str, + pkce_code_verifier: Optional[str] = None, + ) -> B2BmagiclinksdiscoveryauthenticateResponse: + payload: Dict[str, Any] = { + "discovery_magic_links_token": discovery_magic_links_token, + } + + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/discovery/authenticate" + ) + + res = self.sync_client.post(url, json=payload) + return B2BmagiclinksdiscoveryauthenticateResponse.from_json( + res.response.status_code, res.json + ) + + async def B2BMagicLinksDiscoveryAuthenticate_async( + self, + discovery_magic_links_token: str, + pkce_code_verifier: Optional[str] = None, + ) -> B2BmagiclinksdiscoveryauthenticateResponse: + payload: Dict[str, Any] = { + "discovery_magic_links_token": discovery_magic_links_token, + } + + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/discovery/authenticate" + ) + + res = await self.async_client.post(url, json=payload) + return B2BmagiclinksdiscoveryauthenticateResponse.from_json( + res.response.status, res.json + ) diff --git a/stytch/api/multi_tenant_password_service.py b/stytch/api/multi_tenant_password_service.py new file mode 100644 index 00000000..55b634a8 --- /dev/null +++ b/stytch/api/multi_tenant_password_service.py @@ -0,0 +1,460 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient +from stytch.models.multi_tenant_password_service import ( + MultitenantpasswordauthenticateResponse, + MultitenantpasswordemailresetResponse, + MultitenantpasswordemailresetstartResponse, + MultitenantpasswordexistingpasswordresetResponse, + MultitenantpasswordmigrateResponse, + MultitenantpasswordsessionresetResponse, + MultitenantpasswordstrengthcheckResponse, +) + + +class MultiTenantPasswordService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "multi_tenant_password_service" + + def MultiTenantPasswordStrengthCheck( + self, + password: str, + email_address: Optional[str] = None, + ) -> MultitenantpasswordstrengthcheckResponse: + + payload: Dict[str, Any] = { + "password": password, + } + + if email_address is not None: + payload["email_address"] = email_address + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/strength_check") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordstrengthcheckResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordStrengthCheck_async( + self, + password: str, + email_address: Optional[str] = None, + ) -> MultitenantpasswordstrengthcheckResponse: + + payload: Dict[str, Any] = { + "password": password, + } + + if email_address is not None: + payload["email_address"] = email_address + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/strength_check") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordstrengthcheckResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordMigrate( + self, + email_address: str, + hash: str, + hash_type: str, + md_5_config: None, + argon_2_config: None, + sha_1_config: None, + scrypt_config: None, + organization_id: str, + name: str, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordmigrateResponse: + + payload: Dict[str, Any] = { + "email_address": email_address, + "hash": hash, + "hash_type": hash_type, + "organization_id": organization_id, + "name": name, + } + + if md_5_config is not None: + payload["md_5_config"] = md_5_config + if argon_2_config is not None: + payload["argon_2_config"] = argon_2_config + if sha_1_config is not None: + payload["sha_1_config"] = sha_1_config + if scrypt_config is not None: + payload["scrypt_config"] = scrypt_config + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/migrate") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordmigrateResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordMigrate_async( + self, + email_address: str, + hash: str, + hash_type: str, + md_5_config: None, + argon_2_config: None, + sha_1_config: None, + scrypt_config: None, + organization_id: str, + name: str, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordmigrateResponse: + + payload: Dict[str, Any] = { + "email_address": email_address, + "hash": hash, + "hash_type": hash_type, + "organization_id": organization_id, + "name": name, + } + + if md_5_config is not None: + payload["md_5_config"] = md_5_config + if argon_2_config is not None: + payload["argon_2_config"] = argon_2_config + if sha_1_config is not None: + payload["sha_1_config"] = sha_1_config + if scrypt_config is not None: + payload["scrypt_config"] = scrypt_config + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/migrate") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordmigrateResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordAuthenticate( + self, + organization_id: str, + email_address: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordauthenticateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/authenticate") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordauthenticateResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordAuthenticate_async( + self, + organization_id: str, + email_address: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordauthenticateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/authenticate") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordauthenticateResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordEmailResetStart( + self, + organization_id: str, + email_address: str, + reset_password_redirect_url: str, + reset_password_expiration_minutes: Optional[int] = None, + code_challenge: Optional[str] = None, + login_redirect_url: str, + locale: Optional[str] = None, + reset_password_template_id: Optional[str] = None, + ) -> MultitenantpasswordemailresetstartResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "reset_password_redirect_url": reset_password_redirect_url, + "login_redirect_url": login_redirect_url, + } + + if reset_password_expiration_minutes is not None: + payload["reset_password_expiration_minutes"] = reset_password_expiration_minutes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if locale is not None: + payload["locale"] = locale + if reset_password_template_id is not None: + payload["reset_password_template_id"] = reset_password_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset/start") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordemailresetstartResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordEmailResetStart_async( + self, + organization_id: str, + email_address: str, + reset_password_redirect_url: str, + reset_password_expiration_minutes: Optional[int] = None, + code_challenge: Optional[str] = None, + login_redirect_url: str, + locale: Optional[str] = None, + reset_password_template_id: Optional[str] = None, + ) -> MultitenantpasswordemailresetstartResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "reset_password_redirect_url": reset_password_redirect_url, + "login_redirect_url": login_redirect_url, + } + + if reset_password_expiration_minutes is not None: + payload["reset_password_expiration_minutes"] = reset_password_expiration_minutes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if locale is not None: + payload["locale"] = locale + if reset_password_template_id is not None: + payload["reset_password_template_id"] = reset_password_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset/start") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordemailresetstartResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordEmailReset( + self, + password_reset_token: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + code_verifier: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordemailresetResponse: + + payload: Dict[str, Any] = { + "password_reset_token": password_reset_token, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if code_verifier is not None: + payload["code_verifier"] = code_verifier + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordemailresetResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordEmailReset_async( + self, + password_reset_token: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + code_verifier: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordemailresetResponse: + + payload: Dict[str, Any] = { + "password_reset_token": password_reset_token, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if code_verifier is not None: + payload["code_verifier"] = code_verifier + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordemailresetResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordSessionReset( + self, + organization_id: str, + password: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> MultitenantpasswordsessionresetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/session/reset") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordsessionresetResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordSessionReset_async( + self, + organization_id: str, + password: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> MultitenantpasswordsessionresetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/session/reset") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordsessionresetResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordExistingPasswordReset( + self, + email_address: str, + existing_password: str, + new_password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + organization_id: str, + ) -> MultitenantpasswordexistingpasswordresetResponse: + + payload: Dict[str, Any] = { + "email_address": email_address, + "existing_password": existing_password, + "new_password": new_password, + "organization_id": organization_id, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/existing_password/reset") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordexistingpasswordresetResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordExistingPasswordReset_async( + self, + email_address: str, + existing_password: str, + new_password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + organization_id: str, + ) -> MultitenantpasswordexistingpasswordresetResponse: + + payload: Dict[str, Any] = { + "email_address": email_address, + "existing_password": existing_password, + "new_password": new_password, + "organization_id": organization_id, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/existing_password/reset") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordexistingpasswordresetResponse.from_json(res.response.status, res.json) + diff --git a/stytch/api/multi_tenant_session_service.py b/stytch/api/multi_tenant_session_service.py index 8b0bec4e..061a735a 100644 --- a/stytch/api/multi_tenant_session_service.py +++ b/stytch/api/multi_tenant_session_service.py @@ -6,12 +6,12 @@ from typing import Any, Dict, Optional - from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.multi_tenant_session_service import ( - MultitenantsessionsgetResponse, MultitenantsessionsauthenticateResponse, + MultitenantsessionsexchangeResponse, + MultitenantsessionsgetResponse, MultitenantsessionsrevokeResponse, ) @@ -166,3 +166,63 @@ async def MultiTenantSessionsRevoke_async( return MultitenantsessionsrevokeResponse.from_json( res.response.status, res.json ) + + def MultiTenantSessionsExchange( + self, + organization_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantsessionsexchangeResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/exchange" + ) + + res = self.sync_client.post(url, json=payload) + return MultitenantsessionsexchangeResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantSessionsExchange_async( + self, + organization_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantsessionsexchangeResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/exchange" + ) + + res = await self.async_client.post(url, json=payload) + return MultitenantsessionsexchangeResponse.from_json( + res.response.status, res.json + ) diff --git a/stytch/api/o_auth_service.py b/stytch/api/o_auth_service.py index e8a9f230..2da09d27 100644 --- a/stytch/api/o_auth_service.py +++ b/stytch/api/o_auth_service.py @@ -11,32 +11,32 @@ from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.o_auth_service import ( - OauthattachResponse, - OauthgoogleonetapstartResponse, - OauthgooglestartResponse, - OauthgoogleidtokenauthenticateResponse, - OauthmicrosoftstartResponse, - OauthapplestartResponse, - OauthappleidtokenauthenticateResponse, - OauthgithubstartResponse, - OauthfacebookstartResponse, - OauthamazonstartResponse, - OauthbitbucketstartResponse, - OauthcoinbasestartResponse, - OauthdiscordstartResponse, - OauthfigmastartResponse, - OauthgitlabstartResponse, - OauthinstagramstartResponse, - OauthlinkedinstartResponse, - OauthshopifystartResponse, - OauthslackstartResponse, - OauthsnapchatstartResponse, - OauthspotifystartResponse, - OauthsteamstartResponse, - OauthtiktokstartResponse, - OauthtwitchstartResponse, - OauthtwitterstartResponse, - OauthauthenticateResponse, + OauthamazonstartResponse, + OauthappleidtokenauthenticateResponse, + OauthapplestartResponse, + OauthattachResponse, + OauthauthenticateResponse, + OauthbitbucketstartResponse, + OauthcoinbasestartResponse, + OauthdiscordstartResponse, + OauthfacebookstartResponse, + OauthfigmastartResponse, + OauthgithubstartResponse, + OauthgitlabstartResponse, + OauthgoogleidtokenauthenticateResponse, + OauthgoogleonetapstartResponse, + OauthgooglestartResponse, + OauthinstagramstartResponse, + OauthlinkedinstartResponse, + OauthmicrosoftstartResponse, + OauthshopifystartResponse, + OauthslackstartResponse, + OauthsnapchatstartResponse, + OauthspotifystartResponse, + OauthsteamstartResponse, + OauthtiktokstartResponse, + OauthtwitchstartResponse, + OauthtwitterstartResponse, ) diff --git a/stytch/api/organization_service.py b/stytch/api/organization_service.py index 0d28d0d0..4f3b82f7 100644 --- a/stytch/api/organization_service.py +++ b/stytch/api/organization_service.py @@ -14,8 +14,12 @@ OrganizationscreateResponse, OrganizationsdeleteResponse, OrganizationsgetResponse, + OrganizationsmembercreateResponse, + OrganizationsmemberdeletepasswordResponse, OrganizationsmemberdeleteResponse, + OrganizationsmembergetResponse, OrganizationsmembersearchexternalResponse, + OrganizationsmemberupdateResponse, OrganizationssearchexternalResponse, OrganizationsupdateResponse, ) @@ -42,9 +46,12 @@ def OrganizationsCreate( organization_slug: str, organization_logo_url: str, trusted_metadata: Optional[Dict[str, str]] = None, + sso_jit_provisioning: Optional[str] = None, email_allowed_domains: List[str], email_jit_provisioning: Optional[str] = None, email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: List[str], ) -> OrganizationscreateResponse: payload: Dict[str, Any] = { @@ -52,14 +59,19 @@ def OrganizationsCreate( "organization_slug": organization_slug, "organization_logo_url": organization_logo_url, "email_allowed_domains": email_allowed_domains, + "allowed_auth_methods": allowed_auth_methods, } if trusted_metadata is not None: payload["trusted_metadata"] = trusted_metadata + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning if email_jit_provisioning is not None: payload["email_jit_provisioning"] = email_jit_provisioning if email_invites is not None: payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations") @@ -72,9 +84,12 @@ async def OrganizationsCreate_async( organization_slug: str, organization_logo_url: str, trusted_metadata: Optional[Dict[str, str]] = None, + sso_jit_provisioning: Optional[str] = None, email_allowed_domains: List[str], email_jit_provisioning: Optional[str] = None, email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: List[str], ) -> OrganizationscreateResponse: payload: Dict[str, Any] = { @@ -82,14 +97,19 @@ async def OrganizationsCreate_async( "organization_slug": organization_slug, "organization_logo_url": organization_logo_url, "email_allowed_domains": email_allowed_domains, + "allowed_auth_methods": allowed_auth_methods, } if trusted_metadata is not None: payload["trusted_metadata"] = trusted_metadata + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning if email_jit_provisioning is not None: payload["email_jit_provisioning"] = email_jit_provisioning if email_invites is not None: payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations") @@ -134,9 +154,13 @@ def OrganizationsUpdate( organization_logo_url: Optional[str] = None, trusted_metadata: Optional[Dict[str, str]] = None, sso_default_connection_id: Optional[str] = None, + sso_jit_provisioning: Optional[str] = None, + sso_jit_provisioning_allowed_connections: Optional[List[str]] = None, email_allowed_domains: Optional[List[str]] = None, email_jit_provisioning: Optional[str] = None, email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: Optional[List[str]] = None, ) -> OrganizationsupdateResponse: payload: Dict[str, Any] = { @@ -153,12 +177,20 @@ def OrganizationsUpdate( payload["trusted_metadata"] = trusted_metadata if sso_default_connection_id is not None: payload["sso_default_connection_id"] = sso_default_connection_id + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning + if sso_jit_provisioning_allowed_connections is not None: + payload["sso_jit_provisioning_allowed_connections"] = sso_jit_provisioning_allowed_connections if email_allowed_domains is not None: payload["email_allowed_domains"] = email_allowed_domains if email_jit_provisioning is not None: payload["email_jit_provisioning"] = email_jit_provisioning if email_invites is not None: payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods + if allowed_auth_methods is not None: + payload["allowed_auth_methods"] = allowed_auth_methods url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") @@ -173,9 +205,13 @@ async def OrganizationsUpdate_async( organization_logo_url: Optional[str] = None, trusted_metadata: Optional[Dict[str, str]] = None, sso_default_connection_id: Optional[str] = None, + sso_jit_provisioning: Optional[str] = None, + sso_jit_provisioning_allowed_connections: Optional[List[str]] = None, email_allowed_domains: Optional[List[str]] = None, email_jit_provisioning: Optional[str] = None, email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: Optional[List[str]] = None, ) -> OrganizationsupdateResponse: payload: Dict[str, Any] = { @@ -192,12 +228,20 @@ async def OrganizationsUpdate_async( payload["trusted_metadata"] = trusted_metadata if sso_default_connection_id is not None: payload["sso_default_connection_id"] = sso_default_connection_id + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning + if sso_jit_provisioning_allowed_connections is not None: + payload["sso_jit_provisioning_allowed_connections"] = sso_jit_provisioning_allowed_connections if email_allowed_domains is not None: payload["email_allowed_domains"] = email_allowed_domains if email_jit_provisioning is not None: payload["email_jit_provisioning"] = email_jit_provisioning if email_invites is not None: payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods + if allowed_auth_methods is not None: + payload["allowed_auth_methods"] = allowed_auth_methods url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") @@ -226,6 +270,124 @@ async def OrganizationsDelete_async( res = await self.async_client.delete(url) return OrganizationsdeleteResponse.from_json(res.response.status, res.json) + def OrganizationsMemberCreate( + self, + organization_id: str, + email_address: str, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + create_member_as_pending: bool, + is_breakglass: bool, + ) -> OrganizationsmembercreateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "create_member_as_pending": create_member_as_pending, + "is_breakglass": is_breakglass, + } + + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members") + + res = self.sync_client.post(url, json=payload) + return OrganizationsmembercreateResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberCreate_async( + self, + organization_id: str, + email_address: str, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + create_member_as_pending: bool, + is_breakglass: bool, + ) -> OrganizationsmembercreateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "create_member_as_pending": create_member_as_pending, + "is_breakglass": is_breakglass, + } + + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members") + + res = await self.async_client.post(url, json=payload) + return OrganizationsmembercreateResponse.from_json(res.response.status, res.json) + + def OrganizationsMemberUpdate( + self, + organization_id: str, + member_id: str, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + is_breakglass: Optional[bool] = None, + ) -> OrganizationsmemberupdateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "member_id": member_id, + } + + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + if is_breakglass is not None: + payload["is_breakglass"] = is_breakglass + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") + + res = self.sync_client.put(url, json=payload) + return OrganizationsmemberupdateResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberUpdate_async( + self, + organization_id: str, + member_id: str, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + is_breakglass: Optional[bool] = None, + ) -> OrganizationsmemberupdateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "member_id": member_id, + } + + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + if is_breakglass is not None: + payload["is_breakglass"] = is_breakglass + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") + + res = await self.async_client.put(url, json=payload) + return OrganizationsmemberupdateResponse.from_json(res.response.status, res.json) + def OrganizationsMemberDelete( self, organization_id: str, @@ -233,7 +395,7 @@ def OrganizationsMemberDelete( ) -> OrganizationsmemberdeleteResponse: - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/member/{member_id}") + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") res = self.sync_client.delete(url) return OrganizationsmemberdeleteResponse.from_json(res.response.status_code, res.json) @@ -245,7 +407,7 @@ async def OrganizationsMemberDelete_async( ) -> OrganizationsmemberdeleteResponse: - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/member/{member_id}") + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") res = await self.async_client.delete(url) return OrganizationsmemberdeleteResponse.from_json(res.response.status, res.json) @@ -295,13 +457,13 @@ def OrganizationsMemberSearchExternal( cursor: str, limit: Optional[int] = None, query: ExternalSearchQuery, - organization_id: str, + organization_ids: List[str], ) -> OrganizationsmembersearchexternalResponse: payload: Dict[str, Any] = { "cursor": cursor, "query": query, - "organization_id": organization_id, + "organization_ids": organization_ids, } if limit is not None: @@ -317,13 +479,13 @@ async def OrganizationsMemberSearchExternal_async( cursor: str, limit: Optional[int] = None, query: ExternalSearchQuery, - organization_id: str, + organization_ids: List[str], ) -> OrganizationsmembersearchexternalResponse: payload: Dict[str, Any] = { "cursor": cursor, "query": query, - "organization_id": organization_id, + "organization_ids": organization_ids, } if limit is not None: @@ -334,3 +496,69 @@ async def OrganizationsMemberSearchExternal_async( res = await self.async_client.post(url, json=payload) return OrganizationsmembersearchexternalResponse.from_json(res.response.status, res.json) + def OrganizationsMemberDeletePassword( + self, + organization_id: str, + member_password_id: str, + ) -> OrganizationsmemberdeletepasswordResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/passwords/{member_password_id}") + + res = self.sync_client.delete(url) + return OrganizationsmemberdeletepasswordResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberDeletePassword_async( + self, + organization_id: str, + member_password_id: str, + ) -> OrganizationsmemberdeletepasswordResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/passwords/{member_password_id}") + + res = await self.async_client.delete(url) + return OrganizationsmemberdeletepasswordResponse.from_json(res.response.status, res.json) + + def OrganizationsMemberGet( + self, + organization_id: str, + member_id: Optional[str] = None, + email_address: Optional[str] = None, + ) -> OrganizationsmembergetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if member_id is not None: + payload["member_id"] = member_id + if email_address is not None: + payload["email_address"] = email_address + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/member") + + res = self.sync_client.get(url, params=payload) + return OrganizationsmembergetResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberGet_async( + self, + organization_id: str, + member_id: Optional[str] = None, + email_address: Optional[str] = None, + ) -> OrganizationsmembergetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if member_id is not None: + payload["member_id"] = member_id + if email_address is not None: + payload["email_address"] = email_address + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/member") + + res = await self.async_client.get(url, params=payload) + return OrganizationsmembergetResponse.from_json(res.response.status, res.json) + diff --git a/stytch/api/otp_service.py b/stytch/api/otp_service.py index e404b4a6..04fc30b9 100644 --- a/stytch/api/otp_service.py +++ b/stytch/api/otp_service.py @@ -11,13 +11,13 @@ from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.otp_service import ( - OtpssmssendResponse, - OtpssmsloginorcreateResponse, - OtpswhatsappsendResponse, - OtpswhatsapploginorcreateResponse, - OtpsemailsendResponse, - OtpsemailloginorcreateResponse, - OtpsauthenticateResponse, + OtpsauthenticateResponse, + OtpsemailloginorcreateResponse, + OtpsemailsendResponse, + OtpssmsloginorcreateResponse, + OtpssmssendResponse, + OtpswhatsapploginorcreateResponse, + OtpswhatsappsendResponse, ) diff --git a/stytch/api/password_service.py b/stytch/api/password_service.py index 33019d56..8005574b 100644 --- a/stytch/api/password_service.py +++ b/stytch/api/password_service.py @@ -11,14 +11,14 @@ from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.password_service import ( - PasswordscreateResponse, - PasswordsauthenticateResponse, - PasswordsstrengthcheckResponse, - PasswordsemailresetstartResponse, - PasswordsemailresetResponse, - PasswordsexistingpasswordresetResponse, - PasswordssessionresetResponse, - PasswordsmigrateResponse, + PasswordsauthenticateResponse, + PasswordscreateResponse, + PasswordsemailresetResponse, + PasswordsemailresetstartResponse, + PasswordsexistingpasswordresetResponse, + PasswordsmigrateResponse, + PasswordssessionresetResponse, + PasswordsstrengthcheckResponse, ) @@ -43,6 +43,9 @@ def PasswordsCreate( password: str, session_duration_minutes: Optional[int] = None, session_custom_claims: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + name: None, ) -> PasswordscreateResponse: payload: Dict[str, Any] = { @@ -54,6 +57,12 @@ def PasswordsCreate( payload["session_duration_minutes"] = session_duration_minutes if session_custom_claims is not None: payload["session_custom_claims"] = session_custom_claims + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + if name is not None: + payload["name"] = name url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords") @@ -66,6 +75,9 @@ async def PasswordsCreate_async( password: str, session_duration_minutes: Optional[int] = None, session_custom_claims: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + name: None, ) -> PasswordscreateResponse: payload: Dict[str, Any] = { @@ -77,6 +89,12 @@ async def PasswordsCreate_async( payload["session_duration_minutes"] = session_duration_minutes if session_custom_claims is not None: payload["session_custom_claims"] = session_custom_claims + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + if name is not None: + payload["name"] = name url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords") @@ -434,12 +452,20 @@ def PasswordsMigrate( argon_2_config: None, sha_1_config: None, scrypt_config: None, + first_name: str, + last_name: str, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + set_email_verified: bool, ) -> PasswordsmigrateResponse: payload: Dict[str, Any] = { "email": email, "hash": hash, "hash_type": hash_type, + "first_name": first_name, + "last_name": last_name, + "set_email_verified": set_email_verified, } if md_5_config is not None: @@ -450,6 +476,10 @@ def PasswordsMigrate( payload["sha_1_config"] = sha_1_config if scrypt_config is not None: payload["scrypt_config"] = scrypt_config + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/migrate") @@ -465,12 +495,20 @@ async def PasswordsMigrate_async( argon_2_config: None, sha_1_config: None, scrypt_config: None, + first_name: str, + last_name: str, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + set_email_verified: bool, ) -> PasswordsmigrateResponse: payload: Dict[str, Any] = { "email": email, "hash": hash, "hash_type": hash_type, + "first_name": first_name, + "last_name": last_name, + "set_email_verified": set_email_verified, } if md_5_config is not None: @@ -481,6 +519,10 @@ async def PasswordsMigrate_async( payload["sha_1_config"] = sha_1_config if scrypt_config is not None: payload["scrypt_config"] = scrypt_config + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/migrate") diff --git a/stytch/api/project_service.py b/stytch/api/project_service.py index 1a6247aa..2a839741 100644 --- a/stytch/api/project_service.py +++ b/stytch/api/project_service.py @@ -4,22 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.project_service import ( -) class ProjectService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -28,4 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "project_service" - diff --git a/stytch/api/public_token_service.py b/stytch/api/public_token_service.py index ac3138f0..6b04e2ac 100644 --- a/stytch/api/public_token_service.py +++ b/stytch/api/public_token_service.py @@ -4,22 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.public_token_service import ( -) class PublicTokenService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -28,4 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "public_token_service" - diff --git a/stytch/api/script_service.py b/stytch/api/script_service.py index 70b56570..1367d3b1 100644 --- a/stytch/api/script_service.py +++ b/stytch/api/script_service.py @@ -4,22 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.script_service import ( -) class ScriptService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -28,4 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "script_service" - diff --git a/stytch/api/sdk_service.py b/stytch/api/sdk_service.py index fae92c11..7c21b42b 100644 --- a/stytch/api/sdk_service.py +++ b/stytch/api/sdk_service.py @@ -4,22 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.sdk_service import ( -) class SDKService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -28,4 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "sdk_service" - diff --git a/stytch/api/secret_service.py b/stytch/api/secret_service.py index eee8ee48..a3b32630 100644 --- a/stytch/api/secret_service.py +++ b/stytch/api/secret_service.py @@ -4,22 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.secret_service import ( -) class SecretService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -28,4 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "secret_service" - diff --git a/stytch/api/session_service.py b/stytch/api/session_service.py index fdc511d2..80da8358 100644 --- a/stytch/api/session_service.py +++ b/stytch/api/session_service.py @@ -6,15 +6,14 @@ from typing import Any, Dict, Optional - from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.session_service import ( - SessionsgetResponse, + MultitenantsessionsjwksResponse, SessionsauthenticateResponse, - SessionsrevokeResponse, + SessionsgetResponse, SessionsjwksResponse, - MultitenantsessionsjwksResponse, + SessionsrevokeResponse, ) diff --git a/stytch/api/sso_service.py b/stytch/api/sso_service.py index 464e1667..2e03f4fb 100644 --- a/stytch/api/sso_service.py +++ b/stytch/api/sso_service.py @@ -11,14 +11,16 @@ from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.sso_service import ( - CreatesamlconnectionResponse, - UpdatesamlconnectionResponse, - UpdatesamlconnectionbyurlResponse, - UpdatesamlconnectionbydocResponse, - GetssoconnectionsResponse, - DeletessoconnectionResponse, - SsoauthenticateResponse, - DeletesamlverificationcertificateResponse, + CreateoidcconnectionResponse, + CreatesamlconnectionResponse, + DeletesamlverificationcertificateResponse, + DeletessoconnectionResponse, + GetssoconnectionsResponse, + SsoauthenticateResponse, + UpdateoidcconnectionResponse, + UpdatesamlconnectionbydocResponse, + UpdatesamlconnectionbyurlResponse, + UpdatesamlconnectionResponse, ) @@ -37,15 +39,49 @@ def __init__( def sub_url(self) -> str: return "sso_service" + def CreateOIDCConnection( + self, + organization_id: str, + display_name: str, + ) -> CreateoidcconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "display_name": display_name, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}") + + res = self.sync_client.post(url, json=payload) + return CreateoidcconnectionResponse.from_json(res.response.status_code, res.json) + + async def CreateOIDCConnection_async( + self, + organization_id: str, + display_name: str, + ) -> CreateoidcconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "display_name": display_name, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}") + + res = await self.async_client.post(url, json=payload) + return CreateoidcconnectionResponse.from_json(res.response.status, res.json) + def CreateSAMLConnection( self, organization_id: str, - identity_provider: str, + display_name: str, ) -> CreatesamlconnectionResponse: payload: Dict[str, Any] = { "organization_id": organization_id, - "identity_provider": identity_provider, + "display_name": display_name, } @@ -57,12 +93,12 @@ def CreateSAMLConnection( async def CreateSAMLConnection_async( self, organization_id: str, - identity_provider: str, + display_name: str, ) -> CreatesamlconnectionResponse: payload: Dict[str, Any] = { "organization_id": organization_id, - "identity_provider": identity_provider, + "display_name": display_name, } @@ -71,26 +107,97 @@ async def CreateSAMLConnection_async( res = await self.async_client.post(url, json=payload) return CreatesamlconnectionResponse.from_json(res.response.status, res.json) + def UpdateOIDCConnection( + self, + organization_id: str, + connection_id: str, + display_name: str, + client_id: str, + client_secret: str, + issuer: str, + authorization_url: str, + token_url: str, + userinfo_url: str, + jwks_url: str, + ) -> UpdateoidcconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "connection_id": connection_id, + "display_name": display_name, + "client_id": client_id, + "client_secret": client_secret, + "issuer": issuer, + "authorization_url": authorization_url, + "token_url": token_url, + "userinfo_url": userinfo_url, + "jwks_url": jwks_url, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}/connections/{connection_id}") + + res = self.sync_client.put(url, json=payload) + return UpdateoidcconnectionResponse.from_json(res.response.status_code, res.json) + + async def UpdateOIDCConnection_async( + self, + organization_id: str, + connection_id: str, + display_name: str, + client_id: str, + client_secret: str, + issuer: str, + authorization_url: str, + token_url: str, + userinfo_url: str, + jwks_url: str, + ) -> UpdateoidcconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "connection_id": connection_id, + "display_name": display_name, + "client_id": client_id, + "client_secret": client_secret, + "issuer": issuer, + "authorization_url": authorization_url, + "token_url": token_url, + "userinfo_url": userinfo_url, + "jwks_url": jwks_url, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}/connections/{connection_id}") + + res = await self.async_client.put(url, json=payload) + return UpdateoidcconnectionResponse.from_json(res.response.status, res.json) + def UpdateSAMLConnection( self, organization_id: str, connection_id: str, - entity_id: str, + idp_entity_id: str, display_name: str, attribute_mapping: Optional[Dict[str, str]] = None, x509_certificate: str, + idp_sso_url: str, + None: None, ) -> UpdatesamlconnectionResponse: payload: Dict[str, Any] = { "organization_id": organization_id, "connection_id": connection_id, - "entity_id": entity_id, + "idp_entity_id": idp_entity_id, "display_name": display_name, "x509_certificate": x509_certificate, + "idp_sso_url": idp_sso_url, } if attribute_mapping is not None: payload["attribute_mapping"] = attribute_mapping + if None is not None: + payload["None"] = None url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}") @@ -101,22 +208,27 @@ async def UpdateSAMLConnection_async( self, organization_id: str, connection_id: str, - entity_id: str, + idp_entity_id: str, display_name: str, attribute_mapping: Optional[Dict[str, str]] = None, x509_certificate: str, + idp_sso_url: str, + None: None, ) -> UpdatesamlconnectionResponse: payload: Dict[str, Any] = { "organization_id": organization_id, "connection_id": connection_id, - "entity_id": entity_id, + "idp_entity_id": idp_entity_id, "display_name": display_name, "x509_certificate": x509_certificate, + "idp_sso_url": idp_sso_url, } if attribute_mapping is not None: payload["attribute_mapping"] = attribute_mapping + if None is not None: + payload["None"] = None url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}") @@ -249,8 +361,8 @@ async def DeleteSSOConnection_async( def SSOAuthenticate( self, - token: str, - code_verifier: Optional[str] = None, + sso_token: str, + pkce_code_verifier: Optional[str] = None, session_token: Optional[str] = None, session_jwt: Optional[str] = None, session_duration_minutes: Optional[int] = None, @@ -258,11 +370,11 @@ def SSOAuthenticate( ) -> SsoauthenticateResponse: payload: Dict[str, Any] = { - "token": token, + "sso_token": sso_token, } - if code_verifier is not None: - payload["code_verifier"] = code_verifier + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier if session_token is not None: payload["session_token"] = session_token if session_jwt is not None: @@ -279,8 +391,8 @@ def SSOAuthenticate( async def SSOAuthenticate_async( self, - token: str, - code_verifier: Optional[str] = None, + sso_token: str, + pkce_code_verifier: Optional[str] = None, session_token: Optional[str] = None, session_jwt: Optional[str] = None, session_duration_minutes: Optional[int] = None, @@ -288,11 +400,11 @@ async def SSOAuthenticate_async( ) -> SsoauthenticateResponse: payload: Dict[str, Any] = { - "token": token, + "sso_token": sso_token, } - if code_verifier is not None: - payload["code_verifier"] = code_verifier + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier if session_token is not None: payload["session_token"] = session_token if session_jwt is not None: @@ -315,7 +427,7 @@ def DeleteSAMLVerificationCertificate( ) -> DeletesamlverificationcertificateResponse: - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}/connections/{connection_id}/verification_certificate/{certificate_id}") + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}/verification_certificates/{certificate_id}") res = self.sync_client.delete(url) return DeletesamlverificationcertificateResponse.from_json(res.response.status_code, res.json) @@ -328,7 +440,7 @@ async def DeleteSAMLVerificationCertificate_async( ) -> DeletesamlverificationcertificateResponse: - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}/connections/{connection_id}/verification_certificate/{certificate_id}") + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}/verification_certificates/{certificate_id}") res = await self.async_client.delete(url) return DeletesamlverificationcertificateResponse.from_json(res.response.status, res.json) diff --git a/stytch/api/totp_service.py b/stytch/api/totp_service.py index d492b127..a4e863ed 100644 --- a/stytch/api/totp_service.py +++ b/stytch/api/totp_service.py @@ -6,12 +6,11 @@ from typing import Any, Dict, Optional - from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.totp_service import ( - TotpscreateResponse, TotpsauthenticateResponse, + TotpscreateResponse, TotpsgetrecoverycodesResponse, TotpsrecoverResponse, ) diff --git a/stytch/api/user_service.py b/stytch/api/user_service.py index e39839fb..e39c61dd 100644 --- a/stytch/api/user_service.py +++ b/stytch/api/user_service.py @@ -11,21 +11,21 @@ from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.user_service import ( - CreateuserResponse, - GetpendingusersResponse, - GetuserResponse, - SearchusersexternalResponse, - UpdateuserResponse, - DeleteuserResponse, - GetuserbyemailandprojectidResponse, - DeleteuseremailResponse, - DeleteuserphonenumberResponse, - DeleteuserwebauthnregistrationResponse, - DeleteuserbiometricregistrationResponse, - DeleteusertotpResponse, - DeleteusercryptowalletResponse, - DeleteuserpasswordResponse, - DeleteuseroauthuserregistrationResponse, + CreateuserResponse, + DeleteuserbiometricregistrationResponse, + DeleteusercryptowalletResponse, + DeleteuseremailResponse, + DeleteuseroauthuserregistrationResponse, + DeleteuserpasswordResponse, + DeleteuserphonenumberResponse, + DeleteuserResponse, + DeleteusertotpResponse, + DeleteuserwebauthnregistrationResponse, + GetpendingusersResponse, + GetuserbyemailandprojectidResponse, + GetuserResponse, + SearchusersexternalResponse, + UpdateuserResponse, ) diff --git a/stytch/api/web_authn_service.py b/stytch/api/web_authn_service.py index ad68539f..8ca0ea9a 100644 --- a/stytch/api/web_authn_service.py +++ b/stytch/api/web_authn_service.py @@ -6,14 +6,13 @@ from typing import Any, Dict, Optional - from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.web_authn_service import ( - WebauthnregisterstartResponse, - WebauthnregisterResponse, - WebauthnauthenticatestartResponse, WebauthnauthenticateResponse, + WebauthnauthenticatestartResponse, + WebauthnregisterResponse, + WebauthnregisterstartResponse, ) diff --git a/stytch/models/billing_service.py b/stytch/models/billing_service.py new file mode 100644 index 00000000..e5a0d9b4 --- /dev/null +++ b/stytch/models/billing_service.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/stytch/models/discovery_service.py b/stytch/models/discovery_service.py new file mode 100644 index 00000000..dcfd20d5 --- /dev/null +++ b/stytch/models/discovery_service.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class DiscoveryorganizationsResponse(ResponseBase): + request_id: str + email_address: str + discovered_organizations: None + + +class DiscoveryintermediatesessionexchangeResponse(ResponseBase): + request_id: str + member_id: str + member_session: None + session_token: str + session_jwt: str + member: None + organization: None + + +class DiscoveryorganizationcreateResponse(ResponseBase): + request_id: str + member_id: str + member_session: None + session_token: str + session_jwt: str + member: None + organization: None diff --git a/stytch/models/multi_tenant_magic_service.py b/stytch/models/multi_tenant_magic_service.py index 38fceb71..e899fad4 100644 --- a/stytch/models/multi_tenant_magic_service.py +++ b/stytch/models/multi_tenant_magic_service.py @@ -9,12 +9,14 @@ class MultitenantmagiclinksemailloginorsignupResponse(ResponseBase): member_id: str member_created: bool member: None + organization: None class MultitenantmagiclinksemailinviteResponse(ResponseBase): request_id: str member_id: str member: None + organization: None class MultitenantmagiclinksauthenticateResponse(ResponseBase): @@ -26,4 +28,16 @@ class MultitenantmagiclinksauthenticateResponse(ResponseBase): member: None session_token: str session_jwt: str - session: None + member_session: None + organization: None + + +class B2BmagiclinksemaildiscoverysendResponse(ResponseBase): + request_id: str + + +class B2BmagiclinksdiscoveryauthenticateResponse(ResponseBase): + request_id: str + intermediate_session_token: str + email_address: str + discovered_organizations: None diff --git a/stytch/models/multi_tenant_password_service.py b/stytch/models/multi_tenant_password_service.py new file mode 100644 index 00000000..0384a13a --- /dev/null +++ b/stytch/models/multi_tenant_password_service.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class MultitenantpasswordstrengthcheckResponse(ResponseBase): + request_id: str + valid_password: bool + score: None + breached_password: bool + luds_feedback: None + strength_policy: str + breach_detection_on_create: bool + zxcvbn_feedback: None + + +class MultitenantpasswordmigrateResponse(ResponseBase): + request_id: str + member_id: str + member_created: bool + member: None + organization: None + + +class MultitenantpasswordauthenticateResponse(ResponseBase): + request_id: str + member_id: str + organization_id: str + member: None + session_token: str + session_jwt: str + member_session: None + organization: None + + +class MultitenantpasswordemailresetstartResponse(ResponseBase): + request_id: str + member_id: str + member_email_id: str + + +class MultitenantpasswordemailresetResponse(ResponseBase): + request_id: str + member_id: str + member_email_id: str + organization_id: str + member: None + session_token: str + session_jwt: str + member_session: None + organization: None + + +class MultitenantpasswordsessionresetResponse(ResponseBase): + request_id: str + member_id: str + member_session: None + member: None + organization: None + + +class MultitenantpasswordexistingpasswordresetResponse(ResponseBase): + request_id: str + member_id: str + member_session: None + member: None + session_token: str + session_jwt: str + organization: None diff --git a/stytch/models/multi_tenant_session_service.py b/stytch/models/multi_tenant_session_service.py index fd9b9c9e..f68b421d 100644 --- a/stytch/models/multi_tenant_session_service.py +++ b/stytch/models/multi_tenant_session_service.py @@ -6,7 +6,7 @@ class MultitenantsessionsgetResponse(ResponseBase): request_id: str - sessions: None + member_sessions: None class MultitenantsessionsauthenticateResponse(ResponseBase): @@ -15,7 +15,18 @@ class MultitenantsessionsauthenticateResponse(ResponseBase): session_token: str session_jwt: str member: None + organization: None class MultitenantsessionsrevokeResponse(ResponseBase): request_id: str + + +class MultitenantsessionsexchangeResponse(ResponseBase): + request_id: str + member_id: str + member_session: None + session_token: str + session_jwt: str + member: None + organization: None diff --git a/stytch/models/o_auth_service.py b/stytch/models/o_auth_service.py index 2abc004e..5b7831c5 100644 --- a/stytch/models/o_auth_service.py +++ b/stytch/models/o_auth_service.py @@ -33,6 +33,7 @@ class OauthgoogleidtokenauthenticateResponse(ResponseBase): session_jwt: str user: User reset_sessions: bool + user_created: bool class OauthmicrosoftstartResponse(ResponseBase): @@ -58,6 +59,7 @@ class OauthappleidtokenauthenticateResponse(ResponseBase): session_jwt: str user: User reset_sessions: bool + user_created: bool class OauthgithubstartResponse(ResponseBase): diff --git a/stytch/models/organization_service.py b/stytch/models/organization_service.py index 33023ccb..5baa949e 100644 --- a/stytch/models/organization_service.py +++ b/stytch/models/organization_service.py @@ -2,6 +2,7 @@ from typing import List +from stytch.b2b.core.models import Member, Organization from stytch.core.models import ResponseBase @@ -25,6 +26,20 @@ class OrganizationsdeleteResponse(ResponseBase): organization_id: str +class OrganizationsmembercreateResponse(ResponseBase): + request_id: str + member_id: str + member: None + organization: Organization + + +class OrganizationsmemberupdateResponse(ResponseBase): + request_id: str + member_id: str + member: None + organization: Organization + + class OrganizationsmemberdeleteResponse(ResponseBase): request_id: str member_id: str @@ -40,3 +55,17 @@ class OrganizationsmembersearchexternalResponse(ResponseBase): request_id: str members: List[Member] results_metadata: ResultsMetadata + + +class OrganizationsmemberdeletepasswordResponse(ResponseBase): + request_id: str + member_id: str + member: None + organization: None + + +class OrganizationsmembergetResponse(ResponseBase): + request_id: str + member_id: str + member: None + organization: None diff --git a/stytch/models/password_service.py b/stytch/models/password_service.py index 7910a2e2..8329ba21 100644 --- a/stytch/models/password_service.py +++ b/stytch/models/password_service.py @@ -30,6 +30,8 @@ class PasswordsstrengthcheckResponse(ResponseBase): score: None breached_password: bool feedback: None + strength_policy: str + breach_detection_on_create: bool class PasswordsemailresetstartResponse(ResponseBase): diff --git a/stytch/models/sso_service.py b/stytch/models/sso_service.py index 4b93777d..9516b33f 100644 --- a/stytch/models/sso_service.py +++ b/stytch/models/sso_service.py @@ -1,14 +1,26 @@ #!/usr/bin/env python3 +from typing import Optional from stytch.core.models import ResponseBase +class CreateoidcconnectionResponse(ResponseBase): + request_id: str + connection: None + + class CreatesamlconnectionResponse(ResponseBase): request_id: str connection: None +class UpdateoidcconnectionResponse(ResponseBase): + request_id: str + connection: None + warning: Optional[str] = None + + class UpdatesamlconnectionResponse(ResponseBase): request_id: str connection: None @@ -27,6 +39,7 @@ class UpdatesamlconnectionbydocResponse(ResponseBase): class GetssoconnectionsResponse(ResponseBase): request_id: str saml_connections: None + oidc_connections: None class DeletessoconnectionResponse(ResponseBase): @@ -41,8 +54,9 @@ class SsoauthenticateResponse(ResponseBase): member: None session_token: str session_jwt: str - session: None + member_session: None reset_session: bool + organization: None class DeletesamlverificationcertificateResponse(ResponseBase): From f1f0374aeb065478ce9788cdfd509c26101711c3 Mon Sep 17 00:00:00 2001 From: Joshua Hight Date: Tue, 18 Apr 2023 13:05:53 -0700 Subject: [PATCH 4/7] make awesomeness vertical aware --- awesomeness.sh | 32 +- codegen/specs/stytch/billing.yml | 2 - codegen/specs/stytch/cname_records.yml | 2 - codegen/specs/stytch/email_template.yml | 2 - codegen/specs/stytch/magic_link_url.yml | 2 - codegen/specs/stytch/project.yml | 2 - codegen/specs/stytch/public_token.yml | 2 - codegen/specs/stytch/script.yml | 2 - codegen/specs/stytch/sdk.yml | 2 - codegen/specs/stytch/secret.yml | 2 - codegen/specs/stytch_b2b/debug.yml | 10 + .../{stytch => stytch_b2b}/discovery.yml | 0 codegen/specs/stytch_b2b/magic_links.yml | 82 --- .../multitenant_magic.yml | 0 .../multitenant_password.yml | 0 .../multitenant_session.yml | 0 .../{stytch => stytch_b2b}/organization.yml | 0 codegen/specs/stytch_b2b/organizations.yml | 193 ------ codegen/specs/stytch_b2b/passwords.yml | 178 ------ codegen/specs/stytch_b2b/sessions.yml | 43 -- codegen/specs/{stytch => stytch_b2b}/sso.yml | 0 stytch/b2b/api/debug_service.py | 47 ++ stytch/b2b/api/discovery_service.py | 216 +++++++ stytch/b2b/api/multi_tenant_magic_service.py | 359 +++++++++++ .../b2b/api/multi_tenant_password_service.py | 460 ++++++++++++++ .../b2b/api/multi_tenant_session_service.py | 228 +++++++ stytch/b2b/api/organization_service.py | 564 ++++++++++++++++++ stytch/b2b/api/sso_service.py | 447 ++++++++++++++ stytch/b2b/models/debug_service.py | 10 + stytch/b2b/models/discovery_service.py | 30 + .../b2b/models/multi_tenant_magic_service.py | 43 ++ .../models/multi_tenant_password_service.py | 70 +++ .../models/multi_tenant_session_service.py | 32 + stytch/b2b/models/organization_service.py | 71 +++ stytch/b2b/models/sso_service.py | 64 ++ 35 files changed, 2682 insertions(+), 515 deletions(-) delete mode 100644 codegen/specs/stytch/billing.yml delete mode 100644 codegen/specs/stytch/cname_records.yml delete mode 100644 codegen/specs/stytch/email_template.yml delete mode 100644 codegen/specs/stytch/magic_link_url.yml delete mode 100644 codegen/specs/stytch/project.yml delete mode 100644 codegen/specs/stytch/public_token.yml delete mode 100644 codegen/specs/stytch/script.yml delete mode 100644 codegen/specs/stytch/sdk.yml delete mode 100644 codegen/specs/stytch/secret.yml create mode 100644 codegen/specs/stytch_b2b/debug.yml rename codegen/specs/{stytch => stytch_b2b}/discovery.yml (100%) delete mode 100644 codegen/specs/stytch_b2b/magic_links.yml rename codegen/specs/{stytch => stytch_b2b}/multitenant_magic.yml (100%) rename codegen/specs/{stytch => stytch_b2b}/multitenant_password.yml (100%) rename codegen/specs/{stytch => stytch_b2b}/multitenant_session.yml (100%) rename codegen/specs/{stytch => stytch_b2b}/organization.yml (100%) delete mode 100644 codegen/specs/stytch_b2b/organizations.yml delete mode 100644 codegen/specs/stytch_b2b/passwords.yml delete mode 100644 codegen/specs/stytch_b2b/sessions.yml rename codegen/specs/{stytch => stytch_b2b}/sso.yml (100%) create mode 100644 stytch/b2b/api/debug_service.py create mode 100644 stytch/b2b/api/discovery_service.py create mode 100644 stytch/b2b/api/multi_tenant_magic_service.py create mode 100644 stytch/b2b/api/multi_tenant_password_service.py create mode 100644 stytch/b2b/api/multi_tenant_session_service.py create mode 100644 stytch/b2b/api/organization_service.py create mode 100644 stytch/b2b/api/sso_service.py create mode 100644 stytch/b2b/models/debug_service.py create mode 100644 stytch/b2b/models/discovery_service.py create mode 100644 stytch/b2b/models/multi_tenant_magic_service.py create mode 100644 stytch/b2b/models/multi_tenant_password_service.py create mode 100644 stytch/b2b/models/multi_tenant_session_service.py create mode 100644 stytch/b2b/models/organization_service.py create mode 100644 stytch/b2b/models/sso_service.py diff --git a/awesomeness.sh b/awesomeness.sh index 1d1b995c..93d48b6c 100755 --- a/awesomeness.sh +++ b/awesomeness.sh @@ -2,9 +2,39 @@ # This feels like sliding down a warm fudge mountain; I dearly hope the github action # we write if this works can maintain this simplicity find codegen/specs/stytch -name "*.yml" -delete +find codegen/specs/stytch_b2b -name "*.yml" -delete find ../protobuf/api -name "*.yml.python" | while read line do - cp $line `echo $line | sed 's|.*/\([^.]*\).yml.python$|codegen/specs/stytch/\1.yml|'` + vertical=`tail -n 1 $line` + + echo "vertical for $line is $vertical" + + # once we have the vertical we go ahead and remove it from the file so it won't + # break anything + cat $line | awk 'BEGIN {buffer=""} // {if (buffer != "") {print buffer}; buffer=$0}' > ${line}.tmp + rm $line + mv ${line}.tmp $line + + consumerFile=`echo $line | sed 's|.*/\([^.]*\).yml.python$|codegen/specs/stytch/\1.yml|'` + b2bFile=`echo $line | sed 's|.*/\([^.]*\).yml.python$|codegen/specs/stytch_b2b/\1.yml|'` + + # I know the single `=` is scary, but I promise it's not an assignment in bash + # and is in fact what we want to do here. What we want is to copy consumer files + # into the regular dir, copy the b2b files into the b2b dir, and "ALL" vertical + # files into both + if [[ "$vertical" = "CONSUMER" ]] + then + echo "hit consumer branch, copying $line to $consumerFile" + cp $line $consumerFile + elif [[ "$vertical" = "B2B" ]] + then + echo "hit b2b branch, copying $line to $b2bFile" + cp $line $b2bFile + else + echo "hit all branch, copying $line to $b2bFile and $consumerFile" + cp $line $consumerFile + cp $line $b2bFile + fi done diff --git a/codegen/specs/stytch/billing.yml b/codegen/specs/stytch/billing.yml deleted file mode 100644 index 9598c137..00000000 --- a/codegen/specs/stytch/billing.yml +++ /dev/null @@ -1,2 +0,0 @@ -classname: BillingService -methods: [] diff --git a/codegen/specs/stytch/cname_records.yml b/codegen/specs/stytch/cname_records.yml deleted file mode 100644 index bffdf9b3..00000000 --- a/codegen/specs/stytch/cname_records.yml +++ /dev/null @@ -1,2 +0,0 @@ -classname: CNAMERecordService -methods: [] diff --git a/codegen/specs/stytch/email_template.yml b/codegen/specs/stytch/email_template.yml deleted file mode 100644 index 7a97ffb7..00000000 --- a/codegen/specs/stytch/email_template.yml +++ /dev/null @@ -1,2 +0,0 @@ -classname: EmailTemplateService -methods: [] diff --git a/codegen/specs/stytch/magic_link_url.yml b/codegen/specs/stytch/magic_link_url.yml deleted file mode 100644 index a8d31d23..00000000 --- a/codegen/specs/stytch/magic_link_url.yml +++ /dev/null @@ -1,2 +0,0 @@ -classname: MagicLinkURLService -methods: [] diff --git a/codegen/specs/stytch/project.yml b/codegen/specs/stytch/project.yml deleted file mode 100644 index bbe0d2d1..00000000 --- a/codegen/specs/stytch/project.yml +++ /dev/null @@ -1,2 +0,0 @@ -classname: ProjectService -methods: [] diff --git a/codegen/specs/stytch/public_token.yml b/codegen/specs/stytch/public_token.yml deleted file mode 100644 index bedf0334..00000000 --- a/codegen/specs/stytch/public_token.yml +++ /dev/null @@ -1,2 +0,0 @@ -classname: PublicTokenService -methods: [] diff --git a/codegen/specs/stytch/script.yml b/codegen/specs/stytch/script.yml deleted file mode 100644 index 3be2c6ec..00000000 --- a/codegen/specs/stytch/script.yml +++ /dev/null @@ -1,2 +0,0 @@ -classname: ScriptService -methods: [] diff --git a/codegen/specs/stytch/sdk.yml b/codegen/specs/stytch/sdk.yml deleted file mode 100644 index 036189d9..00000000 --- a/codegen/specs/stytch/sdk.yml +++ /dev/null @@ -1,2 +0,0 @@ -classname: SDKService -methods: [] diff --git a/codegen/specs/stytch/secret.yml b/codegen/specs/stytch/secret.yml deleted file mode 100644 index 2a7ac7b6..00000000 --- a/codegen/specs/stytch/secret.yml +++ /dev/null @@ -1,2 +0,0 @@ -classname: SecretService -methods: [] diff --git a/codegen/specs/stytch_b2b/debug.yml b/codegen/specs/stytch_b2b/debug.yml new file mode 100644 index 00000000..27ca8dc8 --- /dev/null +++ b/codegen/specs/stytch_b2b/debug.yml @@ -0,0 +1,10 @@ +classname: DebugService +methods: + - name: WhoAmI + args: [] + response_type: + request_id: str + project_id: str + name: str + method: get + api_path: /v1/debug/whoami diff --git a/codegen/specs/stytch/discovery.yml b/codegen/specs/stytch_b2b/discovery.yml similarity index 100% rename from codegen/specs/stytch/discovery.yml rename to codegen/specs/stytch_b2b/discovery.yml diff --git a/codegen/specs/stytch_b2b/magic_links.yml b/codegen/specs/stytch_b2b/magic_links.yml deleted file mode 100644 index b74c76b7..00000000 --- a/codegen/specs/stytch_b2b/magic_links.yml +++ /dev/null @@ -1,82 +0,0 @@ -classname: MagicLinks -methods: - - name: authenticate - method: POST - args: - - name: magic_links_token - arg_type: str - - name: pkce_code_verifier - arg_type: Optional[str] = None - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - response_type: - member_id: str - method_id: str - reset_sessions: bool - organization_id: str - member: Member - session_token: str - session_jwt: str - member_session: Optional[B2BStytchSession] -sub_apis: - - classname: Email - additional_imports: - - from stytch.core.b2b.models import B2BStytchSession, Member - sub_url: magic_links/email - filename: magic_links_email - methods: - - name: login_or_signup - method: POST - args: - - name: organization_id - arg_type: str - - name: email_address - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: pkce_code_challenge - arg_type: Optional[str] = None - - name: login_template_id - arg_type: Optional[str] = None - - name: signup_template_id - arg_type: Optional[str] = None - - name: locale - arg_type: Optional[str] = None - response_type: - member_id: str - member_created: bool - member: Member - organization: Organization - - name: invite - method: POST - args: - - name: organization_id - arg_type: str - - name: email_address - arg_type: str - - name: invite_redirect_url - arg_type: Optional[str] = None - - name: invited_by_member_id - arg_type: Optional[str] = None - - name: name - arg_type: Optional[str] = None - - name: trusted_metadata - arg_type: Optional[Dict[str, Any]] = None - - name: untrusted_metadata - arg_type: Optional[Dict[str, Any]] = None - - name: invite_template_id - arg_type: Optional[str] = None - - name: locale - arg_type: Optional[str] = None - response_type: - member_id: str - member: Member - organization: Organization diff --git a/codegen/specs/stytch/multitenant_magic.yml b/codegen/specs/stytch_b2b/multitenant_magic.yml similarity index 100% rename from codegen/specs/stytch/multitenant_magic.yml rename to codegen/specs/stytch_b2b/multitenant_magic.yml diff --git a/codegen/specs/stytch/multitenant_password.yml b/codegen/specs/stytch_b2b/multitenant_password.yml similarity index 100% rename from codegen/specs/stytch/multitenant_password.yml rename to codegen/specs/stytch_b2b/multitenant_password.yml diff --git a/codegen/specs/stytch/multitenant_session.yml b/codegen/specs/stytch_b2b/multitenant_session.yml similarity index 100% rename from codegen/specs/stytch/multitenant_session.yml rename to codegen/specs/stytch_b2b/multitenant_session.yml diff --git a/codegen/specs/stytch/organization.yml b/codegen/specs/stytch_b2b/organization.yml similarity index 100% rename from codegen/specs/stytch/organization.yml rename to codegen/specs/stytch_b2b/organization.yml diff --git a/codegen/specs/stytch_b2b/organizations.yml b/codegen/specs/stytch_b2b/organizations.yml deleted file mode 100644 index cb976806..00000000 --- a/codegen/specs/stytch_b2b/organizations.yml +++ /dev/null @@ -1,193 +0,0 @@ -classname: Organizations -additional_imports: - - from stytch.core.models import SearchQuery, SearchResultsMetadata - - from stytch.core.b2b.models import Member, Organization -methods: - - name: create - use_base_path_as_api_path: True - method: POST - args: - - name: organization_name - arg_type: str - - name: organization_slug - arg_type: str - - name: organization_logo_url - arg_type: Optional[str] = None - - name: trusted_metadata - arg_type: Optional[Dict[str, Any]] = None - - name: email_jit_provisioning - arg_type: Optional[str] = None - - name: email_invites - arg_type: Optional[str] = None - - name: email_allowed_domains - arg_type: Optional[List[str]] = None - - name: sso_jit_provisioning - arg_type: Optional[str] = None - - name: auth_methods - arg_type: Optional[str] = None - - name: allowed_auth_methods - arg_type: Optional[List[str]] = None - response_type: - organization: Organization - - name: get - api_path: organization_id - eval_api_path: true - method: GET - args: - - name: organization_id - arg_type: str - response_type: - organization: Organization - - name: update - method: PUT - api_path: organization_id - eval_api_path: true - args: - - name: organization_id - arg_type: str - - name: organization_name - arg_type: Optional[str] = None - - name: organization_slug - arg_type: Optional[str] = None - - name: organization_logo_url - arg_type: Optional[str] = None - - name: trusted_metadata - arg_type: Optional[Dict[str, Any]] = None - - name: sso_default_connection_id - arg_type: Optional[str] = None - - name: sso_jit_provisioning_allowed_connections - arg_type: Optional[List[str]] = None - - name: sso_jit_provisioning - arg_type: Optional[str] = None - - name: email_allowed_domains - arg_type: Optional[List[str]] = None - - name: email_jit_provisioning - arg_type: Optional[str] = None - - name: email_invites - arg_type: Optional[str] = None - - name: auth_methods - arg_type: Optional[str] = None - - name: allowed_auth_methods - arg_type: Optional[List[str]] = None - response_type: - organization: Organization - - name: delete - method: DELETE - api_path: organization_id - eval_api_path: true - args: - - name: organization_id - arg_type: str - response_type: - organization_id: str - - name: get_member - method: GET - api_path: 'f"{organization_id}/member"' - eval_api_path: true - args: - - name: organization_id - arg_type: str - - name: member_id - arg_type: Optional[str] = None - - name: email_address - arg_type: Optional[str] = None - response_type: - member_id: str - member: Member - organization: Organization - - name: create_member - method: POST - api_path: 'f"{organization_id}/members"' - eval_api_path: true - args: - - name: organization_id - arg_type: str - - name: email_address - arg_type: str - - name: name - arg_type: Optional[str] = None - - name: trusted_metadata - arg_type: Optional[Dict[str, Any]] = None - - name: untrusted_metadata - arg_type: Optional[Dict[str, Any]] = None - - name: create_member_as_pending - arg_type: Optional[bool] = None - - name: is_breakglass - arg_type: Optional[bool] = None - response_type: - member_id: str - member: Member - organization: Organization - - name: update_member - method: PUT - api_path: 'f"{organization_id}/members/{member_id}"' - eval_api_path: true - args: - - name: organization_id - arg_type: str - - name: member_id - arg_type: str - - name: name - arg_type: Optional[str] = None - - name: trusted_metadata - arg_type: Optional[Dict[str, Any]] = None - - name: untrusted_metadata - arg_type: Optional[Dict[str, Any]] = None - - name: is_breakglass - arg_type: Optional[bool] = None - response_type: - member_id: str - member: Member - organization: Organization - - name: delete_member - method: DELETE - api_path: 'f"{organization_id}/member/{member_id}"' - eval_api_path: True - args: - - name: organization_id - arg_type: str - - name: member_id - arg_type: str - response_type: - member_id: str - - name: delete_member_password - method: DELETE - api_path: 'f"{organization_id}/members/passwords/{member_password_id}"' - eval_api_path: true - args: - - name: organization_id - arg_type: str - - name: member_password_id - arg_type: str - response_type: - member_id: str - member: Member - organization: Organization - - name: search - method: POST - args: - - name: cursor - arg_type: Optional[str] = None - - name: limit - arg_type: Optional[int] = None - - name: query - arg_type: Optional[SearchQuery] = None - response_type: - organizations: List[Organization] - results_metadata: SearchResultsMetadata - - name: search_members - method: POST - api_path: members/search - args: - - name: organization_ids - arg_type: List[str] - - name: cursor - arg_type: Optional[str] = None - - name: limit - arg_type: Optional[int] = None - - name: query - arg_type: Optional[SearchQuery] = None - map_pydantic: true - response_type: - members: List[Member] - results_metadata: SearchResultsMetadata diff --git a/codegen/specs/stytch_b2b/passwords.yml b/codegen/specs/stytch_b2b/passwords.yml deleted file mode 100644 index c7d5c65a..00000000 --- a/codegen/specs/stytch_b2b/passwords.yml +++ /dev/null @@ -1,178 +0,0 @@ -classname: Passwords -additional_imports: - - from stytch.core.models import Name -methods: - - name: authenticate - method: POST - args: - - name: organization_id - arg_type: str - - name: email_address - arg_type: str - - name: password - arg_type: str - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - response_type: - member: Member - member_id: str - organization_id: str - organization: Organization - session_token: str - session_jwt: str - member_session: Optional[B2BStytchSession] - - name: strength_check - method: POST - args: - - name: password - arg_type: str - - name: email_address - arg_type: Optional[str] = None - response_type: - breach_detection_on_create: bool - breached_password: bool - luds_feedback: dict - request_id: str - score: int - status_code: int - strength_policy: str - valid_password: bool - zxcvbn_feedback: dict - - name: migrate - method: POST - args: - - name: organization_id - arg_type: str - - name: email_address - arg_type: str - - name: hash - arg_type: str - - name: hash_type - arg_type: str - - name: md_5_config - arg_type: Optional[Dict[str, Any]] = None - - name: argon_2_config - arg_type: Optional[Dict[str, Any]] = None - - name: sha_1_config - arg_type: Optional[Dict[str, Any]] = None - - name: scrypt_config - arg_type: Optional[Dict[str, Any]] = None - - name: name - arg_type: Optional[Union[Name, Dict[str, str]]] = None - - name: trusted_metadata - arg_type: Optional[Dict[str, Any]] = None - - name: untrusted_metadata - arg_type: Optional[Dict[str, Any]] = None - response_type: - member: Member - member_id: str - organization: Organization -sub_apis: - - classname: Email - additional_imports: - - from stytch.core.b2b.models import B2BStytchSession, Member, Organization - sub_url: passwords/email - filename: passwords_email - methods: - - name: reset_start - api_path: reset/start - method: POST - args: - - name: organization_id - arg_type: str - - name: email_address - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: reset_password_redirect_url - arg_type: Optional[str] = None - - name: reset_password_expiration_minutes - arg_type: Optional[int] = None - - name: locale - arg_type: Optional[str] = None - - name: reset_password_template_id - arg_type: Optional[str] = None - response_type: - member_id: str - member_email_id: str - - name: reset - method: POST - args: - - name: password_reset_token - arg_type: str - - name: password - arg_type: str - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - response_type: - member: Member - member_id: str - member_email_id: str - organization_id: str - organization: Organization - session_token: str - session_jwt: str - member_session: Optional[B2BStytchSession] - - classname: ExistingPassword - sub_url: passwords/existing_password - filename: passwords_existing_password - methods: - - name: reset - method: POST - args: - - name: organization_id - arg_type: str - - name: email_address - arg_type: str - - name: existing_password - arg_type: str - - name: new_password - arg_type: str - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - response_type: - member: Member - member_id: str - organization_id: str - organization: Organization - session_token: str - session_jwt: str - member_session: Optional[B2BStytchSession] - - classname: Session - sub_url: passwords/session - filename: passwords_session - methods: - - name: reset - method: POST - args: - - name: organization_id - arg_type: str - - name: password - arg_type: str - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - response_type: - member: Member - member_id: str - organization: Organization - member_session: Optional[B2BStytchSession] \ No newline at end of file diff --git a/codegen/specs/stytch_b2b/sessions.yml b/codegen/specs/stytch_b2b/sessions.yml deleted file mode 100644 index 66ea34a5..00000000 --- a/codegen/specs/stytch_b2b/sessions.yml +++ /dev/null @@ -1,43 +0,0 @@ -classname: Sessions -additional_imports: - - from stytch.core.b2b.models import B2BStytchSession -methods: - - name: get - use_base_path_as_api_path: True - method: GET - args: - - name: organization_id - arg_type: str - - name: member_id - arg_type: str - response_type: - member_sessions: List[B2BStytchSession] - - name: authenticate - method: POST - args: - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - response_type: - member_session: B2BStytchSession - session_token: str - session_jwt: str - member: Member - organization: Organization - - name: revoke - method: POST - args: - - name: member_session_id - arg_type: Optional[str] = None - - name: session_token - arg_type: Optional[str] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: member_id - arg_type: Optional[str] = None - response_type: {} diff --git a/codegen/specs/stytch/sso.yml b/codegen/specs/stytch_b2b/sso.yml similarity index 100% rename from codegen/specs/stytch/sso.yml rename to codegen/specs/stytch_b2b/sso.yml diff --git a/stytch/b2b/api/debug_service.py b/stytch/b2b/api/debug_service.py new file mode 100644 index 00000000..033508f7 --- /dev/null +++ b/stytch/b2b/api/debug_service.py @@ -0,0 +1,47 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict + +from stytch.b2b.models.debug_service import WhoamiResponse +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient + + +class DebugService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "debug_service" + + def WhoAmI( + self, + ) -> WhoamiResponse: + payload: Dict[str, Any] = {} + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/debug/whoami") + + res = self.sync_client.get(url, params=payload) + return WhoamiResponse.from_json(res.response.status_code, res.json) + + async def WhoAmI_async( + self, + ) -> WhoamiResponse: + payload: Dict[str, Any] = {} + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/debug/whoami") + + res = await self.async_client.get(url, params=payload) + return WhoamiResponse.from_json(res.response.status, res.json) diff --git a/stytch/b2b/api/discovery_service.py b/stytch/b2b/api/discovery_service.py new file mode 100644 index 00000000..57176cfe --- /dev/null +++ b/stytch/b2b/api/discovery_service.py @@ -0,0 +1,216 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.b2b.models.discovery_service import ( + DiscoveryintermediatesessionexchangeResponse, + DiscoveryorganizationcreateResponse, + DiscoveryorganizationsResponse, +) +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient + + +class DiscoveryService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "discovery_service" + + def DiscoveryOrganizations( + self, + intermediate_session_token: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> DiscoveryorganizationsResponse: + + payload: Dict[str, Any] = { + } + + if intermediate_session_token is not None: + payload["intermediate_session_token"] = intermediate_session_token + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations") + + res = self.sync_client.post(url, json=payload) + return DiscoveryorganizationsResponse.from_json(res.response.status_code, res.json) + + async def DiscoveryOrganizations_async( + self, + intermediate_session_token: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> DiscoveryorganizationsResponse: + + payload: Dict[str, Any] = { + } + + if intermediate_session_token is not None: + payload["intermediate_session_token"] = intermediate_session_token + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations") + + res = await self.async_client.post(url, json=payload) + return DiscoveryorganizationsResponse.from_json(res.response.status, res.json) + + def DiscoveryIntermediateSessionExchange( + self, + intermediate_session_token: str, + organization_id: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> DiscoveryintermediatesessionexchangeResponse: + + payload: Dict[str, Any] = { + "intermediate_session_token": intermediate_session_token, + "organization_id": organization_id, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/intermediate_sessions/exchange") + + res = self.sync_client.post(url, json=payload) + return DiscoveryintermediatesessionexchangeResponse.from_json(res.response.status_code, res.json) + + async def DiscoveryIntermediateSessionExchange_async( + self, + intermediate_session_token: str, + organization_id: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> DiscoveryintermediatesessionexchangeResponse: + + payload: Dict[str, Any] = { + "intermediate_session_token": intermediate_session_token, + "organization_id": organization_id, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/intermediate_sessions/exchange") + + res = await self.async_client.post(url, json=payload) + return DiscoveryintermediatesessionexchangeResponse.from_json(res.response.status, res.json) + + def DiscoveryOrganizationCreate( + self, + intermediate_session_token: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + organization_name: str, + organization_slug: str, + organization_logo_url: str, + trusted_metadata: Optional[Dict[str, str]] = None, + sso_jit_provisioning: Optional[str] = None, + email_allowed_domains: List[str], + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: List[str], + ) -> DiscoveryorganizationcreateResponse: + + payload: Dict[str, Any] = { + "intermediate_session_token": intermediate_session_token, + "organization_name": organization_name, + "organization_slug": organization_slug, + "organization_logo_url": organization_logo_url, + "email_allowed_domains": email_allowed_domains, + "allowed_auth_methods": allowed_auth_methods, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations/create") + + res = self.sync_client.post(url, json=payload) + return DiscoveryorganizationcreateResponse.from_json(res.response.status_code, res.json) + + async def DiscoveryOrganizationCreate_async( + self, + intermediate_session_token: str, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + organization_name: str, + organization_slug: str, + organization_logo_url: str, + trusted_metadata: Optional[Dict[str, str]] = None, + sso_jit_provisioning: Optional[str] = None, + email_allowed_domains: List[str], + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: List[str], + ) -> DiscoveryorganizationcreateResponse: + + payload: Dict[str, Any] = { + "intermediate_session_token": intermediate_session_token, + "organization_name": organization_name, + "organization_slug": organization_slug, + "organization_logo_url": organization_logo_url, + "email_allowed_domains": email_allowed_domains, + "allowed_auth_methods": allowed_auth_methods, + } + + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations/create") + + res = await self.async_client.post(url, json=payload) + return DiscoveryorganizationcreateResponse.from_json(res.response.status, res.json) + diff --git a/stytch/b2b/api/multi_tenant_magic_service.py b/stytch/b2b/api/multi_tenant_magic_service.py new file mode 100644 index 00000000..17501173 --- /dev/null +++ b/stytch/b2b/api/multi_tenant_magic_service.py @@ -0,0 +1,359 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, Optional + +from stytch.b2b.models.multi_tenant_magic_service import ( + B2BmagiclinksdiscoveryauthenticateResponse, + B2BmagiclinksemaildiscoverysendResponse, + MultitenantmagiclinksauthenticateResponse, + MultitenantmagiclinksemailinviteResponse, + MultitenantmagiclinksemailloginorsignupResponse, +) +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient + + +class MultiTenantMagicService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "multi_tenant_magic_service" + + def MultiTenantMagicLinksEmailLoginOrSignup( + self, + organization_id: str, + email_address: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + pkce_code_challenge: Optional[str] = None, + login_template_id: Optional[str] = None, + signup_template_id: Optional[str] = None, + locale: Optional[str] = None, + ) -> MultitenantmagiclinksemailloginorsignupResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if pkce_code_challenge is not None: + payload["pkce_code_challenge"] = pkce_code_challenge + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/login_or_signup" + ) + + res = self.sync_client.post(url, json=payload) + return MultitenantmagiclinksemailloginorsignupResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantMagicLinksEmailLoginOrSignup_async( + self, + organization_id: str, + email_address: str, + login_redirect_url: Optional[str] = None, + signup_redirect_url: Optional[str] = None, + pkce_code_challenge: Optional[str] = None, + login_template_id: Optional[str] = None, + signup_template_id: Optional[str] = None, + locale: Optional[str] = None, + ) -> MultitenantmagiclinksemailloginorsignupResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + } + + if login_redirect_url is not None: + payload["login_redirect_url"] = login_redirect_url + if signup_redirect_url is not None: + payload["signup_redirect_url"] = signup_redirect_url + if pkce_code_challenge is not None: + payload["pkce_code_challenge"] = pkce_code_challenge + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if signup_template_id is not None: + payload["signup_template_id"] = signup_template_id + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/login_or_signup" + ) + + res = await self.async_client.post(url, json=payload) + return MultitenantmagiclinksemailloginorsignupResponse.from_json( + res.response.status, res.json + ) + + def MultiTenantMagicLinksEmailInvite( + self, + organization_id: str, + email_address: str, + invite_redirect_url: Optional[str] = None, + invited_by_member_id: Optional[str] = None, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + invite_template_id: Optional[str] = None, + locale: Optional[str] = None, + ) -> MultitenantmagiclinksemailinviteResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + } + + if invite_redirect_url is not None: + payload["invite_redirect_url"] = invite_redirect_url + if invited_by_member_id is not None: + payload["invited_by_member_id"] = invited_by_member_id + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + if invite_template_id is not None: + payload["invite_template_id"] = invite_template_id + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/invite" + ) + + res = self.sync_client.post(url, json=payload) + return MultitenantmagiclinksemailinviteResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantMagicLinksEmailInvite_async( + self, + organization_id: str, + email_address: str, + invite_redirect_url: Optional[str] = None, + invited_by_member_id: Optional[str] = None, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + invite_template_id: Optional[str] = None, + locale: Optional[str] = None, + ) -> MultitenantmagiclinksemailinviteResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + } + + if invite_redirect_url is not None: + payload["invite_redirect_url"] = invite_redirect_url + if invited_by_member_id is not None: + payload["invited_by_member_id"] = invited_by_member_id + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + if invite_template_id is not None: + payload["invite_template_id"] = invite_template_id + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/invite" + ) + + res = await self.async_client.post(url, json=payload) + return MultitenantmagiclinksemailinviteResponse.from_json( + res.response.status, res.json + ) + + def MultiTenantMagicLinksAuthenticate( + self, + magic_links_token: str, + pkce_code_verifier: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantmagiclinksauthenticateResponse: + payload: Dict[str, Any] = { + "magic_links_token": magic_links_token, + } + + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/authenticate" + ) + + res = self.sync_client.post(url, json=payload) + return MultitenantmagiclinksauthenticateResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantMagicLinksAuthenticate_async( + self, + magic_links_token: str, + pkce_code_verifier: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantmagiclinksauthenticateResponse: + payload: Dict[str, Any] = { + "magic_links_token": magic_links_token, + } + + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/authenticate" + ) + + res = await self.async_client.post(url, json=payload) + return MultitenantmagiclinksauthenticateResponse.from_json( + res.response.status, res.json + ) + + def B2BMagicLinksEmailDiscoverySend( + self, + email_address: str, + discovery_redirect_url: Optional[str] = None, + pkce_code_challenge: Optional[str] = None, + login_template_id: Optional[str] = None, + locale: Optional[str] = None, + ) -> B2BmagiclinksemaildiscoverysendResponse: + payload: Dict[str, Any] = { + "email_address": email_address, + } + + if discovery_redirect_url is not None: + payload["discovery_redirect_url"] = discovery_redirect_url + if pkce_code_challenge is not None: + payload["pkce_code_challenge"] = pkce_code_challenge + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/discovery/send" + ) + + res = self.sync_client.post(url, json=payload) + return B2BmagiclinksemaildiscoverysendResponse.from_json( + res.response.status_code, res.json + ) + + async def B2BMagicLinksEmailDiscoverySend_async( + self, + email_address: str, + discovery_redirect_url: Optional[str] = None, + pkce_code_challenge: Optional[str] = None, + login_template_id: Optional[str] = None, + locale: Optional[str] = None, + ) -> B2BmagiclinksemaildiscoverysendResponse: + payload: Dict[str, Any] = { + "email_address": email_address, + } + + if discovery_redirect_url is not None: + payload["discovery_redirect_url"] = discovery_redirect_url + if pkce_code_challenge is not None: + payload["pkce_code_challenge"] = pkce_code_challenge + if login_template_id is not None: + payload["login_template_id"] = login_template_id + if locale is not None: + payload["locale"] = locale + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/email/discovery/send" + ) + + res = await self.async_client.post(url, json=payload) + return B2BmagiclinksemaildiscoverysendResponse.from_json( + res.response.status, res.json + ) + + def B2BMagicLinksDiscoveryAuthenticate( + self, + discovery_magic_links_token: str, + pkce_code_verifier: Optional[str] = None, + ) -> B2BmagiclinksdiscoveryauthenticateResponse: + payload: Dict[str, Any] = { + "discovery_magic_links_token": discovery_magic_links_token, + } + + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/discovery/authenticate" + ) + + res = self.sync_client.post(url, json=payload) + return B2BmagiclinksdiscoveryauthenticateResponse.from_json( + res.response.status_code, res.json + ) + + async def B2BMagicLinksDiscoveryAuthenticate_async( + self, + discovery_magic_links_token: str, + pkce_code_verifier: Optional[str] = None, + ) -> B2BmagiclinksdiscoveryauthenticateResponse: + payload: Dict[str, Any] = { + "discovery_magic_links_token": discovery_magic_links_token, + } + + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/magic_links/discovery/authenticate" + ) + + res = await self.async_client.post(url, json=payload) + return B2BmagiclinksdiscoveryauthenticateResponse.from_json( + res.response.status, res.json + ) diff --git a/stytch/b2b/api/multi_tenant_password_service.py b/stytch/b2b/api/multi_tenant_password_service.py new file mode 100644 index 00000000..b62b67d6 --- /dev/null +++ b/stytch/b2b/api/multi_tenant_password_service.py @@ -0,0 +1,460 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.b2b.models.multi_tenant_password_service import ( + MultitenantpasswordauthenticateResponse, + MultitenantpasswordemailresetResponse, + MultitenantpasswordemailresetstartResponse, + MultitenantpasswordexistingpasswordresetResponse, + MultitenantpasswordmigrateResponse, + MultitenantpasswordsessionresetResponse, + MultitenantpasswordstrengthcheckResponse, +) +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient + + +class MultiTenantPasswordService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "multi_tenant_password_service" + + def MultiTenantPasswordStrengthCheck( + self, + password: str, + email_address: Optional[str] = None, + ) -> MultitenantpasswordstrengthcheckResponse: + + payload: Dict[str, Any] = { + "password": password, + } + + if email_address is not None: + payload["email_address"] = email_address + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/strength_check") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordstrengthcheckResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordStrengthCheck_async( + self, + password: str, + email_address: Optional[str] = None, + ) -> MultitenantpasswordstrengthcheckResponse: + + payload: Dict[str, Any] = { + "password": password, + } + + if email_address is not None: + payload["email_address"] = email_address + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/strength_check") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordstrengthcheckResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordMigrate( + self, + email_address: str, + hash: str, + hash_type: str, + md_5_config: None, + argon_2_config: None, + sha_1_config: None, + scrypt_config: None, + organization_id: str, + name: str, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordmigrateResponse: + + payload: Dict[str, Any] = { + "email_address": email_address, + "hash": hash, + "hash_type": hash_type, + "organization_id": organization_id, + "name": name, + } + + if md_5_config is not None: + payload["md_5_config"] = md_5_config + if argon_2_config is not None: + payload["argon_2_config"] = argon_2_config + if sha_1_config is not None: + payload["sha_1_config"] = sha_1_config + if scrypt_config is not None: + payload["scrypt_config"] = scrypt_config + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/migrate") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordmigrateResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordMigrate_async( + self, + email_address: str, + hash: str, + hash_type: str, + md_5_config: None, + argon_2_config: None, + sha_1_config: None, + scrypt_config: None, + organization_id: str, + name: str, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordmigrateResponse: + + payload: Dict[str, Any] = { + "email_address": email_address, + "hash": hash, + "hash_type": hash_type, + "organization_id": organization_id, + "name": name, + } + + if md_5_config is not None: + payload["md_5_config"] = md_5_config + if argon_2_config is not None: + payload["argon_2_config"] = argon_2_config + if sha_1_config is not None: + payload["sha_1_config"] = sha_1_config + if scrypt_config is not None: + payload["scrypt_config"] = scrypt_config + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/migrate") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordmigrateResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordAuthenticate( + self, + organization_id: str, + email_address: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordauthenticateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/authenticate") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordauthenticateResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordAuthenticate_async( + self, + organization_id: str, + email_address: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordauthenticateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/authenticate") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordauthenticateResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordEmailResetStart( + self, + organization_id: str, + email_address: str, + reset_password_redirect_url: str, + reset_password_expiration_minutes: Optional[int] = None, + code_challenge: Optional[str] = None, + login_redirect_url: str, + locale: Optional[str] = None, + reset_password_template_id: Optional[str] = None, + ) -> MultitenantpasswordemailresetstartResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "reset_password_redirect_url": reset_password_redirect_url, + "login_redirect_url": login_redirect_url, + } + + if reset_password_expiration_minutes is not None: + payload["reset_password_expiration_minutes"] = reset_password_expiration_minutes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if locale is not None: + payload["locale"] = locale + if reset_password_template_id is not None: + payload["reset_password_template_id"] = reset_password_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset/start") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordemailresetstartResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordEmailResetStart_async( + self, + organization_id: str, + email_address: str, + reset_password_redirect_url: str, + reset_password_expiration_minutes: Optional[int] = None, + code_challenge: Optional[str] = None, + login_redirect_url: str, + locale: Optional[str] = None, + reset_password_template_id: Optional[str] = None, + ) -> MultitenantpasswordemailresetstartResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "reset_password_redirect_url": reset_password_redirect_url, + "login_redirect_url": login_redirect_url, + } + + if reset_password_expiration_minutes is not None: + payload["reset_password_expiration_minutes"] = reset_password_expiration_minutes + if code_challenge is not None: + payload["code_challenge"] = code_challenge + if locale is not None: + payload["locale"] = locale + if reset_password_template_id is not None: + payload["reset_password_template_id"] = reset_password_template_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset/start") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordemailresetstartResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordEmailReset( + self, + password_reset_token: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + code_verifier: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordemailresetResponse: + + payload: Dict[str, Any] = { + "password_reset_token": password_reset_token, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if code_verifier is not None: + payload["code_verifier"] = code_verifier + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordemailresetResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordEmailReset_async( + self, + password_reset_token: str, + password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + code_verifier: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantpasswordemailresetResponse: + + payload: Dict[str, Any] = { + "password_reset_token": password_reset_token, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if code_verifier is not None: + payload["code_verifier"] = code_verifier + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordemailresetResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordSessionReset( + self, + organization_id: str, + password: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> MultitenantpasswordsessionresetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/session/reset") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordsessionresetResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordSessionReset_async( + self, + organization_id: str, + password: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + ) -> MultitenantpasswordsessionresetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "password": password, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/session/reset") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordsessionresetResponse.from_json(res.response.status, res.json) + + def MultiTenantPasswordExistingPasswordReset( + self, + email_address: str, + existing_password: str, + new_password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + organization_id: str, + ) -> MultitenantpasswordexistingpasswordresetResponse: + + payload: Dict[str, Any] = { + "email_address": email_address, + "existing_password": existing_password, + "new_password": new_password, + "organization_id": organization_id, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/existing_password/reset") + + res = self.sync_client.post(url, json=payload) + return MultitenantpasswordexistingpasswordresetResponse.from_json(res.response.status_code, res.json) + + async def MultiTenantPasswordExistingPasswordReset_async( + self, + email_address: str, + existing_password: str, + new_password: str, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + organization_id: str, + ) -> MultitenantpasswordexistingpasswordresetResponse: + + payload: Dict[str, Any] = { + "email_address": email_address, + "existing_password": existing_password, + "new_password": new_password, + "organization_id": organization_id, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/existing_password/reset") + + res = await self.async_client.post(url, json=payload) + return MultitenantpasswordexistingpasswordresetResponse.from_json(res.response.status, res.json) + diff --git a/stytch/b2b/api/multi_tenant_session_service.py b/stytch/b2b/api/multi_tenant_session_service.py new file mode 100644 index 00000000..014335d4 --- /dev/null +++ b/stytch/b2b/api/multi_tenant_session_service.py @@ -0,0 +1,228 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, Optional + +from stytch.b2b.models.multi_tenant_session_service import ( + MultitenantsessionsauthenticateResponse, + MultitenantsessionsexchangeResponse, + MultitenantsessionsgetResponse, + MultitenantsessionsrevokeResponse, +) +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient + + +class MultiTenantSessionService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "multi_tenant_session_service" + + def MultiTenantSessionsGet( + self, + organization_id: str, + member_id: str, + ) -> MultitenantsessionsgetResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "member_id": member_id, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions") + + res = self.sync_client.get(url, params=payload) + return MultitenantsessionsgetResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantSessionsGet_async( + self, + organization_id: str, + member_id: str, + ) -> MultitenantsessionsgetResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + "member_id": member_id, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions") + + res = await self.async_client.get(url, params=payload) + return MultitenantsessionsgetResponse.from_json(res.response.status, res.json) + + def MultiTenantSessionsAuthenticate( + self, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantsessionsauthenticateResponse: + payload: Dict[str, Any] = {} + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/authenticate" + ) + + res = self.sync_client.post(url, json=payload) + return MultitenantsessionsauthenticateResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantSessionsAuthenticate_async( + self, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantsessionsauthenticateResponse: + payload: Dict[str, Any] = {} + + if session_token is not None: + payload["session_token"] = session_token + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/authenticate" + ) + + res = await self.async_client.post(url, json=payload) + return MultitenantsessionsauthenticateResponse.from_json( + res.response.status, res.json + ) + + def MultiTenantSessionsRevoke( + self, + member_session_id: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + member_id: Optional[str] = None, + ) -> MultitenantsessionsrevokeResponse: + payload: Dict[str, Any] = {} + + if member_session_id is not None: + payload["member_session_id"] = member_session_id + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if member_id is not None: + payload["member_id"] = member_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions/revoke") + + res = self.sync_client.post(url, json=payload) + return MultitenantsessionsrevokeResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantSessionsRevoke_async( + self, + member_session_id: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + member_id: Optional[str] = None, + ) -> MultitenantsessionsrevokeResponse: + payload: Dict[str, Any] = {} + + if member_session_id is not None: + payload["member_session_id"] = member_session_id + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if member_id is not None: + payload["member_id"] = member_id + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions/revoke") + + res = await self.async_client.post(url, json=payload) + return MultitenantsessionsrevokeResponse.from_json( + res.response.status, res.json + ) + + def MultiTenantSessionsExchange( + self, + organization_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantsessionsexchangeResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/exchange" + ) + + res = self.sync_client.post(url, json=payload) + return MultitenantsessionsexchangeResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantSessionsExchange_async( + self, + organization_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> MultitenantsessionsexchangeResponse: + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/exchange" + ) + + res = await self.async_client.post(url, json=payload) + return MultitenantsessionsexchangeResponse.from_json( + res.response.status, res.json + ) diff --git a/stytch/b2b/api/organization_service.py b/stytch/b2b/api/organization_service.py new file mode 100644 index 00000000..d4510086 --- /dev/null +++ b/stytch/b2b/api/organization_service.py @@ -0,0 +1,564 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.b2b.models.organization_service import ( + OrganizationscreateResponse, + OrganizationsdeleteResponse, + OrganizationsgetResponse, + OrganizationsmembercreateResponse, + OrganizationsmemberdeletepasswordResponse, + OrganizationsmemberdeleteResponse, + OrganizationsmembergetResponse, + OrganizationsmembersearchexternalResponse, + OrganizationsmemberupdateResponse, + OrganizationssearchexternalResponse, + OrganizationsupdateResponse, +) +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient + + +class OrganizationService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "organization_service" + + def OrganizationsCreate( + self, + organization_name: str, + organization_slug: str, + organization_logo_url: str, + trusted_metadata: Optional[Dict[str, str]] = None, + sso_jit_provisioning: Optional[str] = None, + email_allowed_domains: List[str], + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: List[str], + ) -> OrganizationscreateResponse: + + payload: Dict[str, Any] = { + "organization_name": organization_name, + "organization_slug": organization_slug, + "organization_logo_url": organization_logo_url, + "email_allowed_domains": email_allowed_domains, + "allowed_auth_methods": allowed_auth_methods, + } + + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations") + + res = self.sync_client.post(url, json=payload) + return OrganizationscreateResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsCreate_async( + self, + organization_name: str, + organization_slug: str, + organization_logo_url: str, + trusted_metadata: Optional[Dict[str, str]] = None, + sso_jit_provisioning: Optional[str] = None, + email_allowed_domains: List[str], + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: List[str], + ) -> OrganizationscreateResponse: + + payload: Dict[str, Any] = { + "organization_name": organization_name, + "organization_slug": organization_slug, + "organization_logo_url": organization_logo_url, + "email_allowed_domains": email_allowed_domains, + "allowed_auth_methods": allowed_auth_methods, + } + + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations") + + res = await self.async_client.post(url, json=payload) + return OrganizationscreateResponse.from_json(res.response.status, res.json) + + def OrganizationsGet( + self, + organization_id: str, + ) -> OrganizationsgetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = self.sync_client.get(url, params=payload) + return OrganizationsgetResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsGet_async( + self, + organization_id: str, + ) -> OrganizationsgetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = await self.async_client.get(url, params=payload) + return OrganizationsgetResponse.from_json(res.response.status, res.json) + + def OrganizationsUpdate( + self, + organization_id: str, + organization_name: Optional[str] = None, + organization_slug: Optional[str] = None, + organization_logo_url: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + sso_default_connection_id: Optional[str] = None, + sso_jit_provisioning: Optional[str] = None, + sso_jit_provisioning_allowed_connections: Optional[List[str]] = None, + email_allowed_domains: Optional[List[str]] = None, + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: Optional[List[str]] = None, + ) -> OrganizationsupdateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if organization_name is not None: + payload["organization_name"] = organization_name + if organization_slug is not None: + payload["organization_slug"] = organization_slug + if organization_logo_url is not None: + payload["organization_logo_url"] = organization_logo_url + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if sso_default_connection_id is not None: + payload["sso_default_connection_id"] = sso_default_connection_id + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning + if sso_jit_provisioning_allowed_connections is not None: + payload["sso_jit_provisioning_allowed_connections"] = sso_jit_provisioning_allowed_connections + if email_allowed_domains is not None: + payload["email_allowed_domains"] = email_allowed_domains + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods + if allowed_auth_methods is not None: + payload["allowed_auth_methods"] = allowed_auth_methods + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = self.sync_client.put(url, json=payload) + return OrganizationsupdateResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsUpdate_async( + self, + organization_id: str, + organization_name: Optional[str] = None, + organization_slug: Optional[str] = None, + organization_logo_url: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + sso_default_connection_id: Optional[str] = None, + sso_jit_provisioning: Optional[str] = None, + sso_jit_provisioning_allowed_connections: Optional[List[str]] = None, + email_allowed_domains: Optional[List[str]] = None, + email_jit_provisioning: Optional[str] = None, + email_invites: Optional[str] = None, + auth_methods: Optional[str] = None, + allowed_auth_methods: Optional[List[str]] = None, + ) -> OrganizationsupdateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if organization_name is not None: + payload["organization_name"] = organization_name + if organization_slug is not None: + payload["organization_slug"] = organization_slug + if organization_logo_url is not None: + payload["organization_logo_url"] = organization_logo_url + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if sso_default_connection_id is not None: + payload["sso_default_connection_id"] = sso_default_connection_id + if sso_jit_provisioning is not None: + payload["sso_jit_provisioning"] = sso_jit_provisioning + if sso_jit_provisioning_allowed_connections is not None: + payload["sso_jit_provisioning_allowed_connections"] = sso_jit_provisioning_allowed_connections + if email_allowed_domains is not None: + payload["email_allowed_domains"] = email_allowed_domains + if email_jit_provisioning is not None: + payload["email_jit_provisioning"] = email_jit_provisioning + if email_invites is not None: + payload["email_invites"] = email_invites + if auth_methods is not None: + payload["auth_methods"] = auth_methods + if allowed_auth_methods is not None: + payload["allowed_auth_methods"] = allowed_auth_methods + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = await self.async_client.put(url, json=payload) + return OrganizationsupdateResponse.from_json(res.response.status, res.json) + + def OrganizationsDelete( + self, + organization_id: str, + ) -> OrganizationsdeleteResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = self.sync_client.delete(url) + return OrganizationsdeleteResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsDelete_async( + self, + organization_id: str, + ) -> OrganizationsdeleteResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") + + res = await self.async_client.delete(url) + return OrganizationsdeleteResponse.from_json(res.response.status, res.json) + + def OrganizationsMemberCreate( + self, + organization_id: str, + email_address: str, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + create_member_as_pending: bool, + is_breakglass: bool, + ) -> OrganizationsmembercreateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "create_member_as_pending": create_member_as_pending, + "is_breakglass": is_breakglass, + } + + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members") + + res = self.sync_client.post(url, json=payload) + return OrganizationsmembercreateResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberCreate_async( + self, + organization_id: str, + email_address: str, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + create_member_as_pending: bool, + is_breakglass: bool, + ) -> OrganizationsmembercreateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "email_address": email_address, + "create_member_as_pending": create_member_as_pending, + "is_breakglass": is_breakglass, + } + + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members") + + res = await self.async_client.post(url, json=payload) + return OrganizationsmembercreateResponse.from_json(res.response.status, res.json) + + def OrganizationsMemberUpdate( + self, + organization_id: str, + member_id: str, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + is_breakglass: Optional[bool] = None, + ) -> OrganizationsmemberupdateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "member_id": member_id, + } + + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + if is_breakglass is not None: + payload["is_breakglass"] = is_breakglass + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") + + res = self.sync_client.put(url, json=payload) + return OrganizationsmemberupdateResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberUpdate_async( + self, + organization_id: str, + member_id: str, + name: Optional[str] = None, + trusted_metadata: Optional[Dict[str, str]] = None, + untrusted_metadata: Optional[Dict[str, str]] = None, + is_breakglass: Optional[bool] = None, + ) -> OrganizationsmemberupdateResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "member_id": member_id, + } + + if name is not None: + payload["name"] = name + if trusted_metadata is not None: + payload["trusted_metadata"] = trusted_metadata + if untrusted_metadata is not None: + payload["untrusted_metadata"] = untrusted_metadata + if is_breakglass is not None: + payload["is_breakglass"] = is_breakglass + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") + + res = await self.async_client.put(url, json=payload) + return OrganizationsmemberupdateResponse.from_json(res.response.status, res.json) + + def OrganizationsMemberDelete( + self, + organization_id: str, + member_id: str, + ) -> OrganizationsmemberdeleteResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") + + res = self.sync_client.delete(url) + return OrganizationsmemberdeleteResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberDelete_async( + self, + organization_id: str, + member_id: str, + ) -> OrganizationsmemberdeleteResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") + + res = await self.async_client.delete(url) + return OrganizationsmemberdeleteResponse.from_json(res.response.status, res.json) + + def OrganizationsSearchExternal( + self, + cursor: str, + limit: Optional[int] = None, + query: ExternalSearchQuery, + ) -> OrganizationssearchexternalResponse: + + payload: Dict[str, Any] = { + "cursor": cursor, + "query": query, + } + + if limit is not None: + payload["limit"] = limit + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/search") + + res = self.sync_client.post(url, json=payload) + return OrganizationssearchexternalResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsSearchExternal_async( + self, + cursor: str, + limit: Optional[int] = None, + query: ExternalSearchQuery, + ) -> OrganizationssearchexternalResponse: + + payload: Dict[str, Any] = { + "cursor": cursor, + "query": query, + } + + if limit is not None: + payload["limit"] = limit + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/search") + + res = await self.async_client.post(url, json=payload) + return OrganizationssearchexternalResponse.from_json(res.response.status, res.json) + + def OrganizationsMemberSearchExternal( + self, + cursor: str, + limit: Optional[int] = None, + query: ExternalSearchQuery, + organization_ids: List[str], + ) -> OrganizationsmembersearchexternalResponse: + + payload: Dict[str, Any] = { + "cursor": cursor, + "query": query, + "organization_ids": organization_ids, + } + + if limit is not None: + payload["limit"] = limit + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/members/search") + + res = self.sync_client.post(url, json=payload) + return OrganizationsmembersearchexternalResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberSearchExternal_async( + self, + cursor: str, + limit: Optional[int] = None, + query: ExternalSearchQuery, + organization_ids: List[str], + ) -> OrganizationsmembersearchexternalResponse: + + payload: Dict[str, Any] = { + "cursor": cursor, + "query": query, + "organization_ids": organization_ids, + } + + if limit is not None: + payload["limit"] = limit + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/members/search") + + res = await self.async_client.post(url, json=payload) + return OrganizationsmembersearchexternalResponse.from_json(res.response.status, res.json) + + def OrganizationsMemberDeletePassword( + self, + organization_id: str, + member_password_id: str, + ) -> OrganizationsmemberdeletepasswordResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/passwords/{member_password_id}") + + res = self.sync_client.delete(url) + return OrganizationsmemberdeletepasswordResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberDeletePassword_async( + self, + organization_id: str, + member_password_id: str, + ) -> OrganizationsmemberdeletepasswordResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/passwords/{member_password_id}") + + res = await self.async_client.delete(url) + return OrganizationsmemberdeletepasswordResponse.from_json(res.response.status, res.json) + + def OrganizationsMemberGet( + self, + organization_id: str, + member_id: Optional[str] = None, + email_address: Optional[str] = None, + ) -> OrganizationsmembergetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if member_id is not None: + payload["member_id"] = member_id + if email_address is not None: + payload["email_address"] = email_address + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/member") + + res = self.sync_client.get(url, params=payload) + return OrganizationsmembergetResponse.from_json(res.response.status_code, res.json) + + async def OrganizationsMemberGet_async( + self, + organization_id: str, + member_id: Optional[str] = None, + email_address: Optional[str] = None, + ) -> OrganizationsmembergetResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + if member_id is not None: + payload["member_id"] = member_id + if email_address is not None: + payload["email_address"] = email_address + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/member") + + res = await self.async_client.get(url, params=payload) + return OrganizationsmembergetResponse.from_json(res.response.status, res.json) + diff --git a/stytch/b2b/api/sso_service.py b/stytch/b2b/api/sso_service.py new file mode 100644 index 00000000..26e6304b --- /dev/null +++ b/stytch/b2b/api/sso_service.py @@ -0,0 +1,447 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, List, Optional, Union + +import pydantic + +from stytch.b2b.models.sso_service import ( + CreateoidcconnectionResponse, + CreatesamlconnectionResponse, + DeletesamlverificationcertificateResponse, + DeletessoconnectionResponse, + GetssoconnectionsResponse, + SsoauthenticateResponse, + UpdateoidcconnectionResponse, + UpdatesamlconnectionbydocResponse, + UpdatesamlconnectionbyurlResponse, + UpdatesamlconnectionResponse, +) +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient + + +class SSOService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "sso_service" + + def CreateOIDCConnection( + self, + organization_id: str, + display_name: str, + ) -> CreateoidcconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "display_name": display_name, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}") + + res = self.sync_client.post(url, json=payload) + return CreateoidcconnectionResponse.from_json(res.response.status_code, res.json) + + async def CreateOIDCConnection_async( + self, + organization_id: str, + display_name: str, + ) -> CreateoidcconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "display_name": display_name, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}") + + res = await self.async_client.post(url, json=payload) + return CreateoidcconnectionResponse.from_json(res.response.status, res.json) + + def CreateSAMLConnection( + self, + organization_id: str, + display_name: str, + ) -> CreatesamlconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "display_name": display_name, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}") + + res = self.sync_client.post(url, json=payload) + return CreatesamlconnectionResponse.from_json(res.response.status_code, res.json) + + async def CreateSAMLConnection_async( + self, + organization_id: str, + display_name: str, + ) -> CreatesamlconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "display_name": display_name, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}") + + res = await self.async_client.post(url, json=payload) + return CreatesamlconnectionResponse.from_json(res.response.status, res.json) + + def UpdateOIDCConnection( + self, + organization_id: str, + connection_id: str, + display_name: str, + client_id: str, + client_secret: str, + issuer: str, + authorization_url: str, + token_url: str, + userinfo_url: str, + jwks_url: str, + ) -> UpdateoidcconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "connection_id": connection_id, + "display_name": display_name, + "client_id": client_id, + "client_secret": client_secret, + "issuer": issuer, + "authorization_url": authorization_url, + "token_url": token_url, + "userinfo_url": userinfo_url, + "jwks_url": jwks_url, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}/connections/{connection_id}") + + res = self.sync_client.put(url, json=payload) + return UpdateoidcconnectionResponse.from_json(res.response.status_code, res.json) + + async def UpdateOIDCConnection_async( + self, + organization_id: str, + connection_id: str, + display_name: str, + client_id: str, + client_secret: str, + issuer: str, + authorization_url: str, + token_url: str, + userinfo_url: str, + jwks_url: str, + ) -> UpdateoidcconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "connection_id": connection_id, + "display_name": display_name, + "client_id": client_id, + "client_secret": client_secret, + "issuer": issuer, + "authorization_url": authorization_url, + "token_url": token_url, + "userinfo_url": userinfo_url, + "jwks_url": jwks_url, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}/connections/{connection_id}") + + res = await self.async_client.put(url, json=payload) + return UpdateoidcconnectionResponse.from_json(res.response.status, res.json) + + def UpdateSAMLConnection( + self, + organization_id: str, + connection_id: str, + idp_entity_id: str, + display_name: str, + attribute_mapping: Optional[Dict[str, str]] = None, + x509_certificate: str, + idp_sso_url: str, + None: None, + ) -> UpdatesamlconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "connection_id": connection_id, + "idp_entity_id": idp_entity_id, + "display_name": display_name, + "x509_certificate": x509_certificate, + "idp_sso_url": idp_sso_url, + } + + if attribute_mapping is not None: + payload["attribute_mapping"] = attribute_mapping + if None is not None: + payload["None"] = None + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}") + + res = self.sync_client.put(url, json=payload) + return UpdatesamlconnectionResponse.from_json(res.response.status_code, res.json) + + async def UpdateSAMLConnection_async( + self, + organization_id: str, + connection_id: str, + idp_entity_id: str, + display_name: str, + attribute_mapping: Optional[Dict[str, str]] = None, + x509_certificate: str, + idp_sso_url: str, + None: None, + ) -> UpdatesamlconnectionResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + "connection_id": connection_id, + "idp_entity_id": idp_entity_id, + "display_name": display_name, + "x509_certificate": x509_certificate, + "idp_sso_url": idp_sso_url, + } + + if attribute_mapping is not None: + payload["attribute_mapping"] = attribute_mapping + if None is not None: + payload["None"] = None + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}") + + res = await self.async_client.put(url, json=payload) + return UpdatesamlconnectionResponse.from_json(res.response.status, res.json) + + def UpdateSAMLConnectionByURL( + self, + connection_id: str, + metadata_url: str, + ) -> UpdatesamlconnectionbyurlResponse: + + payload: Dict[str, Any] = { + "connection_id": connection_id, + "metadata_url": metadata_url, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/url") + + res = self.sync_client.put(url, json=payload) + return UpdatesamlconnectionbyurlResponse.from_json(res.response.status_code, res.json) + + async def UpdateSAMLConnectionByURL_async( + self, + connection_id: str, + metadata_url: str, + ) -> UpdatesamlconnectionbyurlResponse: + + payload: Dict[str, Any] = { + "connection_id": connection_id, + "metadata_url": metadata_url, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/url") + + res = await self.async_client.put(url, json=payload) + return UpdatesamlconnectionbyurlResponse.from_json(res.response.status, res.json) + + def UpdateSAMLConnectionByDoc( + self, + connection_id: str, + metadata: None, + ) -> UpdatesamlconnectionbydocResponse: + + payload: Dict[str, Any] = { + "connection_id": connection_id, + } + + if metadata is not None: + payload["metadata"] = metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/doc") + + res = self.sync_client.put(url, json=payload) + return UpdatesamlconnectionbydocResponse.from_json(res.response.status_code, res.json) + + async def UpdateSAMLConnectionByDoc_async( + self, + connection_id: str, + metadata: None, + ) -> UpdatesamlconnectionbydocResponse: + + payload: Dict[str, Any] = { + "connection_id": connection_id, + } + + if metadata is not None: + payload["metadata"] = metadata + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/doc") + + res = await self.async_client.put(url, json=payload) + return UpdatesamlconnectionbydocResponse.from_json(res.response.status, res.json) + + def GetSSOConnections( + self, + organization_id: str, + ) -> GetssoconnectionsResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}") + + res = self.sync_client.get(url, params=payload) + return GetssoconnectionsResponse.from_json(res.response.status_code, res.json) + + async def GetSSOConnections_async( + self, + organization_id: str, + ) -> GetssoconnectionsResponse: + + payload: Dict[str, Any] = { + "organization_id": organization_id, + } + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}") + + res = await self.async_client.get(url, params=payload) + return GetssoconnectionsResponse.from_json(res.response.status, res.json) + + def DeleteSSOConnection( + self, + organization_id: str, + connection_id: str, + ) -> DeletessoconnectionResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}/connections/{connection_id}") + + res = self.sync_client.delete(url) + return DeletessoconnectionResponse.from_json(res.response.status_code, res.json) + + async def DeleteSSOConnection_async( + self, + organization_id: str, + connection_id: str, + ) -> DeletessoconnectionResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}/connections/{connection_id}") + + res = await self.async_client.delete(url) + return DeletessoconnectionResponse.from_json(res.response.status, res.json) + + def SSOAuthenticate( + self, + sso_token: str, + pkce_code_verifier: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> SsoauthenticateResponse: + + payload: Dict[str, Any] = { + "sso_token": sso_token, + } + + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/authenticate") + + res = self.sync_client.post(url, json=payload) + return SsoauthenticateResponse.from_json(res.response.status_code, res.json) + + async def SSOAuthenticate_async( + self, + sso_token: str, + pkce_code_verifier: Optional[str] = None, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_custom_claims: Optional[Dict[str, str]] = None, + ) -> SsoauthenticateResponse: + + payload: Dict[str, Any] = { + "sso_token": sso_token, + } + + if pkce_code_verifier is not None: + payload["pkce_code_verifier"] = pkce_code_verifier + if session_token is not None: + payload["session_token"] = session_token + if session_jwt is not None: + payload["session_jwt"] = session_jwt + if session_duration_minutes is not None: + payload["session_duration_minutes"] = session_duration_minutes + if session_custom_claims is not None: + payload["session_custom_claims"] = session_custom_claims + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/authenticate") + + res = await self.async_client.post(url, json=payload) + return SsoauthenticateResponse.from_json(res.response.status, res.json) + + def DeleteSAMLVerificationCertificate( + self, + organization_id: str, + connection_id: str, + certificate_id: str, + ) -> DeletesamlverificationcertificateResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}/verification_certificates/{certificate_id}") + + res = self.sync_client.delete(url) + return DeletesamlverificationcertificateResponse.from_json(res.response.status_code, res.json) + + async def DeleteSAMLVerificationCertificate_async( + self, + organization_id: str, + connection_id: str, + certificate_id: str, + ) -> DeletesamlverificationcertificateResponse: + + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}/verification_certificates/{certificate_id}") + + res = await self.async_client.delete(url) + return DeletesamlverificationcertificateResponse.from_json(res.response.status, res.json) + diff --git a/stytch/b2b/models/debug_service.py b/stytch/b2b/models/debug_service.py new file mode 100644 index 00000000..5f6c96e5 --- /dev/null +++ b/stytch/b2b/models/debug_service.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class WhoamiResponse(ResponseBase): + request_id: str + project_id: str + name: str diff --git a/stytch/b2b/models/discovery_service.py b/stytch/b2b/models/discovery_service.py new file mode 100644 index 00000000..dcfd20d5 --- /dev/null +++ b/stytch/b2b/models/discovery_service.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class DiscoveryorganizationsResponse(ResponseBase): + request_id: str + email_address: str + discovered_organizations: None + + +class DiscoveryintermediatesessionexchangeResponse(ResponseBase): + request_id: str + member_id: str + member_session: None + session_token: str + session_jwt: str + member: None + organization: None + + +class DiscoveryorganizationcreateResponse(ResponseBase): + request_id: str + member_id: str + member_session: None + session_token: str + session_jwt: str + member: None + organization: None diff --git a/stytch/b2b/models/multi_tenant_magic_service.py b/stytch/b2b/models/multi_tenant_magic_service.py new file mode 100644 index 00000000..e899fad4 --- /dev/null +++ b/stytch/b2b/models/multi_tenant_magic_service.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class MultitenantmagiclinksemailloginorsignupResponse(ResponseBase): + request_id: str + member_id: str + member_created: bool + member: None + organization: None + + +class MultitenantmagiclinksemailinviteResponse(ResponseBase): + request_id: str + member_id: str + member: None + organization: None + + +class MultitenantmagiclinksauthenticateResponse(ResponseBase): + request_id: str + member_id: str + method_id: str + reset_sessions: bool + organization_id: str + member: None + session_token: str + session_jwt: str + member_session: None + organization: None + + +class B2BmagiclinksemaildiscoverysendResponse(ResponseBase): + request_id: str + + +class B2BmagiclinksdiscoveryauthenticateResponse(ResponseBase): + request_id: str + intermediate_session_token: str + email_address: str + discovered_organizations: None diff --git a/stytch/b2b/models/multi_tenant_password_service.py b/stytch/b2b/models/multi_tenant_password_service.py new file mode 100644 index 00000000..0384a13a --- /dev/null +++ b/stytch/b2b/models/multi_tenant_password_service.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class MultitenantpasswordstrengthcheckResponse(ResponseBase): + request_id: str + valid_password: bool + score: None + breached_password: bool + luds_feedback: None + strength_policy: str + breach_detection_on_create: bool + zxcvbn_feedback: None + + +class MultitenantpasswordmigrateResponse(ResponseBase): + request_id: str + member_id: str + member_created: bool + member: None + organization: None + + +class MultitenantpasswordauthenticateResponse(ResponseBase): + request_id: str + member_id: str + organization_id: str + member: None + session_token: str + session_jwt: str + member_session: None + organization: None + + +class MultitenantpasswordemailresetstartResponse(ResponseBase): + request_id: str + member_id: str + member_email_id: str + + +class MultitenantpasswordemailresetResponse(ResponseBase): + request_id: str + member_id: str + member_email_id: str + organization_id: str + member: None + session_token: str + session_jwt: str + member_session: None + organization: None + + +class MultitenantpasswordsessionresetResponse(ResponseBase): + request_id: str + member_id: str + member_session: None + member: None + organization: None + + +class MultitenantpasswordexistingpasswordresetResponse(ResponseBase): + request_id: str + member_id: str + member_session: None + member: None + session_token: str + session_jwt: str + organization: None diff --git a/stytch/b2b/models/multi_tenant_session_service.py b/stytch/b2b/models/multi_tenant_session_service.py new file mode 100644 index 00000000..f68b421d --- /dev/null +++ b/stytch/b2b/models/multi_tenant_session_service.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class MultitenantsessionsgetResponse(ResponseBase): + request_id: str + member_sessions: None + + +class MultitenantsessionsauthenticateResponse(ResponseBase): + request_id: str + member_session: None + session_token: str + session_jwt: str + member: None + organization: None + + +class MultitenantsessionsrevokeResponse(ResponseBase): + request_id: str + + +class MultitenantsessionsexchangeResponse(ResponseBase): + request_id: str + member_id: str + member_session: None + session_token: str + session_jwt: str + member: None + organization: None diff --git a/stytch/b2b/models/organization_service.py b/stytch/b2b/models/organization_service.py new file mode 100644 index 00000000..5baa949e --- /dev/null +++ b/stytch/b2b/models/organization_service.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 + +from typing import List + +from stytch.b2b.core.models import Member, Organization +from stytch.core.models import ResponseBase + + +class OrganizationscreateResponse(ResponseBase): + request_id: str + organization: Organization + + +class OrganizationsgetResponse(ResponseBase): + request_id: str + organization: Organization + + +class OrganizationsupdateResponse(ResponseBase): + request_id: str + organization: Organization + + +class OrganizationsdeleteResponse(ResponseBase): + request_id: str + organization_id: str + + +class OrganizationsmembercreateResponse(ResponseBase): + request_id: str + member_id: str + member: None + organization: Organization + + +class OrganizationsmemberupdateResponse(ResponseBase): + request_id: str + member_id: str + member: None + organization: Organization + + +class OrganizationsmemberdeleteResponse(ResponseBase): + request_id: str + member_id: str + + +class OrganizationssearchexternalResponse(ResponseBase): + request_id: str + organizations: List[Organization] + results_metadata: ResultsMetadata + + +class OrganizationsmembersearchexternalResponse(ResponseBase): + request_id: str + members: List[Member] + results_metadata: ResultsMetadata + + +class OrganizationsmemberdeletepasswordResponse(ResponseBase): + request_id: str + member_id: str + member: None + organization: None + + +class OrganizationsmembergetResponse(ResponseBase): + request_id: str + member_id: str + member: None + organization: None diff --git a/stytch/b2b/models/sso_service.py b/stytch/b2b/models/sso_service.py new file mode 100644 index 00000000..9516b33f --- /dev/null +++ b/stytch/b2b/models/sso_service.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 + +from typing import Optional + +from stytch.core.models import ResponseBase + + +class CreateoidcconnectionResponse(ResponseBase): + request_id: str + connection: None + + +class CreatesamlconnectionResponse(ResponseBase): + request_id: str + connection: None + + +class UpdateoidcconnectionResponse(ResponseBase): + request_id: str + connection: None + warning: Optional[str] = None + + +class UpdatesamlconnectionResponse(ResponseBase): + request_id: str + connection: None + + +class UpdatesamlconnectionbyurlResponse(ResponseBase): + request_id: str + connection: None + + +class UpdatesamlconnectionbydocResponse(ResponseBase): + request_id: str + connection: None + + +class GetssoconnectionsResponse(ResponseBase): + request_id: str + saml_connections: None + oidc_connections: None + + +class DeletessoconnectionResponse(ResponseBase): + request_id: str + connection_id: str + + +class SsoauthenticateResponse(ResponseBase): + request_id: str + member_id: str + organization_id: str + member: None + session_token: str + session_jwt: str + member_session: None + reset_session: bool + organization: None + + +class DeletesamlverificationcertificateResponse(ResponseBase): + request_id: str + certificate_id: str From 350098e2df58af3e3eaed06956efe99a5eaed8fc Mon Sep 17 00:00:00 2001 From: Joshua Hight Date: Tue, 18 Apr 2023 13:09:30 -0700 Subject: [PATCH 5/7] run generator from awesomness --- awesomeness.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/awesomeness.sh b/awesomeness.sh index 93d48b6c..82e0a535 100755 --- a/awesomeness.sh +++ b/awesomeness.sh @@ -38,3 +38,5 @@ do cp $line $b2bFile fi done + +./bin/generate-api.sh From 0dde27f684d325dc8121a531071c0fe6673c1f4d Mon Sep 17 00:00:00 2001 From: Joshua Hight Date: Tue, 18 Apr 2023 13:09:50 -0700 Subject: [PATCH 6/7] change struct values to Any --- codegen/specs/stytch/biometric.yml | 4 +-- codegen/specs/stytch/crypto_wallet.yml | 2 +- codegen/specs/stytch/magic.yml | 4 +-- codegen/specs/stytch/oauth.yml | 6 ++-- codegen/specs/stytch/otp.yml | 2 +- codegen/specs/stytch/password.yml | 16 +++++----- codegen/specs/stytch/session.yml | 2 +- codegen/specs/stytch/totp.yml | 4 +-- codegen/specs/stytch/user.yml | 12 +++---- codegen/specs/stytch/webauthn.yml | 2 +- codegen/specs/stytch_b2b/discovery.yml | 6 ++-- .../specs/stytch_b2b/multitenant_magic.yml | 6 ++-- .../specs/stytch_b2b/multitenant_password.yml | 10 +++--- .../specs/stytch_b2b/multitenant_session.yml | 4 +-- codegen/specs/stytch_b2b/organization.yml | 12 +++---- codegen/specs/stytch_b2b/sso.yml | 4 +-- stytch/api/biometric_service.py | 8 ++--- stytch/api/crypto_wallet_service.py | 4 +-- stytch/api/magic_service.py | 8 ++--- stytch/api/o_auth_service.py | 12 +++---- stytch/api/otp_service.py | 4 +-- stytch/api/password_service.py | 32 +++++++++---------- stytch/api/session_service.py | 4 +-- stytch/api/totp_service.py | 8 ++--- stytch/api/user_service.py | 16 +++++----- stytch/api/web_authn_service.py | 4 +-- stytch/b2b/api/discovery_service.py | 12 +++---- stytch/b2b/api/multi_tenant_magic_service.py | 12 +++---- .../b2b/api/multi_tenant_password_service.py | 20 ++++++------ .../b2b/api/multi_tenant_session_service.py | 8 ++--- stytch/b2b/api/organization_service.py | 24 +++++++------- stytch/b2b/api/sso_service.py | 8 ++--- stytch/models/user_service.py | 6 ++-- 33 files changed, 143 insertions(+), 143 deletions(-) diff --git a/codegen/specs/stytch/biometric.yml b/codegen/specs/stytch/biometric.yml index 5299de78..690f5910 100644 --- a/codegen/specs/stytch/biometric.yml +++ b/codegen/specs/stytch/biometric.yml @@ -22,7 +22,7 @@ methods: - name: session_duration_minutes arg_type: Optional[int] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str user_id: str @@ -57,7 +57,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str user_id: str diff --git a/codegen/specs/stytch/crypto_wallet.yml b/codegen/specs/stytch/crypto_wallet.yml index 7d9482c4..793ed705 100644 --- a/codegen/specs/stytch/crypto_wallet.yml +++ b/codegen/specs/stytch/crypto_wallet.yml @@ -34,7 +34,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str user_id: str diff --git a/codegen/specs/stytch/magic.yml b/codegen/specs/stytch/magic.yml index 5624feca..45aebdde 100644 --- a/codegen/specs/stytch/magic.yml +++ b/codegen/specs/stytch/magic.yml @@ -91,7 +91,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: code_verifier arg_type: Optional[str] = None response_type: @@ -120,7 +120,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: code_verifier arg_type: Optional[str] = None response_type: diff --git a/codegen/specs/stytch/oauth.yml b/codegen/specs/stytch/oauth.yml index f412368c..e72b6aaa 100644 --- a/codegen/specs/stytch/oauth.yml +++ b/codegen/specs/stytch/oauth.yml @@ -62,7 +62,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str user_id: str @@ -128,7 +128,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: name arg_type: null - name: nonce @@ -536,7 +536,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: code_verifier arg_type: Optional[str] = None response_type: diff --git a/codegen/specs/stytch/otp.yml b/codegen/specs/stytch/otp.yml index 25cdd93d..20b54745 100644 --- a/codegen/specs/stytch/otp.yml +++ b/codegen/specs/stytch/otp.yml @@ -148,7 +148,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str user_id: str diff --git a/codegen/specs/stytch/password.yml b/codegen/specs/stytch/password.yml index e8c67ddf..c4e02fce 100644 --- a/codegen/specs/stytch/password.yml +++ b/codegen/specs/stytch/password.yml @@ -9,11 +9,11 @@ methods: - name: session_duration_minutes arg_type: Optional[int] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: trusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: untrusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: name arg_type: null response_type: @@ -39,7 +39,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str user_id: str @@ -104,7 +104,7 @@ methods: - name: code_verifier arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: attributes arg_type: Optional[Dict[str, str]] = None - name: options @@ -133,7 +133,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str user_id: str @@ -179,9 +179,9 @@ methods: - name: last_name arg_type: str - name: trusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: untrusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: set_email_verified arg_type: bool response_type: diff --git a/codegen/specs/stytch/session.yml b/codegen/specs/stytch/session.yml index b0b61af7..ddb1fdb0 100644 --- a/codegen/specs/stytch/session.yml +++ b/codegen/specs/stytch/session.yml @@ -18,7 +18,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str session: Optional[StytchSession] diff --git a/codegen/specs/stytch/totp.yml b/codegen/specs/stytch/totp.yml index 2f74a82d..29308dfe 100644 --- a/codegen/specs/stytch/totp.yml +++ b/codegen/specs/stytch/totp.yml @@ -29,7 +29,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str user_id: str @@ -63,7 +63,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str totp_id: str diff --git a/codegen/specs/stytch/user.yml b/codegen/specs/stytch/user.yml index 375f72cf..01b0d808 100644 --- a/codegen/specs/stytch/user.yml +++ b/codegen/specs/stytch/user.yml @@ -13,9 +13,9 @@ methods: - name: create_user_as_pending arg_type: bool - name: trusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: untrusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str user_id: str @@ -58,8 +58,8 @@ methods: crypto_wallets: null password: null biometric_registrations: null - trusted_metadata: Optional[Dict[str, str]] = None - untrusted_metadata: Optional[Dict[str, str]] = None + trusted_metadata: Optional[Dict[str, Any]] = None + untrusted_metadata: Optional[Dict[str, Any]] = None project_id: str method: get api_path: /v1/users/{user_id} @@ -95,9 +95,9 @@ methods: - name: crypto_wallets arg_type: null - name: trusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: untrusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str user_id: str diff --git a/codegen/specs/stytch/webauthn.yml b/codegen/specs/stytch/webauthn.yml index 6dd4cf13..41de7e20 100644 --- a/codegen/specs/stytch/webauthn.yml +++ b/codegen/specs/stytch/webauthn.yml @@ -51,7 +51,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str user_id: str diff --git a/codegen/specs/stytch_b2b/discovery.yml b/codegen/specs/stytch_b2b/discovery.yml index e09b5313..1eb8bf58 100644 --- a/codegen/specs/stytch_b2b/discovery.yml +++ b/codegen/specs/stytch_b2b/discovery.yml @@ -23,7 +23,7 @@ methods: - name: session_duration_minutes arg_type: Optional[int] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str member_id: str @@ -41,7 +41,7 @@ methods: - name: session_duration_minutes arg_type: Optional[int] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: organization_name arg_type: str - name: organization_slug @@ -49,7 +49,7 @@ methods: - name: organization_logo_url arg_type: str - name: trusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: sso_jit_provisioning arg_type: Optional[str] = None - name: email_allowed_domains diff --git a/codegen/specs/stytch_b2b/multitenant_magic.yml b/codegen/specs/stytch_b2b/multitenant_magic.yml index b7942b41..67a2e88f 100644 --- a/codegen/specs/stytch_b2b/multitenant_magic.yml +++ b/codegen/specs/stytch_b2b/multitenant_magic.yml @@ -39,9 +39,9 @@ methods: - name: name arg_type: Optional[str] = None - name: trusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: untrusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: invite_template_id arg_type: Optional[str] = None - name: locale @@ -66,7 +66,7 @@ methods: - name: session_duration_minutes arg_type: Optional[int] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str member_id: str diff --git a/codegen/specs/stytch_b2b/multitenant_password.yml b/codegen/specs/stytch_b2b/multitenant_password.yml index 18f2e29a..f078aee0 100644 --- a/codegen/specs/stytch_b2b/multitenant_password.yml +++ b/codegen/specs/stytch_b2b/multitenant_password.yml @@ -38,9 +38,9 @@ methods: - name: name arg_type: str - name: trusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: untrusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str member_id: str @@ -64,7 +64,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str member_id: str @@ -115,7 +115,7 @@ methods: - name: code_verifier arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str member_id: str @@ -161,7 +161,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: organization_id arg_type: str response_type: diff --git a/codegen/specs/stytch_b2b/multitenant_session.yml b/codegen/specs/stytch_b2b/multitenant_session.yml index 0e910033..97d0569a 100644 --- a/codegen/specs/stytch_b2b/multitenant_session.yml +++ b/codegen/specs/stytch_b2b/multitenant_session.yml @@ -20,7 +20,7 @@ methods: - name: session_jwt arg_type: Optional[str] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str member_session: null @@ -55,7 +55,7 @@ methods: - name: session_duration_minutes arg_type: Optional[int] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str member_id: str diff --git a/codegen/specs/stytch_b2b/organization.yml b/codegen/specs/stytch_b2b/organization.yml index 1100d4c7..da32f26b 100644 --- a/codegen/specs/stytch_b2b/organization.yml +++ b/codegen/specs/stytch_b2b/organization.yml @@ -9,7 +9,7 @@ methods: - name: organization_logo_url arg_type: str - name: trusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: sso_jit_provisioning arg_type: Optional[str] = None - name: email_allowed_domains @@ -47,7 +47,7 @@ methods: - name: organization_logo_url arg_type: Optional[str] = None - name: trusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: sso_default_connection_id arg_type: Optional[str] = None - name: sso_jit_provisioning @@ -87,9 +87,9 @@ methods: - name: name arg_type: Optional[str] = None - name: trusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: untrusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: create_member_as_pending arg_type: bool - name: is_breakglass @@ -110,9 +110,9 @@ methods: - name: name arg_type: Optional[str] = None - name: trusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: untrusted_metadata - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: is_breakglass arg_type: Optional[bool] = None response_type: diff --git a/codegen/specs/stytch_b2b/sso.yml b/codegen/specs/stytch_b2b/sso.yml index ae9c9e1a..5f5282ee 100644 --- a/codegen/specs/stytch_b2b/sso.yml +++ b/codegen/specs/stytch_b2b/sso.yml @@ -61,7 +61,7 @@ methods: - name: display_name arg_type: str - name: attribute_mapping - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None - name: x509_certificate arg_type: str - name: idp_sso_url @@ -129,7 +129,7 @@ methods: - name: session_duration_minutes arg_type: Optional[int] = None - name: session_custom_claims - arg_type: Optional[Dict[str, str]] = None + arg_type: Optional[Dict[str, Any]] = None response_type: request_id: str member_id: str diff --git a/stytch/api/biometric_service.py b/stytch/api/biometric_service.py index 541826d3..39a82dd1 100644 --- a/stytch/api/biometric_service.py +++ b/stytch/api/biometric_service.py @@ -72,7 +72,7 @@ def BiometricsRegister( biometric_registration_id: str, signature: str, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> BiometricsregisterResponse: payload: Dict[str, Any] = { "biometric_registration_id": biometric_registration_id, @@ -94,7 +94,7 @@ async def BiometricsRegister_async( biometric_registration_id: str, signature: str, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> BiometricsregisterResponse: payload: Dict[str, Any] = { "biometric_registration_id": biometric_registration_id, @@ -152,7 +152,7 @@ def BiometricsAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> BiometricsauthenticateResponse: payload: Dict[str, Any] = { "biometric_registration_id": biometric_registration_id, @@ -184,7 +184,7 @@ async def BiometricsAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> BiometricsauthenticateResponse: payload: Dict[str, Any] = { "biometric_registration_id": biometric_registration_id, diff --git a/stytch/api/crypto_wallet_service.py b/stytch/api/crypto_wallet_service.py index 759bc1b1..655e3047 100644 --- a/stytch/api/crypto_wallet_service.py +++ b/stytch/api/crypto_wallet_service.py @@ -95,7 +95,7 @@ def CryptoWalletsAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> CryptowalletsauthenticateResponse: payload: Dict[str, Any] = { "crypto_wallet_type": crypto_wallet_type, @@ -129,7 +129,7 @@ async def CryptoWalletsAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> CryptowalletsauthenticateResponse: payload: Dict[str, Any] = { "crypto_wallet_type": crypto_wallet_type, diff --git a/stytch/api/magic_service.py b/stytch/api/magic_service.py index 808bb214..d4aa6bf2 100644 --- a/stytch/api/magic_service.py +++ b/stytch/api/magic_service.py @@ -265,7 +265,7 @@ def AuthenticateMagic( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, code_verifier: Optional[str] = None, ) -> AuthenticatemagicResponse: @@ -301,7 +301,7 @@ async def AuthenticateMagic_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, code_verifier: Optional[str] = None, ) -> AuthenticatemagicResponse: @@ -337,7 +337,7 @@ def MagicLinksAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, code_verifier: Optional[str] = None, ) -> MagiclinksauthenticateResponse: @@ -373,7 +373,7 @@ async def MagicLinksAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, code_verifier: Optional[str] = None, ) -> MagiclinksauthenticateResponse: diff --git a/stytch/api/o_auth_service.py b/stytch/api/o_auth_service.py index 2da09d27..d8799da7 100644 --- a/stytch/api/o_auth_service.py +++ b/stytch/api/o_auth_service.py @@ -207,7 +207,7 @@ def OAuthGoogleIDTokenAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> OauthgoogleidtokenauthenticateResponse: payload: Dict[str, Any] = { @@ -234,7 +234,7 @@ async def OAuthGoogleIDTokenAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> OauthgoogleidtokenauthenticateResponse: payload: Dict[str, Any] = { @@ -377,7 +377,7 @@ def OAuthAppleIDTokenAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, name: None, nonce: str, ) -> OauthappleidtokenauthenticateResponse: @@ -409,7 +409,7 @@ async def OAuthAppleIDTokenAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, name: None, nonce: str, ) -> OauthappleidtokenauthenticateResponse: @@ -1486,7 +1486,7 @@ def OAuthAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, code_verifier: Optional[str] = None, ) -> OauthauthenticateResponse: @@ -1519,7 +1519,7 @@ async def OAuthAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, code_verifier: Optional[str] = None, ) -> OauthauthenticateResponse: diff --git a/stytch/api/otp_service.py b/stytch/api/otp_service.py index 04fc30b9..6e31c4ab 100644 --- a/stytch/api/otp_service.py +++ b/stytch/api/otp_service.py @@ -417,7 +417,7 @@ def OTPsAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> OtpsauthenticateResponse: payload: Dict[str, Any] = { @@ -452,7 +452,7 @@ async def OTPsAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> OtpsauthenticateResponse: payload: Dict[str, Any] = { diff --git a/stytch/api/password_service.py b/stytch/api/password_service.py index 8005574b..de457341 100644 --- a/stytch/api/password_service.py +++ b/stytch/api/password_service.py @@ -42,9 +42,9 @@ def PasswordsCreate( email: str, password: str, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, name: None, ) -> PasswordscreateResponse: @@ -74,9 +74,9 @@ async def PasswordsCreate_async( email: str, password: str, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, name: None, ) -> PasswordscreateResponse: @@ -108,7 +108,7 @@ def PasswordsAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> PasswordsauthenticateResponse: payload: Dict[str, Any] = { @@ -137,7 +137,7 @@ async def PasswordsAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> PasswordsauthenticateResponse: payload: Dict[str, Any] = { @@ -271,7 +271,7 @@ def PasswordsEmailReset( session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, code_verifier: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, attributes: Optional[Dict[str, str]] = None, options: Optional[Dict[str, str]] = None, ) -> PasswordsemailresetResponse: @@ -309,7 +309,7 @@ async def PasswordsEmailReset_async( session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, code_verifier: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, attributes: Optional[Dict[str, str]] = None, options: Optional[Dict[str, str]] = None, ) -> PasswordsemailresetResponse: @@ -347,7 +347,7 @@ def PasswordsExistingPasswordReset( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> PasswordsexistingpasswordresetResponse: payload: Dict[str, Any] = { @@ -378,7 +378,7 @@ async def PasswordsExistingPasswordReset_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> PasswordsexistingpasswordresetResponse: payload: Dict[str, Any] = { @@ -454,8 +454,8 @@ def PasswordsMigrate( scrypt_config: None, first_name: str, last_name: str, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, set_email_verified: bool, ) -> PasswordsmigrateResponse: @@ -497,8 +497,8 @@ async def PasswordsMigrate_async( scrypt_config: None, first_name: str, last_name: str, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, set_email_verified: bool, ) -> PasswordsmigrateResponse: diff --git a/stytch/api/session_service.py b/stytch/api/session_service.py index 80da8358..b69c25ab 100644 --- a/stytch/api/session_service.py +++ b/stytch/api/session_service.py @@ -63,7 +63,7 @@ def SessionsAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> SessionsauthenticateResponse: payload: Dict[str, Any] = {} @@ -90,7 +90,7 @@ async def SessionsAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> SessionsauthenticateResponse: payload: Dict[str, Any] = {} diff --git a/stytch/api/totp_service.py b/stytch/api/totp_service.py index a4e863ed..c1038f9c 100644 --- a/stytch/api/totp_service.py +++ b/stytch/api/totp_service.py @@ -72,7 +72,7 @@ def TOTPsAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> TotpsauthenticateResponse: payload: Dict[str, Any] = { "user_id": user_id, @@ -100,7 +100,7 @@ async def TOTPsAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> TotpsauthenticateResponse: payload: Dict[str, Any] = { "user_id": user_id, @@ -156,7 +156,7 @@ def TOTPsRecover( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> TotpsrecoverResponse: payload: Dict[str, Any] = { "user_id": user_id, @@ -184,7 +184,7 @@ async def TOTPsRecover_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> TotpsrecoverResponse: payload: Dict[str, Any] = { "user_id": user_id, diff --git a/stytch/api/user_service.py b/stytch/api/user_service.py index e39c61dd..e20f7559 100644 --- a/stytch/api/user_service.py +++ b/stytch/api/user_service.py @@ -51,8 +51,8 @@ def CreateUser( attributes: Optional[Dict[str, str]] = None, phone_number: Optional[str] = None, create_user_as_pending: bool, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, ) -> CreateuserResponse: payload: Dict[str, Any] = { @@ -84,8 +84,8 @@ async def CreateUser_async( attributes: Optional[Dict[str, str]] = None, phone_number: Optional[str] = None, create_user_as_pending: bool, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, ) -> CreateuserResponse: payload: Dict[str, Any] = { @@ -234,8 +234,8 @@ def UpdateUser( attributes: Optional[Dict[str, str]] = None, phone_numbers: None, crypto_wallets: None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, ) -> UpdateuserResponse: payload: Dict[str, Any] = { @@ -270,8 +270,8 @@ async def UpdateUser_async( attributes: Optional[Dict[str, str]] = None, phone_numbers: None, crypto_wallets: None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, ) -> UpdateuserResponse: payload: Dict[str, Any] = { diff --git a/stytch/api/web_authn_service.py b/stytch/api/web_authn_service.py index 8ca0ea9a..818f0b6c 100644 --- a/stytch/api/web_authn_service.py +++ b/stytch/api/web_authn_service.py @@ -153,7 +153,7 @@ def WebAuthnAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> WebauthnauthenticateResponse: payload: Dict[str, Any] = { "public_key_credential": public_key_credential, @@ -183,7 +183,7 @@ async def WebAuthnAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> WebauthnauthenticateResponse: payload: Dict[str, Any] = { "public_key_credential": public_key_credential, diff --git a/stytch/b2b/api/discovery_service.py b/stytch/b2b/api/discovery_service.py index 57176cfe..7b5ccdd2 100644 --- a/stytch/b2b/api/discovery_service.py +++ b/stytch/b2b/api/discovery_service.py @@ -81,7 +81,7 @@ def DiscoveryIntermediateSessionExchange( intermediate_session_token: str, organization_id: str, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> DiscoveryintermediatesessionexchangeResponse: payload: Dict[str, Any] = { @@ -104,7 +104,7 @@ async def DiscoveryIntermediateSessionExchange_async( intermediate_session_token: str, organization_id: str, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> DiscoveryintermediatesessionexchangeResponse: payload: Dict[str, Any] = { @@ -126,11 +126,11 @@ def DiscoveryOrganizationCreate( self, intermediate_session_token: str, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, organization_name: str, organization_slug: str, organization_logo_url: str, - trusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, sso_jit_provisioning: Optional[str] = None, email_allowed_domains: List[str], email_jit_provisioning: Optional[str] = None, @@ -172,11 +172,11 @@ async def DiscoveryOrganizationCreate_async( self, intermediate_session_token: str, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, organization_name: str, organization_slug: str, organization_logo_url: str, - trusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, sso_jit_provisioning: Optional[str] = None, email_allowed_domains: List[str], email_jit_provisioning: Optional[str] = None, diff --git a/stytch/b2b/api/multi_tenant_magic_service.py b/stytch/b2b/api/multi_tenant_magic_service.py index 17501173..2288d0c9 100644 --- a/stytch/b2b/api/multi_tenant_magic_service.py +++ b/stytch/b2b/api/multi_tenant_magic_service.py @@ -115,8 +115,8 @@ def MultiTenantMagicLinksEmailInvite( invite_redirect_url: Optional[str] = None, invited_by_member_id: Optional[str] = None, name: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, invite_template_id: Optional[str] = None, locale: Optional[str] = None, ) -> MultitenantmagiclinksemailinviteResponse: @@ -156,8 +156,8 @@ async def MultiTenantMagicLinksEmailInvite_async( invite_redirect_url: Optional[str] = None, invited_by_member_id: Optional[str] = None, name: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, invite_template_id: Optional[str] = None, locale: Optional[str] = None, ) -> MultitenantmagiclinksemailinviteResponse: @@ -197,7 +197,7 @@ def MultiTenantMagicLinksAuthenticate( session_token: Optional[str] = None, session_jwt: Optional[str] = None, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> MultitenantmagiclinksauthenticateResponse: payload: Dict[str, Any] = { "magic_links_token": magic_links_token, @@ -230,7 +230,7 @@ async def MultiTenantMagicLinksAuthenticate_async( session_token: Optional[str] = None, session_jwt: Optional[str] = None, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> MultitenantmagiclinksauthenticateResponse: payload: Dict[str, Any] = { "magic_links_token": magic_links_token, diff --git a/stytch/b2b/api/multi_tenant_password_service.py b/stytch/b2b/api/multi_tenant_password_service.py index b62b67d6..f05583ce 100644 --- a/stytch/b2b/api/multi_tenant_password_service.py +++ b/stytch/b2b/api/multi_tenant_password_service.py @@ -83,8 +83,8 @@ def MultiTenantPasswordMigrate( scrypt_config: None, organization_id: str, name: str, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, ) -> MultitenantpasswordmigrateResponse: payload: Dict[str, Any] = { @@ -124,8 +124,8 @@ async def MultiTenantPasswordMigrate_async( scrypt_config: None, organization_id: str, name: str, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, ) -> MultitenantpasswordmigrateResponse: payload: Dict[str, Any] = { @@ -162,7 +162,7 @@ def MultiTenantPasswordAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> MultitenantpasswordauthenticateResponse: payload: Dict[str, Any] = { @@ -193,7 +193,7 @@ async def MultiTenantPasswordAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> MultitenantpasswordauthenticateResponse: payload: Dict[str, Any] = { @@ -290,7 +290,7 @@ def MultiTenantPasswordEmailReset( session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, code_verifier: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> MultitenantpasswordemailresetResponse: payload: Dict[str, Any] = { @@ -322,7 +322,7 @@ async def MultiTenantPasswordEmailReset_async( session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, code_verifier: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> MultitenantpasswordemailresetResponse: payload: Dict[str, Any] = { @@ -400,7 +400,7 @@ def MultiTenantPasswordExistingPasswordReset( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, organization_id: str, ) -> MultitenantpasswordexistingpasswordresetResponse: @@ -433,7 +433,7 @@ async def MultiTenantPasswordExistingPasswordReset_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, organization_id: str, ) -> MultitenantpasswordexistingpasswordresetResponse: diff --git a/stytch/b2b/api/multi_tenant_session_service.py b/stytch/b2b/api/multi_tenant_session_service.py index 014335d4..7a8d5d7b 100644 --- a/stytch/b2b/api/multi_tenant_session_service.py +++ b/stytch/b2b/api/multi_tenant_session_service.py @@ -68,7 +68,7 @@ def MultiTenantSessionsAuthenticate( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> MultitenantsessionsauthenticateResponse: payload: Dict[str, Any] = {} @@ -95,7 +95,7 @@ async def MultiTenantSessionsAuthenticate_async( session_token: Optional[str] = None, session_duration_minutes: Optional[int] = None, session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> MultitenantsessionsauthenticateResponse: payload: Dict[str, Any] = {} @@ -173,7 +173,7 @@ def MultiTenantSessionsExchange( session_token: Optional[str] = None, session_jwt: Optional[str] = None, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> MultitenantsessionsexchangeResponse: payload: Dict[str, Any] = { "organization_id": organization_id, @@ -203,7 +203,7 @@ async def MultiTenantSessionsExchange_async( session_token: Optional[str] = None, session_jwt: Optional[str] = None, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> MultitenantsessionsexchangeResponse: payload: Dict[str, Any] = { "organization_id": organization_id, diff --git a/stytch/b2b/api/organization_service.py b/stytch/b2b/api/organization_service.py index d4510086..197fa2dc 100644 --- a/stytch/b2b/api/organization_service.py +++ b/stytch/b2b/api/organization_service.py @@ -45,7 +45,7 @@ def OrganizationsCreate( organization_name: str, organization_slug: str, organization_logo_url: str, - trusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, sso_jit_provisioning: Optional[str] = None, email_allowed_domains: List[str], email_jit_provisioning: Optional[str] = None, @@ -83,7 +83,7 @@ async def OrganizationsCreate_async( organization_name: str, organization_slug: str, organization_logo_url: str, - trusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, sso_jit_provisioning: Optional[str] = None, email_allowed_domains: List[str], email_jit_provisioning: Optional[str] = None, @@ -152,7 +152,7 @@ def OrganizationsUpdate( organization_name: Optional[str] = None, organization_slug: Optional[str] = None, organization_logo_url: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, sso_default_connection_id: Optional[str] = None, sso_jit_provisioning: Optional[str] = None, sso_jit_provisioning_allowed_connections: Optional[List[str]] = None, @@ -203,7 +203,7 @@ async def OrganizationsUpdate_async( organization_name: Optional[str] = None, organization_slug: Optional[str] = None, organization_logo_url: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, sso_default_connection_id: Optional[str] = None, sso_jit_provisioning: Optional[str] = None, sso_jit_provisioning_allowed_connections: Optional[List[str]] = None, @@ -275,8 +275,8 @@ def OrganizationsMemberCreate( organization_id: str, email_address: str, name: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, create_member_as_pending: bool, is_breakglass: bool, ) -> OrganizationsmembercreateResponse: @@ -305,8 +305,8 @@ async def OrganizationsMemberCreate_async( organization_id: str, email_address: str, name: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, create_member_as_pending: bool, is_breakglass: bool, ) -> OrganizationsmembercreateResponse: @@ -335,8 +335,8 @@ def OrganizationsMemberUpdate( organization_id: str, member_id: str, name: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, is_breakglass: Optional[bool] = None, ) -> OrganizationsmemberupdateResponse: @@ -364,8 +364,8 @@ async def OrganizationsMemberUpdate_async( organization_id: str, member_id: str, name: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, + trusted_metadata: Optional[Dict[str, Any]] = None, + untrusted_metadata: Optional[Dict[str, Any]] = None, is_breakglass: Optional[bool] = None, ) -> OrganizationsmemberupdateResponse: diff --git a/stytch/b2b/api/sso_service.py b/stytch/b2b/api/sso_service.py index 26e6304b..45113def 100644 --- a/stytch/b2b/api/sso_service.py +++ b/stytch/b2b/api/sso_service.py @@ -179,7 +179,7 @@ def UpdateSAMLConnection( connection_id: str, idp_entity_id: str, display_name: str, - attribute_mapping: Optional[Dict[str, str]] = None, + attribute_mapping: Optional[Dict[str, Any]] = None, x509_certificate: str, idp_sso_url: str, None: None, @@ -210,7 +210,7 @@ async def UpdateSAMLConnection_async( connection_id: str, idp_entity_id: str, display_name: str, - attribute_mapping: Optional[Dict[str, str]] = None, + attribute_mapping: Optional[Dict[str, Any]] = None, x509_certificate: str, idp_sso_url: str, None: None, @@ -366,7 +366,7 @@ def SSOAuthenticate( session_token: Optional[str] = None, session_jwt: Optional[str] = None, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> SsoauthenticateResponse: payload: Dict[str, Any] = { @@ -396,7 +396,7 @@ async def SSOAuthenticate_async( session_token: Optional[str] = None, session_jwt: Optional[str] = None, session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, ) -> SsoauthenticateResponse: payload: Dict[str, Any] = { diff --git a/stytch/models/user_service.py b/stytch/models/user_service.py index 5085c1e8..01d1505c 100644 --- a/stytch/models/user_service.py +++ b/stytch/models/user_service.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -from typing import Dict, Optional +from typing import Any, Dict, Optional from stytch.core.models import ResponseBase, User @@ -37,8 +37,8 @@ class GetuserResponse(ResponseBase): crypto_wallets: None password: None biometric_registrations: None - trusted_metadata: Optional[Dict[str, str]] = None - untrusted_metadata: Optional[Dict[str, str]] = None + trusted_metadata: Optional[Dict[str, Any]] = None + untrusted_metadata: Optional[Dict[str, Any]] = None project_id: str From b55940907cf51bc06a890f18fb7d5aaae94322c0 Mon Sep 17 00:00:00 2001 From: Joshua Hight Date: Tue, 18 Apr 2023 14:20:27 -0700 Subject: [PATCH 7/7] handle files with multiple verticals --- awesomeness.sh | 63 +- codegen/specs/stytch/biometric.yml | 70 - codegen/specs/stytch/debug.yml | 2 +- codegen/specs/stytch/magic.yml | 28 +- codegen/specs/stytch/oauth.yml | 508 ------ codegen/specs/stytch/password.yml | 32 +- codegen/specs/stytch/session.yml | 9 - codegen/specs/stytch_b2b/debug.yml | 2 +- codegen/specs/stytch_b2b/magic.yml | 29 + codegen/specs/stytch_b2b/password.yml | 18 + codegen/specs/stytch_b2b/session.yml | 11 + stytch/api/discovery_service.py | 199 +-- stytch/api/magic_service.py | 84 +- stytch/api/multi_tenant_password_service.py | 443 +---- stytch/api/multi_tenant_session_service.py | 203 --- stytch/api/o_auth_service.py | 1450 +---------------- stytch/api/organization_service.py | 547 +------ stytch/api/password_service.py | 72 +- stytch/api/session_service.py | 33 - stytch/api/sso_service.py | 430 +---- stytch/b2b/api/magic_service.py | 106 ++ stytch/b2b/api/password_service.py | 67 + stytch/b2b/api/session_service.py | 59 + stytch/b2b/models/magic_service.py | 15 + stytch/b2b/models/password_service.py | 14 + stytch/b2b/models/session_service.py | 10 + stytch/models/discovery_service.py | 29 - stytch/models/magic_service.py | 12 +- .../models/multi_tenant_password_service.py | 69 - stytch/models/multi_tenant_session_service.py | 31 - stytch/models/o_auth_service.py | 181 +- stytch/models/organization_service.py | 70 - stytch/models/password_service.py | 20 +- stytch/models/session_service.py | 5 - stytch/models/sso_service.py | 63 - 35 files changed, 528 insertions(+), 4456 deletions(-) delete mode 100644 codegen/specs/stytch/biometric.yml create mode 100644 codegen/specs/stytch_b2b/magic.yml create mode 100644 codegen/specs/stytch_b2b/password.yml create mode 100644 codegen/specs/stytch_b2b/session.yml create mode 100644 stytch/b2b/api/magic_service.py create mode 100644 stytch/b2b/api/password_service.py create mode 100644 stytch/b2b/api/session_service.py create mode 100644 stytch/b2b/models/magic_service.py create mode 100644 stytch/b2b/models/password_service.py create mode 100644 stytch/b2b/models/session_service.py diff --git a/awesomeness.sh b/awesomeness.sh index 82e0a535..1e41edee 100755 --- a/awesomeness.sh +++ b/awesomeness.sh @@ -7,36 +7,47 @@ find codegen/specs/stytch_b2b -name "*.yml" -delete find ../protobuf/api -name "*.yml.python" | while read line do - vertical=`tail -n 1 $line` - - echo "vertical for $line is $vertical" - - # once we have the vertical we go ahead and remove it from the file so it won't - # break anything - cat $line | awk 'BEGIN {buffer=""} // {if (buffer != "") {print buffer}; buffer=$0}' > ${line}.tmp - rm $line - mv ${line}.tmp $line consumerFile=`echo $line | sed 's|.*/\([^.]*\).yml.python$|codegen/specs/stytch/\1.yml|'` b2bFile=`echo $line | sed 's|.*/\([^.]*\).yml.python$|codegen/specs/stytch_b2b/\1.yml|'` - # I know the single `=` is scary, but I promise it's not an assignment in bash - # and is in fact what we want to do here. What we want is to copy consumer files - # into the regular dir, copy the b2b files into the b2b dir, and "ALL" vertical - # files into both - if [[ "$vertical" = "CONSUMER" ]] - then - echo "hit consumer branch, copying $line to $consumerFile" - cp $line $consumerFile - elif [[ "$vertical" = "B2B" ]] - then - echo "hit b2b branch, copying $line to $b2bFile" - cp $line $b2bFile - else - echo "hit all branch, copying $line to $b2bFile and $consumerFile" - cp $line $consumerFile - cp $line $b2bFile - fi + # filter for the appropriate methods then put them in the appropriate spec folder + cat $line | yq -y '.methods=[.methods[] | + select(.vertical == "CONSUMER") | + select(.include_in_backend_sdk_codegen == true) | + del(.vertical) | + del(.include_in_backend_sdk_codegen)]' | + sed 's/methods: \[\]/methods: /' > $consumerFile + + cat $line | yq -y '.methods=[.methods[] | + select(.vertical == "B2B") | + select(.include_in_backend_sdk_codegen == true) | + del(.vertical) | + del(.include_in_backend_sdk_codegen)]' | + sed 's/methods: \[\]/methods: /' > $b2bFile + + # then we have to tack the ALL vertical methods onto both files + cat $line | yq -y '[.methods[] | + select(.vertical == "ALL") | + select(.include_in_backend_sdk_codegen == true) | + del(.vertical) | + del(.include_in_backend_sdk_codegen)]' | + sed 's/^/ /' | + grep -v "^ *\[\] *$" >> $consumerFile + + cat $line | yq -y '[.methods[] | + select(.vertical == "ALL") | + select(.include_in_backend_sdk_codegen == true) | + del(.vertical) | + del(.include_in_backend_sdk_codegen)]' | + sed 's/^/ /' | + grep -v "^ *\[\] *$" >> $b2bFile + + done +# delete any files that are only 2 lines because they're just a classname and +# a null methods entry +find . -name "*.yml" | xargs wc -l | awk '/^ *2 / {print $2}' | xargs rm + ./bin/generate-api.sh diff --git a/codegen/specs/stytch/biometric.yml b/codegen/specs/stytch/biometric.yml deleted file mode 100644 index 690f5910..00000000 --- a/codegen/specs/stytch/biometric.yml +++ /dev/null @@ -1,70 +0,0 @@ -classname: BiometricService -methods: - - name: BiometricsRegisterStart - args: - - name: user_id - arg_type: str - - name: public_key - arg_type: str - response_type: - request_id: str - user_id: str - biometric_registration_id: str - challenge: str - method: post - api_path: /v1/biometrics/register/start - - name: BiometricsRegister - args: - - name: biometric_registration_id - arg_type: str - - name: signature - arg_type: str - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - response_type: - request_id: str - user_id: str - biometric_registration_id: str - user: User - session_token: str - session: Optional[StytchSession] - session_jwt: str - method: post - api_path: /v1/biometrics/register - - name: BiometricsAuthenticateStart - args: - - name: public_key - arg_type: str - response_type: - request_id: str - user_id: str - biometric_registration_id: str - challenge: str - method: post - api_path: /v1/biometrics/authenticate/start - - name: BiometricsAuthenticate - args: - - name: biometric_registration_id - arg_type: str - - name: signature - arg_type: str - - name: session_token - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - response_type: - request_id: str - user_id: str - biometric_registration_id: str - session_token: str - session: Optional[StytchSession] - session_jwt: str - user: User - method: post - api_path: /v1/biometrics/authenticate diff --git a/codegen/specs/stytch/debug.yml b/codegen/specs/stytch/debug.yml index 27ca8dc8..92d967f0 100644 --- a/codegen/specs/stytch/debug.yml +++ b/codegen/specs/stytch/debug.yml @@ -1,5 +1,5 @@ classname: DebugService -methods: +methods: - name: WhoAmI args: [] response_type: diff --git a/codegen/specs/stytch/magic.yml b/codegen/specs/stytch/magic.yml index 45aebdde..48c9c852 100644 --- a/codegen/specs/stytch/magic.yml +++ b/codegen/specs/stytch/magic.yml @@ -237,6 +237,20 @@ methods: request_id: str method: post api_path: /v1/magic_links/email/revoke_invite + - name: MagicLinksCreate + args: + - name: user_id + arg_type: str + - name: expiration_minutes + arg_type: Optional[int] = None + - name: attributes + arg_type: Optional[Dict[str, str]] = None + response_type: + request_id: str + user_id: str + token: str + method: post + api_path: /v1/magic_links - name: MagicLinkRedirect args: - name: public_token @@ -264,17 +278,3 @@ methods: redirect_url: str method: post api_path: /v1/magic_links/redirect/captcha - - name: MagicLinksCreate - args: - - name: user_id - arg_type: str - - name: expiration_minutes - arg_type: Optional[int] = None - - name: attributes - arg_type: Optional[Dict[str, str]] = None - response_type: - request_id: str - user_id: str - token: str - method: post - api_path: /v1/magic_links diff --git a/codegen/specs/stytch/oauth.yml b/codegen/specs/stytch/oauth.yml index e72b6aaa..347d3253 100644 --- a/codegen/specs/stytch/oauth.yml +++ b/codegen/specs/stytch/oauth.yml @@ -15,514 +15,6 @@ methods: oauth_attach_token: str method: post api_path: /v1/oauth/attach - - name: OAuthGoogleOneTapStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - response_type: - request_id: str - google_client_id: str - stytch_csrf_token: str - oauth_callback_id: str - method: get - api_path: /v1/public/oauth/google/onetap/start - - name: OAuthGoogleStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/google/start - - name: OAuthGoogleIDTokenAuthenticate - args: - - name: id_token - arg_type: str - - name: session_token - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - response_type: - request_id: str - user_id: str - provider_subject: str - session: Optional[StytchSession] - session_token: str - session_jwt: str - user: User - reset_sessions: bool - user_created: bool - method: post - api_path: /v1/oauth/google/id_token/authenticate - - name: OAuthMicrosoftStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/microsoft/start - - name: OAuthAppleStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/apple/start - - name: OAuthAppleIDTokenAuthenticate - args: - - name: id_token - arg_type: str - - name: session_token - arg_type: Optional[str] = None - - name: session_duration_minutes - arg_type: Optional[int] = None - - name: session_jwt - arg_type: Optional[str] = None - - name: session_custom_claims - arg_type: Optional[Dict[str, Any]] = None - - name: name - arg_type: null - - name: nonce - arg_type: str - response_type: - request_id: str - user_id: str - provider_subject: str - session: Optional[StytchSession] - session_token: str - session_jwt: str - user: User - reset_sessions: bool - user_created: bool - method: post - api_path: /v1/oauth/apple/id_token/authenticate - - name: OAuthGithubStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/github/start - - name: OAuthFacebookStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/facebook/start - - name: OAuthAmazonStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/amazon/start - - name: OAuthBitbucketStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/bitbucket/start - - name: OAuthCoinbaseStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/coinbase/start - - name: OAuthDiscordStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/discord/start - - name: OAuthFigmaStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/figma/start - - name: OAuthGitLabStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/gitlab/start - - name: OAuthInstagramStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/instagram/start - - name: OAuthLinkedInStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/linkedin/start - - name: OAuthShopifyStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/shopify/start - - name: OAuthSlackStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/slack/start - - name: OAuthSnapchatStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/snapchat/start - - name: OAuthSpotifyStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/spotify/start - - name: OAuthSteamStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/steam/start - - name: OAuthTikTokStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/tiktok/start - - name: OAuthTwitchStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/twitch/start - - name: OAuthTwitterStart - args: - - name: public_token - arg_type: str - - name: login_redirect_url - arg_type: Optional[str] = None - - name: signup_redirect_url - arg_type: Optional[str] = None - - name: custom_scopes - arg_type: str - - name: code_challenge - arg_type: Optional[str] = None - - name: oauth_attach_token - arg_type: Optional[str] = None - response_type: - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - method: get - api_path: /v1/public/oauth/twitter/start - name: OAuthAuthenticate args: - name: token diff --git a/codegen/specs/stytch/password.yml b/codegen/specs/stytch/password.yml index c4e02fce..08774280 100644 --- a/codegen/specs/stytch/password.yml +++ b/codegen/specs/stytch/password.yml @@ -49,22 +49,6 @@ methods: user: User method: post api_path: /v1/passwords/authenticate - - name: PasswordsStrengthCheck - args: - - name: password - arg_type: str - - name: email - arg_type: Optional[str] = None - response_type: - request_id: str - valid_password: bool - score: null - breached_password: bool - feedback: null - strength_policy: str - breach_detection_on_create: bool - method: post - api_path: /v1/passwords/strength_check - name: PasswordsEmailResetStart args: - name: email @@ -192,3 +176,19 @@ methods: user: User method: post api_path: /v1/passwords/migrate + - name: PasswordsStrengthCheck + args: + - name: password + arg_type: str + - name: email + arg_type: Optional[str] = None + response_type: + request_id: str + valid_password: bool + score: null + breached_password: bool + feedback: null + strength_policy: str + breach_detection_on_create: bool + method: post + api_path: /v1/passwords/strength_check diff --git a/codegen/specs/stytch/session.yml b/codegen/specs/stytch/session.yml index ddb1fdb0..4b896165 100644 --- a/codegen/specs/stytch/session.yml +++ b/codegen/specs/stytch/session.yml @@ -48,12 +48,3 @@ methods: request_id: str method: get api_path: /v1/sessions/jwks/{project_id} - - name: MultiTenantSessionsJwks - args: - - name: project_id - arg_type: str - response_type: - keys: List[Dict[str, Any]] - request_id: str - method: get - api_path: /v1/b2b/sessions/jwks/{project_id} diff --git a/codegen/specs/stytch_b2b/debug.yml b/codegen/specs/stytch_b2b/debug.yml index 27ca8dc8..92d967f0 100644 --- a/codegen/specs/stytch_b2b/debug.yml +++ b/codegen/specs/stytch_b2b/debug.yml @@ -1,5 +1,5 @@ classname: DebugService -methods: +methods: - name: WhoAmI args: [] response_type: diff --git a/codegen/specs/stytch_b2b/magic.yml b/codegen/specs/stytch_b2b/magic.yml new file mode 100644 index 00000000..e73893bf --- /dev/null +++ b/codegen/specs/stytch_b2b/magic.yml @@ -0,0 +1,29 @@ +classname: MagicService +methods: + - name: MagicLinkRedirect + args: + - name: public_token + arg_type: str + - name: token + arg_type: str + - name: stytch_token_type + arg_type: str + response_type: + request_id: str + redirect_url: str + html_response_data: null + method: get + api_path: /v1/magic_links/redirect + - name: MagicLinksRedirectCaptcha + args: + - name: public_token + arg_type: str + - name: redirect_url + arg_type: str + - name: captcha + arg_type: str + response_type: + request_id: str + redirect_url: str + method: post + api_path: /v1/magic_links/redirect/captcha diff --git a/codegen/specs/stytch_b2b/password.yml b/codegen/specs/stytch_b2b/password.yml new file mode 100644 index 00000000..033ee8dd --- /dev/null +++ b/codegen/specs/stytch_b2b/password.yml @@ -0,0 +1,18 @@ +classname: PasswordService +methods: + - name: PasswordsStrengthCheck + args: + - name: password + arg_type: str + - name: email + arg_type: Optional[str] = None + response_type: + request_id: str + valid_password: bool + score: null + breached_password: bool + feedback: null + strength_policy: str + breach_detection_on_create: bool + method: post + api_path: /v1/passwords/strength_check diff --git a/codegen/specs/stytch_b2b/session.yml b/codegen/specs/stytch_b2b/session.yml new file mode 100644 index 00000000..a7a5b392 --- /dev/null +++ b/codegen/specs/stytch_b2b/session.yml @@ -0,0 +1,11 @@ +classname: SessionService +methods: + - name: MultiTenantSessionsJwks + args: + - name: project_id + arg_type: str + response_type: + keys: List[Dict[str, Any]] + request_id: str + method: get + api_path: /v1/b2b/sessions/jwks/{project_id} diff --git a/stytch/api/discovery_service.py b/stytch/api/discovery_service.py index 46f299b1..a661a618 100644 --- a/stytch/api/discovery_service.py +++ b/stytch/api/discovery_service.py @@ -4,25 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.discovery_service import ( - DiscoveryintermediatesessionexchangeResponse, - DiscoveryorganizationcreateResponse, - DiscoveryorganizationsResponse, -) class DiscoveryService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -31,186 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "discovery_service" - - def DiscoveryOrganizations( - self, - intermediate_session_token: Optional[str] = None, - session_token: Optional[str] = None, - session_jwt: Optional[str] = None, - ) -> DiscoveryorganizationsResponse: - - payload: Dict[str, Any] = { - } - - if intermediate_session_token is not None: - payload["intermediate_session_token"] = intermediate_session_token - if session_token is not None: - payload["session_token"] = session_token - if session_jwt is not None: - payload["session_jwt"] = session_jwt - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations") - - res = self.sync_client.post(url, json=payload) - return DiscoveryorganizationsResponse.from_json(res.response.status_code, res.json) - - async def DiscoveryOrganizations_async( - self, - intermediate_session_token: Optional[str] = None, - session_token: Optional[str] = None, - session_jwt: Optional[str] = None, - ) -> DiscoveryorganizationsResponse: - - payload: Dict[str, Any] = { - } - - if intermediate_session_token is not None: - payload["intermediate_session_token"] = intermediate_session_token - if session_token is not None: - payload["session_token"] = session_token - if session_jwt is not None: - payload["session_jwt"] = session_jwt - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations") - - res = await self.async_client.post(url, json=payload) - return DiscoveryorganizationsResponse.from_json(res.response.status, res.json) - - def DiscoveryIntermediateSessionExchange( - self, - intermediate_session_token: str, - organization_id: str, - session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> DiscoveryintermediatesessionexchangeResponse: - - payload: Dict[str, Any] = { - "intermediate_session_token": intermediate_session_token, - "organization_id": organization_id, - } - - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/intermediate_sessions/exchange") - - res = self.sync_client.post(url, json=payload) - return DiscoveryintermediatesessionexchangeResponse.from_json(res.response.status_code, res.json) - - async def DiscoveryIntermediateSessionExchange_async( - self, - intermediate_session_token: str, - organization_id: str, - session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> DiscoveryintermediatesessionexchangeResponse: - - payload: Dict[str, Any] = { - "intermediate_session_token": intermediate_session_token, - "organization_id": organization_id, - } - - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/intermediate_sessions/exchange") - - res = await self.async_client.post(url, json=payload) - return DiscoveryintermediatesessionexchangeResponse.from_json(res.response.status, res.json) - - def DiscoveryOrganizationCreate( - self, - intermediate_session_token: str, - session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - organization_name: str, - organization_slug: str, - organization_logo_url: str, - trusted_metadata: Optional[Dict[str, str]] = None, - sso_jit_provisioning: Optional[str] = None, - email_allowed_domains: List[str], - email_jit_provisioning: Optional[str] = None, - email_invites: Optional[str] = None, - auth_methods: Optional[str] = None, - allowed_auth_methods: List[str], - ) -> DiscoveryorganizationcreateResponse: - - payload: Dict[str, Any] = { - "intermediate_session_token": intermediate_session_token, - "organization_name": organization_name, - "organization_slug": organization_slug, - "organization_logo_url": organization_logo_url, - "email_allowed_domains": email_allowed_domains, - "allowed_auth_methods": allowed_auth_methods, - } - - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if sso_jit_provisioning is not None: - payload["sso_jit_provisioning"] = sso_jit_provisioning - if email_jit_provisioning is not None: - payload["email_jit_provisioning"] = email_jit_provisioning - if email_invites is not None: - payload["email_invites"] = email_invites - if auth_methods is not None: - payload["auth_methods"] = auth_methods - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations/create") - - res = self.sync_client.post(url, json=payload) - return DiscoveryorganizationcreateResponse.from_json(res.response.status_code, res.json) - - async def DiscoveryOrganizationCreate_async( - self, - intermediate_session_token: str, - session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - organization_name: str, - organization_slug: str, - organization_logo_url: str, - trusted_metadata: Optional[Dict[str, str]] = None, - sso_jit_provisioning: Optional[str] = None, - email_allowed_domains: List[str], - email_jit_provisioning: Optional[str] = None, - email_invites: Optional[str] = None, - auth_methods: Optional[str] = None, - allowed_auth_methods: List[str], - ) -> DiscoveryorganizationcreateResponse: - - payload: Dict[str, Any] = { - "intermediate_session_token": intermediate_session_token, - "organization_name": organization_name, - "organization_slug": organization_slug, - "organization_logo_url": organization_logo_url, - "email_allowed_domains": email_allowed_domains, - "allowed_auth_methods": allowed_auth_methods, - } - - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if sso_jit_provisioning is not None: - payload["sso_jit_provisioning"] = sso_jit_provisioning - if email_jit_provisioning is not None: - payload["email_jit_provisioning"] = email_jit_provisioning - if email_invites is not None: - payload["email_invites"] = email_invites - if auth_methods is not None: - payload["auth_methods"] = auth_methods - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/discovery/organizations/create") - - res = await self.async_client.post(url, json=payload) - return DiscoveryorganizationcreateResponse.from_json(res.response.status, res.json) - diff --git a/stytch/api/magic_service.py b/stytch/api/magic_service.py index d4aa6bf2..a33031b6 100644 --- a/stytch/api/magic_service.py +++ b/stytch/api/magic_service.py @@ -703,6 +703,48 @@ async def MagicLinksEmailRevokeInvite_async( res = await self.async_client.post(url, json=payload) return MagiclinksemailrevokeinviteResponse.from_json(res.response.status, res.json) + def MagicLinksCreate( + self, + user_id: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + ) -> MagiclinkscreateResponse: + + payload: Dict[str, Any] = { + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links") + + res = self.sync_client.post(url, json=payload) + return MagiclinkscreateResponse.from_json(res.response.status_code, res.json) + + async def MagicLinksCreate_async( + self, + user_id: str, + expiration_minutes: Optional[int] = None, + attributes: Optional[Dict[str, str]] = None, + ) -> MagiclinkscreateResponse: + + payload: Dict[str, Any] = { + "user_id": user_id, + } + + if expiration_minutes is not None: + payload["expiration_minutes"] = expiration_minutes + if attributes is not None: + payload["attributes"] = attributes + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links") + + res = await self.async_client.post(url, json=payload) + return MagiclinkscreateResponse.from_json(res.response.status, res.json) + def MagicLinkRedirect( self, public_token: str, @@ -779,45 +821,3 @@ async def MagicLinksRedirectCaptcha_async( res = await self.async_client.post(url, json=payload) return MagiclinksredirectcaptchaResponse.from_json(res.response.status, res.json) - def MagicLinksCreate( - self, - user_id: str, - expiration_minutes: Optional[int] = None, - attributes: Optional[Dict[str, str]] = None, - ) -> MagiclinkscreateResponse: - - payload: Dict[str, Any] = { - "user_id": user_id, - } - - if expiration_minutes is not None: - payload["expiration_minutes"] = expiration_minutes - if attributes is not None: - payload["attributes"] = attributes - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links") - - res = self.sync_client.post(url, json=payload) - return MagiclinkscreateResponse.from_json(res.response.status_code, res.json) - - async def MagicLinksCreate_async( - self, - user_id: str, - expiration_minutes: Optional[int] = None, - attributes: Optional[Dict[str, str]] = None, - ) -> MagiclinkscreateResponse: - - payload: Dict[str, Any] = { - "user_id": user_id, - } - - if expiration_minutes is not None: - payload["expiration_minutes"] = expiration_minutes - if attributes is not None: - payload["attributes"] = attributes - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links") - - res = await self.async_client.post(url, json=payload) - return MagiclinkscreateResponse.from_json(res.response.status, res.json) - diff --git a/stytch/api/multi_tenant_password_service.py b/stytch/api/multi_tenant_password_service.py index 55b634a8..7c95d577 100644 --- a/stytch/api/multi_tenant_password_service.py +++ b/stytch/api/multi_tenant_password_service.py @@ -4,29 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.multi_tenant_password_service import ( - MultitenantpasswordauthenticateResponse, - MultitenantpasswordemailresetResponse, - MultitenantpasswordemailresetstartResponse, - MultitenantpasswordexistingpasswordresetResponse, - MultitenantpasswordmigrateResponse, - MultitenantpasswordsessionresetResponse, - MultitenantpasswordstrengthcheckResponse, -) class MultiTenantPasswordService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -35,426 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "multi_tenant_password_service" - - def MultiTenantPasswordStrengthCheck( - self, - password: str, - email_address: Optional[str] = None, - ) -> MultitenantpasswordstrengthcheckResponse: - - payload: Dict[str, Any] = { - "password": password, - } - - if email_address is not None: - payload["email_address"] = email_address - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/strength_check") - - res = self.sync_client.post(url, json=payload) - return MultitenantpasswordstrengthcheckResponse.from_json(res.response.status_code, res.json) - - async def MultiTenantPasswordStrengthCheck_async( - self, - password: str, - email_address: Optional[str] = None, - ) -> MultitenantpasswordstrengthcheckResponse: - - payload: Dict[str, Any] = { - "password": password, - } - - if email_address is not None: - payload["email_address"] = email_address - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/strength_check") - - res = await self.async_client.post(url, json=payload) - return MultitenantpasswordstrengthcheckResponse.from_json(res.response.status, res.json) - - def MultiTenantPasswordMigrate( - self, - email_address: str, - hash: str, - hash_type: str, - md_5_config: None, - argon_2_config: None, - sha_1_config: None, - scrypt_config: None, - organization_id: str, - name: str, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, - ) -> MultitenantpasswordmigrateResponse: - - payload: Dict[str, Any] = { - "email_address": email_address, - "hash": hash, - "hash_type": hash_type, - "organization_id": organization_id, - "name": name, - } - - if md_5_config is not None: - payload["md_5_config"] = md_5_config - if argon_2_config is not None: - payload["argon_2_config"] = argon_2_config - if sha_1_config is not None: - payload["sha_1_config"] = sha_1_config - if scrypt_config is not None: - payload["scrypt_config"] = scrypt_config - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if untrusted_metadata is not None: - payload["untrusted_metadata"] = untrusted_metadata - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/migrate") - - res = self.sync_client.post(url, json=payload) - return MultitenantpasswordmigrateResponse.from_json(res.response.status_code, res.json) - - async def MultiTenantPasswordMigrate_async( - self, - email_address: str, - hash: str, - hash_type: str, - md_5_config: None, - argon_2_config: None, - sha_1_config: None, - scrypt_config: None, - organization_id: str, - name: str, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, - ) -> MultitenantpasswordmigrateResponse: - - payload: Dict[str, Any] = { - "email_address": email_address, - "hash": hash, - "hash_type": hash_type, - "organization_id": organization_id, - "name": name, - } - - if md_5_config is not None: - payload["md_5_config"] = md_5_config - if argon_2_config is not None: - payload["argon_2_config"] = argon_2_config - if sha_1_config is not None: - payload["sha_1_config"] = sha_1_config - if scrypt_config is not None: - payload["scrypt_config"] = scrypt_config - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if untrusted_metadata is not None: - payload["untrusted_metadata"] = untrusted_metadata - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/migrate") - - res = await self.async_client.post(url, json=payload) - return MultitenantpasswordmigrateResponse.from_json(res.response.status, res.json) - - def MultiTenantPasswordAuthenticate( - self, - organization_id: str, - email_address: str, - password: str, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> MultitenantpasswordauthenticateResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "email_address": email_address, - "password": password, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/authenticate") - - res = self.sync_client.post(url, json=payload) - return MultitenantpasswordauthenticateResponse.from_json(res.response.status_code, res.json) - - async def MultiTenantPasswordAuthenticate_async( - self, - organization_id: str, - email_address: str, - password: str, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> MultitenantpasswordauthenticateResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "email_address": email_address, - "password": password, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/authenticate") - - res = await self.async_client.post(url, json=payload) - return MultitenantpasswordauthenticateResponse.from_json(res.response.status, res.json) - - def MultiTenantPasswordEmailResetStart( - self, - organization_id: str, - email_address: str, - reset_password_redirect_url: str, - reset_password_expiration_minutes: Optional[int] = None, - code_challenge: Optional[str] = None, - login_redirect_url: str, - locale: Optional[str] = None, - reset_password_template_id: Optional[str] = None, - ) -> MultitenantpasswordemailresetstartResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "email_address": email_address, - "reset_password_redirect_url": reset_password_redirect_url, - "login_redirect_url": login_redirect_url, - } - - if reset_password_expiration_minutes is not None: - payload["reset_password_expiration_minutes"] = reset_password_expiration_minutes - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if locale is not None: - payload["locale"] = locale - if reset_password_template_id is not None: - payload["reset_password_template_id"] = reset_password_template_id - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset/start") - - res = self.sync_client.post(url, json=payload) - return MultitenantpasswordemailresetstartResponse.from_json(res.response.status_code, res.json) - - async def MultiTenantPasswordEmailResetStart_async( - self, - organization_id: str, - email_address: str, - reset_password_redirect_url: str, - reset_password_expiration_minutes: Optional[int] = None, - code_challenge: Optional[str] = None, - login_redirect_url: str, - locale: Optional[str] = None, - reset_password_template_id: Optional[str] = None, - ) -> MultitenantpasswordemailresetstartResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "email_address": email_address, - "reset_password_redirect_url": reset_password_redirect_url, - "login_redirect_url": login_redirect_url, - } - - if reset_password_expiration_minutes is not None: - payload["reset_password_expiration_minutes"] = reset_password_expiration_minutes - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if locale is not None: - payload["locale"] = locale - if reset_password_template_id is not None: - payload["reset_password_template_id"] = reset_password_template_id - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset/start") - - res = await self.async_client.post(url, json=payload) - return MultitenantpasswordemailresetstartResponse.from_json(res.response.status, res.json) - - def MultiTenantPasswordEmailReset( - self, - password_reset_token: str, - password: str, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - code_verifier: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> MultitenantpasswordemailresetResponse: - - payload: Dict[str, Any] = { - "password_reset_token": password_reset_token, - "password": password, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if code_verifier is not None: - payload["code_verifier"] = code_verifier - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset") - - res = self.sync_client.post(url, json=payload) - return MultitenantpasswordemailresetResponse.from_json(res.response.status_code, res.json) - - async def MultiTenantPasswordEmailReset_async( - self, - password_reset_token: str, - password: str, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - code_verifier: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> MultitenantpasswordemailresetResponse: - - payload: Dict[str, Any] = { - "password_reset_token": password_reset_token, - "password": password, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if code_verifier is not None: - payload["code_verifier"] = code_verifier - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/email/reset") - - res = await self.async_client.post(url, json=payload) - return MultitenantpasswordemailresetResponse.from_json(res.response.status, res.json) - - def MultiTenantPasswordSessionReset( - self, - organization_id: str, - password: str, - session_token: Optional[str] = None, - session_jwt: Optional[str] = None, - ) -> MultitenantpasswordsessionresetResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "password": password, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_jwt is not None: - payload["session_jwt"] = session_jwt - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/session/reset") - - res = self.sync_client.post(url, json=payload) - return MultitenantpasswordsessionresetResponse.from_json(res.response.status_code, res.json) - - async def MultiTenantPasswordSessionReset_async( - self, - organization_id: str, - password: str, - session_token: Optional[str] = None, - session_jwt: Optional[str] = None, - ) -> MultitenantpasswordsessionresetResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "password": password, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_jwt is not None: - payload["session_jwt"] = session_jwt - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/session/reset") - - res = await self.async_client.post(url, json=payload) - return MultitenantpasswordsessionresetResponse.from_json(res.response.status, res.json) - - def MultiTenantPasswordExistingPasswordReset( - self, - email_address: str, - existing_password: str, - new_password: str, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - organization_id: str, - ) -> MultitenantpasswordexistingpasswordresetResponse: - - payload: Dict[str, Any] = { - "email_address": email_address, - "existing_password": existing_password, - "new_password": new_password, - "organization_id": organization_id, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/existing_password/reset") - - res = self.sync_client.post(url, json=payload) - return MultitenantpasswordexistingpasswordresetResponse.from_json(res.response.status_code, res.json) - - async def MultiTenantPasswordExistingPasswordReset_async( - self, - email_address: str, - existing_password: str, - new_password: str, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - organization_id: str, - ) -> MultitenantpasswordexistingpasswordresetResponse: - - payload: Dict[str, Any] = { - "email_address": email_address, - "existing_password": existing_password, - "new_password": new_password, - "organization_id": organization_id, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/passwords/existing_password/reset") - - res = await self.async_client.post(url, json=payload) - return MultitenantpasswordexistingpasswordresetResponse.from_json(res.response.status, res.json) - diff --git a/stytch/api/multi_tenant_session_service.py b/stytch/api/multi_tenant_session_service.py index 061a735a..f31ff301 100644 --- a/stytch/api/multi_tenant_session_service.py +++ b/stytch/api/multi_tenant_session_service.py @@ -4,16 +4,9 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, Optional from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.multi_tenant_session_service import ( - MultitenantsessionsauthenticateResponse, - MultitenantsessionsexchangeResponse, - MultitenantsessionsgetResponse, - MultitenantsessionsrevokeResponse, -) class MultiTenantSessionService: @@ -30,199 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "multi_tenant_session_service" - - def MultiTenantSessionsGet( - self, - organization_id: str, - member_id: str, - ) -> MultitenantsessionsgetResponse: - payload: Dict[str, Any] = { - "organization_id": organization_id, - "member_id": member_id, - } - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions") - - res = self.sync_client.get(url, params=payload) - return MultitenantsessionsgetResponse.from_json( - res.response.status_code, res.json - ) - - async def MultiTenantSessionsGet_async( - self, - organization_id: str, - member_id: str, - ) -> MultitenantsessionsgetResponse: - payload: Dict[str, Any] = { - "organization_id": organization_id, - "member_id": member_id, - } - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions") - - res = await self.async_client.get(url, params=payload) - return MultitenantsessionsgetResponse.from_json(res.response.status, res.json) - - def MultiTenantSessionsAuthenticate( - self, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> MultitenantsessionsauthenticateResponse: - payload: Dict[str, Any] = {} - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url( - self.sub_url, "/v1/b2b/sessions/authenticate" - ) - - res = self.sync_client.post(url, json=payload) - return MultitenantsessionsauthenticateResponse.from_json( - res.response.status_code, res.json - ) - - async def MultiTenantSessionsAuthenticate_async( - self, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> MultitenantsessionsauthenticateResponse: - payload: Dict[str, Any] = {} - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url( - self.sub_url, "/v1/b2b/sessions/authenticate" - ) - - res = await self.async_client.post(url, json=payload) - return MultitenantsessionsauthenticateResponse.from_json( - res.response.status, res.json - ) - - def MultiTenantSessionsRevoke( - self, - member_session_id: Optional[str] = None, - session_token: Optional[str] = None, - session_jwt: Optional[str] = None, - member_id: Optional[str] = None, - ) -> MultitenantsessionsrevokeResponse: - payload: Dict[str, Any] = {} - - if member_session_id is not None: - payload["member_session_id"] = member_session_id - if session_token is not None: - payload["session_token"] = session_token - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if member_id is not None: - payload["member_id"] = member_id - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions/revoke") - - res = self.sync_client.post(url, json=payload) - return MultitenantsessionsrevokeResponse.from_json( - res.response.status_code, res.json - ) - - async def MultiTenantSessionsRevoke_async( - self, - member_session_id: Optional[str] = None, - session_token: Optional[str] = None, - session_jwt: Optional[str] = None, - member_id: Optional[str] = None, - ) -> MultitenantsessionsrevokeResponse: - payload: Dict[str, Any] = {} - - if member_session_id is not None: - payload["member_session_id"] = member_session_id - if session_token is not None: - payload["session_token"] = session_token - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if member_id is not None: - payload["member_id"] = member_id - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sessions/revoke") - - res = await self.async_client.post(url, json=payload) - return MultitenantsessionsrevokeResponse.from_json( - res.response.status, res.json - ) - - def MultiTenantSessionsExchange( - self, - organization_id: str, - session_token: Optional[str] = None, - session_jwt: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> MultitenantsessionsexchangeResponse: - payload: Dict[str, Any] = { - "organization_id": organization_id, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url( - self.sub_url, "/v1/b2b/sessions/exchange" - ) - - res = self.sync_client.post(url, json=payload) - return MultitenantsessionsexchangeResponse.from_json( - res.response.status_code, res.json - ) - - async def MultiTenantSessionsExchange_async( - self, - organization_id: str, - session_token: Optional[str] = None, - session_jwt: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> MultitenantsessionsexchangeResponse: - payload: Dict[str, Any] = { - "organization_id": organization_id, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url( - self.sub_url, "/v1/b2b/sessions/exchange" - ) - - res = await self.async_client.post(url, json=payload) - return MultitenantsessionsexchangeResponse.from_json( - res.response.status, res.json - ) diff --git a/stytch/api/o_auth_service.py b/stytch/api/o_auth_service.py index d8799da7..43db8833 100644 --- a/stytch/api/o_auth_service.py +++ b/stytch/api/o_auth_service.py @@ -4,48 +4,19 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic +from typing import Any, Dict, Optional from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.o_auth_service import ( - OauthamazonstartResponse, - OauthappleidtokenauthenticateResponse, - OauthapplestartResponse, - OauthattachResponse, - OauthauthenticateResponse, - OauthbitbucketstartResponse, - OauthcoinbasestartResponse, - OauthdiscordstartResponse, - OauthfacebookstartResponse, - OauthfigmastartResponse, - OauthgithubstartResponse, - OauthgitlabstartResponse, - OauthgoogleidtokenauthenticateResponse, - OauthgoogleonetapstartResponse, - OauthgooglestartResponse, - OauthinstagramstartResponse, - OauthlinkedinstartResponse, - OauthmicrosoftstartResponse, - OauthshopifystartResponse, - OauthslackstartResponse, - OauthsnapchatstartResponse, - OauthspotifystartResponse, - OauthsteamstartResponse, - OauthtiktokstartResponse, - OauthtwitchstartResponse, - OauthtwitterstartResponse, -) +from stytch.models.o_auth_service import OauthattachResponse, OauthauthenticateResponse class OAuthService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -62,7 +33,6 @@ def OAuthAttach( session_token: Optional[str] = None, session_jwt: Optional[str] = None, ) -> OauthattachResponse: - payload: Dict[str, Any] = { "provider": provider, "user_id": user_id, @@ -79,13 +49,12 @@ def OAuthAttach( return OauthattachResponse.from_json(res.response.status_code, res.json) async def OAuthAttach_async( - self, - provider: str, - user_id: str, - session_token: Optional[str] = None, - session_jwt: Optional[str] = None, + self, + provider: str, + user_id: str, + session_token: Optional[str] = None, + session_jwt: Optional[str] = None, ) -> OauthattachResponse: - payload: Dict[str, Any] = { "provider": provider, "user_id": user_id, @@ -101,1384 +70,6 @@ async def OAuthAttach_async( res = await self.async_client.post(url, json=payload) return OauthattachResponse.from_json(res.response.status, res.json) - def OAuthGoogleOneTapStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - ) -> OauthgoogleonetapstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/google/onetap/start") - - res = self.sync_client.get(url, params=payload) - return OauthgoogleonetapstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthGoogleOneTapStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - ) -> OauthgoogleonetapstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/google/onetap/start") - - res = await self.async_client.get(url, params=payload) - return OauthgoogleonetapstartResponse.from_json(res.response.status, res.json) - - def OAuthGoogleStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthgooglestartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/google/start") - - res = self.sync_client.get(url, params=payload) - return OauthgooglestartResponse.from_json(res.response.status_code, res.json) - - async def OAuthGoogleStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthgooglestartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/google/start") - - res = await self.async_client.get(url, params=payload) - return OauthgooglestartResponse.from_json(res.response.status, res.json) - - def OAuthGoogleIDTokenAuthenticate( - self, - id_token: str, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, Any]] = None, - ) -> OauthgoogleidtokenauthenticateResponse: - - payload: Dict[str, Any] = { - "id_token": id_token, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/google/id_token/authenticate") - - res = self.sync_client.post(url, json=payload) - return OauthgoogleidtokenauthenticateResponse.from_json(res.response.status_code, res.json) - - async def OAuthGoogleIDTokenAuthenticate_async( - self, - id_token: str, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, Any]] = None, - ) -> OauthgoogleidtokenauthenticateResponse: - - payload: Dict[str, Any] = { - "id_token": id_token, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/google/id_token/authenticate") - - res = await self.async_client.post(url, json=payload) - return OauthgoogleidtokenauthenticateResponse.from_json(res.response.status, res.json) - - def OAuthMicrosoftStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthmicrosoftstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/microsoft/start") - - res = self.sync_client.get(url, params=payload) - return OauthmicrosoftstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthMicrosoftStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthmicrosoftstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/microsoft/start") - - res = await self.async_client.get(url, params=payload) - return OauthmicrosoftstartResponse.from_json(res.response.status, res.json) - - def OAuthAppleStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthapplestartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/apple/start") - - res = self.sync_client.get(url, params=payload) - return OauthapplestartResponse.from_json(res.response.status_code, res.json) - - async def OAuthAppleStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthapplestartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/apple/start") - - res = await self.async_client.get(url, params=payload) - return OauthapplestartResponse.from_json(res.response.status, res.json) - - def OAuthAppleIDTokenAuthenticate( - self, - id_token: str, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, Any]] = None, - name: None, - nonce: str, - ) -> OauthappleidtokenauthenticateResponse: - - payload: Dict[str, Any] = { - "id_token": id_token, - "nonce": nonce, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - if name is not None: - payload["name"] = name - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/apple/id_token/authenticate") - - res = self.sync_client.post(url, json=payload) - return OauthappleidtokenauthenticateResponse.from_json(res.response.status_code, res.json) - - async def OAuthAppleIDTokenAuthenticate_async( - self, - id_token: str, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, Any]] = None, - name: None, - nonce: str, - ) -> OauthappleidtokenauthenticateResponse: - - payload: Dict[str, Any] = { - "id_token": id_token, - "nonce": nonce, - } - - if session_token is not None: - payload["session_token"] = session_token - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - if name is not None: - payload["name"] = name - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/oauth/apple/id_token/authenticate") - - res = await self.async_client.post(url, json=payload) - return OauthappleidtokenauthenticateResponse.from_json(res.response.status, res.json) - - def OAuthGithubStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthgithubstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/github/start") - - res = self.sync_client.get(url, params=payload) - return OauthgithubstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthGithubStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthgithubstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/github/start") - - res = await self.async_client.get(url, params=payload) - return OauthgithubstartResponse.from_json(res.response.status, res.json) - - def OAuthFacebookStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthfacebookstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/facebook/start") - - res = self.sync_client.get(url, params=payload) - return OauthfacebookstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthFacebookStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthfacebookstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/facebook/start") - - res = await self.async_client.get(url, params=payload) - return OauthfacebookstartResponse.from_json(res.response.status, res.json) - - def OAuthAmazonStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthamazonstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/amazon/start") - - res = self.sync_client.get(url, params=payload) - return OauthamazonstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthAmazonStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthamazonstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/amazon/start") - - res = await self.async_client.get(url, params=payload) - return OauthamazonstartResponse.from_json(res.response.status, res.json) - - def OAuthBitbucketStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthbitbucketstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/bitbucket/start") - - res = self.sync_client.get(url, params=payload) - return OauthbitbucketstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthBitbucketStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthbitbucketstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/bitbucket/start") - - res = await self.async_client.get(url, params=payload) - return OauthbitbucketstartResponse.from_json(res.response.status, res.json) - - def OAuthCoinbaseStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthcoinbasestartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/coinbase/start") - - res = self.sync_client.get(url, params=payload) - return OauthcoinbasestartResponse.from_json(res.response.status_code, res.json) - - async def OAuthCoinbaseStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthcoinbasestartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/coinbase/start") - - res = await self.async_client.get(url, params=payload) - return OauthcoinbasestartResponse.from_json(res.response.status, res.json) - - def OAuthDiscordStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthdiscordstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/discord/start") - - res = self.sync_client.get(url, params=payload) - return OauthdiscordstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthDiscordStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthdiscordstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/discord/start") - - res = await self.async_client.get(url, params=payload) - return OauthdiscordstartResponse.from_json(res.response.status, res.json) - - def OAuthFigmaStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthfigmastartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/figma/start") - - res = self.sync_client.get(url, params=payload) - return OauthfigmastartResponse.from_json(res.response.status_code, res.json) - - async def OAuthFigmaStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthfigmastartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/figma/start") - - res = await self.async_client.get(url, params=payload) - return OauthfigmastartResponse.from_json(res.response.status, res.json) - - def OAuthGitLabStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthgitlabstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/gitlab/start") - - res = self.sync_client.get(url, params=payload) - return OauthgitlabstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthGitLabStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthgitlabstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/gitlab/start") - - res = await self.async_client.get(url, params=payload) - return OauthgitlabstartResponse.from_json(res.response.status, res.json) - - def OAuthInstagramStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthinstagramstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/instagram/start") - - res = self.sync_client.get(url, params=payload) - return OauthinstagramstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthInstagramStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthinstagramstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/instagram/start") - - res = await self.async_client.get(url, params=payload) - return OauthinstagramstartResponse.from_json(res.response.status, res.json) - - def OAuthLinkedInStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthlinkedinstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/linkedin/start") - - res = self.sync_client.get(url, params=payload) - return OauthlinkedinstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthLinkedInStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthlinkedinstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/linkedin/start") - - res = await self.async_client.get(url, params=payload) - return OauthlinkedinstartResponse.from_json(res.response.status, res.json) - - def OAuthShopifyStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthshopifystartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/shopify/start") - - res = self.sync_client.get(url, params=payload) - return OauthshopifystartResponse.from_json(res.response.status_code, res.json) - - async def OAuthShopifyStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthshopifystartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/shopify/start") - - res = await self.async_client.get(url, params=payload) - return OauthshopifystartResponse.from_json(res.response.status, res.json) - - def OAuthSlackStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthslackstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/slack/start") - - res = self.sync_client.get(url, params=payload) - return OauthslackstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthSlackStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthslackstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/slack/start") - - res = await self.async_client.get(url, params=payload) - return OauthslackstartResponse.from_json(res.response.status, res.json) - - def OAuthSnapchatStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthsnapchatstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/snapchat/start") - - res = self.sync_client.get(url, params=payload) - return OauthsnapchatstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthSnapchatStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthsnapchatstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/snapchat/start") - - res = await self.async_client.get(url, params=payload) - return OauthsnapchatstartResponse.from_json(res.response.status, res.json) - - def OAuthSpotifyStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthspotifystartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/spotify/start") - - res = self.sync_client.get(url, params=payload) - return OauthspotifystartResponse.from_json(res.response.status_code, res.json) - - async def OAuthSpotifyStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthspotifystartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/spotify/start") - - res = await self.async_client.get(url, params=payload) - return OauthspotifystartResponse.from_json(res.response.status, res.json) - - def OAuthSteamStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthsteamstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/steam/start") - - res = self.sync_client.get(url, params=payload) - return OauthsteamstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthSteamStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthsteamstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/steam/start") - - res = await self.async_client.get(url, params=payload) - return OauthsteamstartResponse.from_json(res.response.status, res.json) - - def OAuthTikTokStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthtiktokstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/tiktok/start") - - res = self.sync_client.get(url, params=payload) - return OauthtiktokstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthTikTokStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthtiktokstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/tiktok/start") - - res = await self.async_client.get(url, params=payload) - return OauthtiktokstartResponse.from_json(res.response.status, res.json) - - def OAuthTwitchStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthtwitchstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/twitch/start") - - res = self.sync_client.get(url, params=payload) - return OauthtwitchstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthTwitchStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthtwitchstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/twitch/start") - - res = await self.async_client.get(url, params=payload) - return OauthtwitchstartResponse.from_json(res.response.status, res.json) - - def OAuthTwitterStart( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthtwitterstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/twitter/start") - - res = self.sync_client.get(url, params=payload) - return OauthtwitterstartResponse.from_json(res.response.status_code, res.json) - - async def OAuthTwitterStart_async( - self, - public_token: str, - login_redirect_url: Optional[str] = None, - signup_redirect_url: Optional[str] = None, - custom_scopes: str, - code_challenge: Optional[str] = None, - oauth_attach_token: Optional[str] = None, - ) -> OauthtwitterstartResponse: - - payload: Dict[str, Any] = { - "public_token": public_token, - "custom_scopes": custom_scopes, - } - - if login_redirect_url is not None: - payload["login_redirect_url"] = login_redirect_url - if signup_redirect_url is not None: - payload["signup_redirect_url"] = signup_redirect_url - if code_challenge is not None: - payload["code_challenge"] = code_challenge - if oauth_attach_token is not None: - payload["oauth_attach_token"] = oauth_attach_token - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/public/oauth/twitter/start") - - res = await self.async_client.get(url, params=payload) - return OauthtwitterstartResponse.from_json(res.response.status, res.json) - def OAuthAuthenticate( self, token: str, @@ -1489,7 +80,6 @@ def OAuthAuthenticate( session_custom_claims: Optional[Dict[str, Any]] = None, code_verifier: Optional[str] = None, ) -> OauthauthenticateResponse: - payload: Dict[str, Any] = { "token": token, } @@ -1513,16 +103,15 @@ def OAuthAuthenticate( return OauthauthenticateResponse.from_json(res.response.status_code, res.json) async def OAuthAuthenticate_async( - self, - token: str, - session_management_type: Optional[str] = None, - session_token: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_jwt: Optional[str] = None, - session_custom_claims: Optional[Dict[str, Any]] = None, - code_verifier: Optional[str] = None, + self, + token: str, + session_management_type: Optional[str] = None, + session_token: Optional[str] = None, + session_duration_minutes: Optional[int] = None, + session_jwt: Optional[str] = None, + session_custom_claims: Optional[Dict[str, Any]] = None, + code_verifier: Optional[str] = None, ) -> OauthauthenticateResponse: - payload: Dict[str, Any] = { "token": token, } @@ -1544,4 +133,3 @@ async def OAuthAuthenticate_async( res = await self.async_client.post(url, json=payload) return OauthauthenticateResponse.from_json(res.response.status, res.json) - diff --git a/stytch/api/organization_service.py b/stytch/api/organization_service.py index 4f3b82f7..9c13c381 100644 --- a/stytch/api/organization_service.py +++ b/stytch/api/organization_service.py @@ -4,33 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.organization_service import ( - OrganizationscreateResponse, - OrganizationsdeleteResponse, - OrganizationsgetResponse, - OrganizationsmembercreateResponse, - OrganizationsmemberdeletepasswordResponse, - OrganizationsmemberdeleteResponse, - OrganizationsmembergetResponse, - OrganizationsmembersearchexternalResponse, - OrganizationsmemberupdateResponse, - OrganizationssearchexternalResponse, - OrganizationsupdateResponse, -) class OrganizationService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -39,526 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "organization_service" - - def OrganizationsCreate( - self, - organization_name: str, - organization_slug: str, - organization_logo_url: str, - trusted_metadata: Optional[Dict[str, str]] = None, - sso_jit_provisioning: Optional[str] = None, - email_allowed_domains: List[str], - email_jit_provisioning: Optional[str] = None, - email_invites: Optional[str] = None, - auth_methods: Optional[str] = None, - allowed_auth_methods: List[str], - ) -> OrganizationscreateResponse: - - payload: Dict[str, Any] = { - "organization_name": organization_name, - "organization_slug": organization_slug, - "organization_logo_url": organization_logo_url, - "email_allowed_domains": email_allowed_domains, - "allowed_auth_methods": allowed_auth_methods, - } - - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if sso_jit_provisioning is not None: - payload["sso_jit_provisioning"] = sso_jit_provisioning - if email_jit_provisioning is not None: - payload["email_jit_provisioning"] = email_jit_provisioning - if email_invites is not None: - payload["email_invites"] = email_invites - if auth_methods is not None: - payload["auth_methods"] = auth_methods - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations") - - res = self.sync_client.post(url, json=payload) - return OrganizationscreateResponse.from_json(res.response.status_code, res.json) - - async def OrganizationsCreate_async( - self, - organization_name: str, - organization_slug: str, - organization_logo_url: str, - trusted_metadata: Optional[Dict[str, str]] = None, - sso_jit_provisioning: Optional[str] = None, - email_allowed_domains: List[str], - email_jit_provisioning: Optional[str] = None, - email_invites: Optional[str] = None, - auth_methods: Optional[str] = None, - allowed_auth_methods: List[str], - ) -> OrganizationscreateResponse: - - payload: Dict[str, Any] = { - "organization_name": organization_name, - "organization_slug": organization_slug, - "organization_logo_url": organization_logo_url, - "email_allowed_domains": email_allowed_domains, - "allowed_auth_methods": allowed_auth_methods, - } - - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if sso_jit_provisioning is not None: - payload["sso_jit_provisioning"] = sso_jit_provisioning - if email_jit_provisioning is not None: - payload["email_jit_provisioning"] = email_jit_provisioning - if email_invites is not None: - payload["email_invites"] = email_invites - if auth_methods is not None: - payload["auth_methods"] = auth_methods - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations") - - res = await self.async_client.post(url, json=payload) - return OrganizationscreateResponse.from_json(res.response.status, res.json) - - def OrganizationsGet( - self, - organization_id: str, - ) -> OrganizationsgetResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") - - res = self.sync_client.get(url, params=payload) - return OrganizationsgetResponse.from_json(res.response.status_code, res.json) - - async def OrganizationsGet_async( - self, - organization_id: str, - ) -> OrganizationsgetResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") - - res = await self.async_client.get(url, params=payload) - return OrganizationsgetResponse.from_json(res.response.status, res.json) - - def OrganizationsUpdate( - self, - organization_id: str, - organization_name: Optional[str] = None, - organization_slug: Optional[str] = None, - organization_logo_url: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - sso_default_connection_id: Optional[str] = None, - sso_jit_provisioning: Optional[str] = None, - sso_jit_provisioning_allowed_connections: Optional[List[str]] = None, - email_allowed_domains: Optional[List[str]] = None, - email_jit_provisioning: Optional[str] = None, - email_invites: Optional[str] = None, - auth_methods: Optional[str] = None, - allowed_auth_methods: Optional[List[str]] = None, - ) -> OrganizationsupdateResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - } - - if organization_name is not None: - payload["organization_name"] = organization_name - if organization_slug is not None: - payload["organization_slug"] = organization_slug - if organization_logo_url is not None: - payload["organization_logo_url"] = organization_logo_url - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if sso_default_connection_id is not None: - payload["sso_default_connection_id"] = sso_default_connection_id - if sso_jit_provisioning is not None: - payload["sso_jit_provisioning"] = sso_jit_provisioning - if sso_jit_provisioning_allowed_connections is not None: - payload["sso_jit_provisioning_allowed_connections"] = sso_jit_provisioning_allowed_connections - if email_allowed_domains is not None: - payload["email_allowed_domains"] = email_allowed_domains - if email_jit_provisioning is not None: - payload["email_jit_provisioning"] = email_jit_provisioning - if email_invites is not None: - payload["email_invites"] = email_invites - if auth_methods is not None: - payload["auth_methods"] = auth_methods - if allowed_auth_methods is not None: - payload["allowed_auth_methods"] = allowed_auth_methods - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") - - res = self.sync_client.put(url, json=payload) - return OrganizationsupdateResponse.from_json(res.response.status_code, res.json) - - async def OrganizationsUpdate_async( - self, - organization_id: str, - organization_name: Optional[str] = None, - organization_slug: Optional[str] = None, - organization_logo_url: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - sso_default_connection_id: Optional[str] = None, - sso_jit_provisioning: Optional[str] = None, - sso_jit_provisioning_allowed_connections: Optional[List[str]] = None, - email_allowed_domains: Optional[List[str]] = None, - email_jit_provisioning: Optional[str] = None, - email_invites: Optional[str] = None, - auth_methods: Optional[str] = None, - allowed_auth_methods: Optional[List[str]] = None, - ) -> OrganizationsupdateResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - } - - if organization_name is not None: - payload["organization_name"] = organization_name - if organization_slug is not None: - payload["organization_slug"] = organization_slug - if organization_logo_url is not None: - payload["organization_logo_url"] = organization_logo_url - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if sso_default_connection_id is not None: - payload["sso_default_connection_id"] = sso_default_connection_id - if sso_jit_provisioning is not None: - payload["sso_jit_provisioning"] = sso_jit_provisioning - if sso_jit_provisioning_allowed_connections is not None: - payload["sso_jit_provisioning_allowed_connections"] = sso_jit_provisioning_allowed_connections - if email_allowed_domains is not None: - payload["email_allowed_domains"] = email_allowed_domains - if email_jit_provisioning is not None: - payload["email_jit_provisioning"] = email_jit_provisioning - if email_invites is not None: - payload["email_invites"] = email_invites - if auth_methods is not None: - payload["auth_methods"] = auth_methods - if allowed_auth_methods is not None: - payload["allowed_auth_methods"] = allowed_auth_methods - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") - - res = await self.async_client.put(url, json=payload) - return OrganizationsupdateResponse.from_json(res.response.status, res.json) - - def OrganizationsDelete( - self, - organization_id: str, - ) -> OrganizationsdeleteResponse: - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") - - res = self.sync_client.delete(url) - return OrganizationsdeleteResponse.from_json(res.response.status_code, res.json) - - async def OrganizationsDelete_async( - self, - organization_id: str, - ) -> OrganizationsdeleteResponse: - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}") - - res = await self.async_client.delete(url) - return OrganizationsdeleteResponse.from_json(res.response.status, res.json) - - def OrganizationsMemberCreate( - self, - organization_id: str, - email_address: str, - name: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, - create_member_as_pending: bool, - is_breakglass: bool, - ) -> OrganizationsmembercreateResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "email_address": email_address, - "create_member_as_pending": create_member_as_pending, - "is_breakglass": is_breakglass, - } - - if name is not None: - payload["name"] = name - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if untrusted_metadata is not None: - payload["untrusted_metadata"] = untrusted_metadata - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members") - - res = self.sync_client.post(url, json=payload) - return OrganizationsmembercreateResponse.from_json(res.response.status_code, res.json) - - async def OrganizationsMemberCreate_async( - self, - organization_id: str, - email_address: str, - name: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, - create_member_as_pending: bool, - is_breakglass: bool, - ) -> OrganizationsmembercreateResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "email_address": email_address, - "create_member_as_pending": create_member_as_pending, - "is_breakglass": is_breakglass, - } - - if name is not None: - payload["name"] = name - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if untrusted_metadata is not None: - payload["untrusted_metadata"] = untrusted_metadata - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members") - - res = await self.async_client.post(url, json=payload) - return OrganizationsmembercreateResponse.from_json(res.response.status, res.json) - - def OrganizationsMemberUpdate( - self, - organization_id: str, - member_id: str, - name: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, - is_breakglass: Optional[bool] = None, - ) -> OrganizationsmemberupdateResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "member_id": member_id, - } - - if name is not None: - payload["name"] = name - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if untrusted_metadata is not None: - payload["untrusted_metadata"] = untrusted_metadata - if is_breakglass is not None: - payload["is_breakglass"] = is_breakglass - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") - - res = self.sync_client.put(url, json=payload) - return OrganizationsmemberupdateResponse.from_json(res.response.status_code, res.json) - - async def OrganizationsMemberUpdate_async( - self, - organization_id: str, - member_id: str, - name: Optional[str] = None, - trusted_metadata: Optional[Dict[str, str]] = None, - untrusted_metadata: Optional[Dict[str, str]] = None, - is_breakglass: Optional[bool] = None, - ) -> OrganizationsmemberupdateResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "member_id": member_id, - } - - if name is not None: - payload["name"] = name - if trusted_metadata is not None: - payload["trusted_metadata"] = trusted_metadata - if untrusted_metadata is not None: - payload["untrusted_metadata"] = untrusted_metadata - if is_breakglass is not None: - payload["is_breakglass"] = is_breakglass - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") - - res = await self.async_client.put(url, json=payload) - return OrganizationsmemberupdateResponse.from_json(res.response.status, res.json) - - def OrganizationsMemberDelete( - self, - organization_id: str, - member_id: str, - ) -> OrganizationsmemberdeleteResponse: - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") - - res = self.sync_client.delete(url) - return OrganizationsmemberdeleteResponse.from_json(res.response.status_code, res.json) - - async def OrganizationsMemberDelete_async( - self, - organization_id: str, - member_id: str, - ) -> OrganizationsmemberdeleteResponse: - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/{member_id}") - - res = await self.async_client.delete(url) - return OrganizationsmemberdeleteResponse.from_json(res.response.status, res.json) - - def OrganizationsSearchExternal( - self, - cursor: str, - limit: Optional[int] = None, - query: ExternalSearchQuery, - ) -> OrganizationssearchexternalResponse: - - payload: Dict[str, Any] = { - "cursor": cursor, - "query": query, - } - - if limit is not None: - payload["limit"] = limit - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/search") - - res = self.sync_client.post(url, json=payload) - return OrganizationssearchexternalResponse.from_json(res.response.status_code, res.json) - - async def OrganizationsSearchExternal_async( - self, - cursor: str, - limit: Optional[int] = None, - query: ExternalSearchQuery, - ) -> OrganizationssearchexternalResponse: - - payload: Dict[str, Any] = { - "cursor": cursor, - "query": query, - } - - if limit is not None: - payload["limit"] = limit - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/search") - - res = await self.async_client.post(url, json=payload) - return OrganizationssearchexternalResponse.from_json(res.response.status, res.json) - - def OrganizationsMemberSearchExternal( - self, - cursor: str, - limit: Optional[int] = None, - query: ExternalSearchQuery, - organization_ids: List[str], - ) -> OrganizationsmembersearchexternalResponse: - - payload: Dict[str, Any] = { - "cursor": cursor, - "query": query, - "organization_ids": organization_ids, - } - - if limit is not None: - payload["limit"] = limit - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/members/search") - - res = self.sync_client.post(url, json=payload) - return OrganizationsmembersearchexternalResponse.from_json(res.response.status_code, res.json) - - async def OrganizationsMemberSearchExternal_async( - self, - cursor: str, - limit: Optional[int] = None, - query: ExternalSearchQuery, - organization_ids: List[str], - ) -> OrganizationsmembersearchexternalResponse: - - payload: Dict[str, Any] = { - "cursor": cursor, - "query": query, - "organization_ids": organization_ids, - } - - if limit is not None: - payload["limit"] = limit - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/members/search") - - res = await self.async_client.post(url, json=payload) - return OrganizationsmembersearchexternalResponse.from_json(res.response.status, res.json) - - def OrganizationsMemberDeletePassword( - self, - organization_id: str, - member_password_id: str, - ) -> OrganizationsmemberdeletepasswordResponse: - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/passwords/{member_password_id}") - - res = self.sync_client.delete(url) - return OrganizationsmemberdeletepasswordResponse.from_json(res.response.status_code, res.json) - - async def OrganizationsMemberDeletePassword_async( - self, - organization_id: str, - member_password_id: str, - ) -> OrganizationsmemberdeletepasswordResponse: - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/members/passwords/{member_password_id}") - - res = await self.async_client.delete(url) - return OrganizationsmemberdeletepasswordResponse.from_json(res.response.status, res.json) - - def OrganizationsMemberGet( - self, - organization_id: str, - member_id: Optional[str] = None, - email_address: Optional[str] = None, - ) -> OrganizationsmembergetResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - } - - if member_id is not None: - payload["member_id"] = member_id - if email_address is not None: - payload["email_address"] = email_address - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/member") - - res = self.sync_client.get(url, params=payload) - return OrganizationsmembergetResponse.from_json(res.response.status_code, res.json) - - async def OrganizationsMemberGet_async( - self, - organization_id: str, - member_id: Optional[str] = None, - email_address: Optional[str] = None, - ) -> OrganizationsmembergetResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - } - - if member_id is not None: - payload["member_id"] = member_id - if email_address is not None: - payload["email_address"] = email_address - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/organizations/{organization_id}/member") - - res = await self.async_client.get(url, params=payload) - return OrganizationsmembergetResponse.from_json(res.response.status, res.json) - diff --git a/stytch/api/password_service.py b/stytch/api/password_service.py index de457341..0a7fb99e 100644 --- a/stytch/api/password_service.py +++ b/stytch/api/password_service.py @@ -159,42 +159,6 @@ async def PasswordsAuthenticate_async( res = await self.async_client.post(url, json=payload) return PasswordsauthenticateResponse.from_json(res.response.status, res.json) - def PasswordsStrengthCheck( - self, - password: str, - email: Optional[str] = None, - ) -> PasswordsstrengthcheckResponse: - - payload: Dict[str, Any] = { - "password": password, - } - - if email is not None: - payload["email"] = email - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/strength_check") - - res = self.sync_client.post(url, json=payload) - return PasswordsstrengthcheckResponse.from_json(res.response.status_code, res.json) - - async def PasswordsStrengthCheck_async( - self, - password: str, - email: Optional[str] = None, - ) -> PasswordsstrengthcheckResponse: - - payload: Dict[str, Any] = { - "password": password, - } - - if email is not None: - payload["email"] = email - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/strength_check") - - res = await self.async_client.post(url, json=payload) - return PasswordsstrengthcheckResponse.from_json(res.response.status, res.json) - def PasswordsEmailResetStart( self, email: str, @@ -529,3 +493,39 @@ async def PasswordsMigrate_async( res = await self.async_client.post(url, json=payload) return PasswordsmigrateResponse.from_json(res.response.status, res.json) + def PasswordsStrengthCheck( + self, + password: str, + email: Optional[str] = None, + ) -> PasswordsstrengthcheckResponse: + + payload: Dict[str, Any] = { + "password": password, + } + + if email is not None: + payload["email"] = email + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/strength_check") + + res = self.sync_client.post(url, json=payload) + return PasswordsstrengthcheckResponse.from_json(res.response.status_code, res.json) + + async def PasswordsStrengthCheck_async( + self, + password: str, + email: Optional[str] = None, + ) -> PasswordsstrengthcheckResponse: + + payload: Dict[str, Any] = { + "password": password, + } + + if email is not None: + payload["email"] = email + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/passwords/strength_check") + + res = await self.async_client.post(url, json=payload) + return PasswordsstrengthcheckResponse.from_json(res.response.status, res.json) + diff --git a/stytch/api/session_service.py b/stytch/api/session_service.py index b69c25ab..1a64b35e 100644 --- a/stytch/api/session_service.py +++ b/stytch/api/session_service.py @@ -9,7 +9,6 @@ from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient from stytch.models.session_service import ( - MultitenantsessionsjwksResponse, SessionsauthenticateResponse, SessionsgetResponse, SessionsjwksResponse, @@ -179,35 +178,3 @@ async def SessionsJwks_async( res = await self.async_client.get(url, params=payload) return SessionsjwksResponse.from_json(res.response.status, res.json) - - def MultiTenantSessionsJwks( - self, - project_id: str, - ) -> MultitenantsessionsjwksResponse: - payload: Dict[str, Any] = { - "project_id": project_id, - } - - url = self.api_base.route_with_sub_url( - self.sub_url, "/v1/b2b/sessions/jwks/{project_id}" - ) - - res = self.sync_client.get(url, params=payload) - return MultitenantsessionsjwksResponse.from_json( - res.response.status_code, res.json - ) - - async def MultiTenantSessionsJwks_async( - self, - project_id: str, - ) -> MultitenantsessionsjwksResponse: - payload: Dict[str, Any] = { - "project_id": project_id, - } - - url = self.api_base.route_with_sub_url( - self.sub_url, "/v1/b2b/sessions/jwks/{project_id}" - ) - - res = await self.async_client.get(url, params=payload) - return MultitenantsessionsjwksResponse.from_json(res.response.status, res.json) diff --git a/stytch/api/sso_service.py b/stytch/api/sso_service.py index 2e03f4fb..f9cca618 100644 --- a/stytch/api/sso_service.py +++ b/stytch/api/sso_service.py @@ -4,32 +4,17 @@ # or your changes may be overwritten later! # !!! -from typing import Any, Dict, List, Optional, Union - -import pydantic from stytch.core.api_base import ApiBase from stytch.core.http.client import AsyncClient, SyncClient -from stytch.models.sso_service import ( - CreateoidcconnectionResponse, - CreatesamlconnectionResponse, - DeletesamlverificationcertificateResponse, - DeletessoconnectionResponse, - GetssoconnectionsResponse, - SsoauthenticateResponse, - UpdateoidcconnectionResponse, - UpdatesamlconnectionbydocResponse, - UpdatesamlconnectionbyurlResponse, - UpdatesamlconnectionResponse, -) class SSOService: def __init__( - self, - api_base: ApiBase, - sync_client: SyncClient, - async_client: AsyncClient, + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, ) -> None: self.api_base = api_base self.sync_client = sync_client @@ -38,410 +23,3 @@ def __init__( @property def sub_url(self) -> str: return "sso_service" - - def CreateOIDCConnection( - self, - organization_id: str, - display_name: str, - ) -> CreateoidcconnectionResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "display_name": display_name, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}") - - res = self.sync_client.post(url, json=payload) - return CreateoidcconnectionResponse.from_json(res.response.status_code, res.json) - - async def CreateOIDCConnection_async( - self, - organization_id: str, - display_name: str, - ) -> CreateoidcconnectionResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "display_name": display_name, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}") - - res = await self.async_client.post(url, json=payload) - return CreateoidcconnectionResponse.from_json(res.response.status, res.json) - - def CreateSAMLConnection( - self, - organization_id: str, - display_name: str, - ) -> CreatesamlconnectionResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "display_name": display_name, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}") - - res = self.sync_client.post(url, json=payload) - return CreatesamlconnectionResponse.from_json(res.response.status_code, res.json) - - async def CreateSAMLConnection_async( - self, - organization_id: str, - display_name: str, - ) -> CreatesamlconnectionResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "display_name": display_name, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}") - - res = await self.async_client.post(url, json=payload) - return CreatesamlconnectionResponse.from_json(res.response.status, res.json) - - def UpdateOIDCConnection( - self, - organization_id: str, - connection_id: str, - display_name: str, - client_id: str, - client_secret: str, - issuer: str, - authorization_url: str, - token_url: str, - userinfo_url: str, - jwks_url: str, - ) -> UpdateoidcconnectionResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "connection_id": connection_id, - "display_name": display_name, - "client_id": client_id, - "client_secret": client_secret, - "issuer": issuer, - "authorization_url": authorization_url, - "token_url": token_url, - "userinfo_url": userinfo_url, - "jwks_url": jwks_url, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}/connections/{connection_id}") - - res = self.sync_client.put(url, json=payload) - return UpdateoidcconnectionResponse.from_json(res.response.status_code, res.json) - - async def UpdateOIDCConnection_async( - self, - organization_id: str, - connection_id: str, - display_name: str, - client_id: str, - client_secret: str, - issuer: str, - authorization_url: str, - token_url: str, - userinfo_url: str, - jwks_url: str, - ) -> UpdateoidcconnectionResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "connection_id": connection_id, - "display_name": display_name, - "client_id": client_id, - "client_secret": client_secret, - "issuer": issuer, - "authorization_url": authorization_url, - "token_url": token_url, - "userinfo_url": userinfo_url, - "jwks_url": jwks_url, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/oidc/{organization_id}/connections/{connection_id}") - - res = await self.async_client.put(url, json=payload) - return UpdateoidcconnectionResponse.from_json(res.response.status, res.json) - - def UpdateSAMLConnection( - self, - organization_id: str, - connection_id: str, - idp_entity_id: str, - display_name: str, - attribute_mapping: Optional[Dict[str, str]] = None, - x509_certificate: str, - idp_sso_url: str, - None: None, - ) -> UpdatesamlconnectionResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "connection_id": connection_id, - "idp_entity_id": idp_entity_id, - "display_name": display_name, - "x509_certificate": x509_certificate, - "idp_sso_url": idp_sso_url, - } - - if attribute_mapping is not None: - payload["attribute_mapping"] = attribute_mapping - if None is not None: - payload["None"] = None - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}") - - res = self.sync_client.put(url, json=payload) - return UpdatesamlconnectionResponse.from_json(res.response.status_code, res.json) - - async def UpdateSAMLConnection_async( - self, - organization_id: str, - connection_id: str, - idp_entity_id: str, - display_name: str, - attribute_mapping: Optional[Dict[str, str]] = None, - x509_certificate: str, - idp_sso_url: str, - None: None, - ) -> UpdatesamlconnectionResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - "connection_id": connection_id, - "idp_entity_id": idp_entity_id, - "display_name": display_name, - "x509_certificate": x509_certificate, - "idp_sso_url": idp_sso_url, - } - - if attribute_mapping is not None: - payload["attribute_mapping"] = attribute_mapping - if None is not None: - payload["None"] = None - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}") - - res = await self.async_client.put(url, json=payload) - return UpdatesamlconnectionResponse.from_json(res.response.status, res.json) - - def UpdateSAMLConnectionByURL( - self, - connection_id: str, - metadata_url: str, - ) -> UpdatesamlconnectionbyurlResponse: - - payload: Dict[str, Any] = { - "connection_id": connection_id, - "metadata_url": metadata_url, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/url") - - res = self.sync_client.put(url, json=payload) - return UpdatesamlconnectionbyurlResponse.from_json(res.response.status_code, res.json) - - async def UpdateSAMLConnectionByURL_async( - self, - connection_id: str, - metadata_url: str, - ) -> UpdatesamlconnectionbyurlResponse: - - payload: Dict[str, Any] = { - "connection_id": connection_id, - "metadata_url": metadata_url, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/url") - - res = await self.async_client.put(url, json=payload) - return UpdatesamlconnectionbyurlResponse.from_json(res.response.status, res.json) - - def UpdateSAMLConnectionByDoc( - self, - connection_id: str, - metadata: None, - ) -> UpdatesamlconnectionbydocResponse: - - payload: Dict[str, Any] = { - "connection_id": connection_id, - } - - if metadata is not None: - payload["metadata"] = metadata - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/doc") - - res = self.sync_client.put(url, json=payload) - return UpdatesamlconnectionbydocResponse.from_json(res.response.status_code, res.json) - - async def UpdateSAMLConnectionByDoc_async( - self, - connection_id: str, - metadata: None, - ) -> UpdatesamlconnectionbydocResponse: - - payload: Dict[str, Any] = { - "connection_id": connection_id, - } - - if metadata is not None: - payload["metadata"] = metadata - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{connection_id}/doc") - - res = await self.async_client.put(url, json=payload) - return UpdatesamlconnectionbydocResponse.from_json(res.response.status, res.json) - - def GetSSOConnections( - self, - organization_id: str, - ) -> GetssoconnectionsResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}") - - res = self.sync_client.get(url, params=payload) - return GetssoconnectionsResponse.from_json(res.response.status_code, res.json) - - async def GetSSOConnections_async( - self, - organization_id: str, - ) -> GetssoconnectionsResponse: - - payload: Dict[str, Any] = { - "organization_id": organization_id, - } - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}") - - res = await self.async_client.get(url, params=payload) - return GetssoconnectionsResponse.from_json(res.response.status, res.json) - - def DeleteSSOConnection( - self, - organization_id: str, - connection_id: str, - ) -> DeletessoconnectionResponse: - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}/connections/{connection_id}") - - res = self.sync_client.delete(url) - return DeletessoconnectionResponse.from_json(res.response.status_code, res.json) - - async def DeleteSSOConnection_async( - self, - organization_id: str, - connection_id: str, - ) -> DeletessoconnectionResponse: - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/{organization_id}/connections/{connection_id}") - - res = await self.async_client.delete(url) - return DeletessoconnectionResponse.from_json(res.response.status, res.json) - - def SSOAuthenticate( - self, - sso_token: str, - pkce_code_verifier: Optional[str] = None, - session_token: Optional[str] = None, - session_jwt: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> SsoauthenticateResponse: - - payload: Dict[str, Any] = { - "sso_token": sso_token, - } - - if pkce_code_verifier is not None: - payload["pkce_code_verifier"] = pkce_code_verifier - if session_token is not None: - payload["session_token"] = session_token - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/authenticate") - - res = self.sync_client.post(url, json=payload) - return SsoauthenticateResponse.from_json(res.response.status_code, res.json) - - async def SSOAuthenticate_async( - self, - sso_token: str, - pkce_code_verifier: Optional[str] = None, - session_token: Optional[str] = None, - session_jwt: Optional[str] = None, - session_duration_minutes: Optional[int] = None, - session_custom_claims: Optional[Dict[str, str]] = None, - ) -> SsoauthenticateResponse: - - payload: Dict[str, Any] = { - "sso_token": sso_token, - } - - if pkce_code_verifier is not None: - payload["pkce_code_verifier"] = pkce_code_verifier - if session_token is not None: - payload["session_token"] = session_token - if session_jwt is not None: - payload["session_jwt"] = session_jwt - if session_duration_minutes is not None: - payload["session_duration_minutes"] = session_duration_minutes - if session_custom_claims is not None: - payload["session_custom_claims"] = session_custom_claims - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/authenticate") - - res = await self.async_client.post(url, json=payload) - return SsoauthenticateResponse.from_json(res.response.status, res.json) - - def DeleteSAMLVerificationCertificate( - self, - organization_id: str, - connection_id: str, - certificate_id: str, - ) -> DeletesamlverificationcertificateResponse: - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}/verification_certificates/{certificate_id}") - - res = self.sync_client.delete(url) - return DeletesamlverificationcertificateResponse.from_json(res.response.status_code, res.json) - - async def DeleteSAMLVerificationCertificate_async( - self, - organization_id: str, - connection_id: str, - certificate_id: str, - ) -> DeletesamlverificationcertificateResponse: - - - url = self.api_base.route_with_sub_url(self.sub_url, "/v1/b2b/sso/saml/{organization_id}/connections/{connection_id}/verification_certificates/{certificate_id}") - - res = await self.async_client.delete(url) - return DeletesamlverificationcertificateResponse.from_json(res.response.status, res.json) - diff --git a/stytch/b2b/api/magic_service.py b/stytch/b2b/api/magic_service.py new file mode 100644 index 00000000..21152a61 --- /dev/null +++ b/stytch/b2b/api/magic_service.py @@ -0,0 +1,106 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict + +from stytch.b2b.models.magic_service import ( + MagiclinkredirectResponse, + MagiclinksredirectcaptchaResponse, +) +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient + + +class MagicService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "magic_service" + + def MagicLinkRedirect( + self, + public_token: str, + token: str, + stytch_token_type: str, + ) -> MagiclinkredirectResponse: + payload: Dict[str, Any] = { + "public_token": public_token, + "token": token, + "stytch_token_type": stytch_token_type, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/redirect") + + res = self.sync_client.get(url, params=payload) + return MagiclinkredirectResponse.from_json(res.response.status_code, res.json) + + async def MagicLinkRedirect_async( + self, + public_token: str, + token: str, + stytch_token_type: str, + ) -> MagiclinkredirectResponse: + payload: Dict[str, Any] = { + "public_token": public_token, + "token": token, + "stytch_token_type": stytch_token_type, + } + + url = self.api_base.route_with_sub_url(self.sub_url, "/v1/magic_links/redirect") + + res = await self.async_client.get(url, params=payload) + return MagiclinkredirectResponse.from_json(res.response.status, res.json) + + def MagicLinksRedirectCaptcha( + self, + public_token: str, + redirect_url: str, + captcha: str, + ) -> MagiclinksredirectcaptchaResponse: + payload: Dict[str, Any] = { + "public_token": public_token, + "redirect_url": redirect_url, + "captcha": captcha, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/magic_links/redirect/captcha" + ) + + res = self.sync_client.post(url, json=payload) + return MagiclinksredirectcaptchaResponse.from_json( + res.response.status_code, res.json + ) + + async def MagicLinksRedirectCaptcha_async( + self, + public_token: str, + redirect_url: str, + captcha: str, + ) -> MagiclinksredirectcaptchaResponse: + payload: Dict[str, Any] = { + "public_token": public_token, + "redirect_url": redirect_url, + "captcha": captcha, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/magic_links/redirect/captcha" + ) + + res = await self.async_client.post(url, json=payload) + return MagiclinksredirectcaptchaResponse.from_json( + res.response.status, res.json + ) diff --git a/stytch/b2b/api/password_service.py b/stytch/b2b/api/password_service.py new file mode 100644 index 00000000..5619ad1e --- /dev/null +++ b/stytch/b2b/api/password_service.py @@ -0,0 +1,67 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict, Optional + +from stytch.b2b.models.password_service import PasswordsstrengthcheckResponse +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient + + +class PasswordService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "password_service" + + def PasswordsStrengthCheck( + self, + password: str, + email: Optional[str] = None, + ) -> PasswordsstrengthcheckResponse: + payload: Dict[str, Any] = { + "password": password, + } + + if email is not None: + payload["email"] = email + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/passwords/strength_check" + ) + + res = self.sync_client.post(url, json=payload) + return PasswordsstrengthcheckResponse.from_json( + res.response.status_code, res.json + ) + + async def PasswordsStrengthCheck_async( + self, + password: str, + email: Optional[str] = None, + ) -> PasswordsstrengthcheckResponse: + payload: Dict[str, Any] = { + "password": password, + } + + if email is not None: + payload["email"] = email + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/passwords/strength_check" + ) + + res = await self.async_client.post(url, json=payload) + return PasswordsstrengthcheckResponse.from_json(res.response.status, res.json) diff --git a/stytch/b2b/api/session_service.py b/stytch/b2b/api/session_service.py new file mode 100644 index 00000000..da660809 --- /dev/null +++ b/stytch/b2b/api/session_service.py @@ -0,0 +1,59 @@ +# !!! +# WARNING: This file is autogenerated +# Only modify code within MANUAL() sections +# or your changes may be overwritten later! +# !!! + +from typing import Any, Dict + +from stytch.b2b.models.session_service import MultitenantsessionsjwksResponse +from stytch.core.api_base import ApiBase +from stytch.core.http.client import AsyncClient, SyncClient + + +class SessionService: + def __init__( + self, + api_base: ApiBase, + sync_client: SyncClient, + async_client: AsyncClient, + ) -> None: + self.api_base = api_base + self.sync_client = sync_client + self.async_client = async_client + + @property + def sub_url(self) -> str: + return "session_service" + + def MultiTenantSessionsJwks( + self, + project_id: str, + ) -> MultitenantsessionsjwksResponse: + payload: Dict[str, Any] = { + "project_id": project_id, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/jwks/{project_id}" + ) + + res = self.sync_client.get(url, params=payload) + return MultitenantsessionsjwksResponse.from_json( + res.response.status_code, res.json + ) + + async def MultiTenantSessionsJwks_async( + self, + project_id: str, + ) -> MultitenantsessionsjwksResponse: + payload: Dict[str, Any] = { + "project_id": project_id, + } + + url = self.api_base.route_with_sub_url( + self.sub_url, "/v1/b2b/sessions/jwks/{project_id}" + ) + + res = await self.async_client.get(url, params=payload) + return MultitenantsessionsjwksResponse.from_json(res.response.status, res.json) diff --git a/stytch/b2b/models/magic_service.py b/stytch/b2b/models/magic_service.py new file mode 100644 index 00000000..68ffd6f9 --- /dev/null +++ b/stytch/b2b/models/magic_service.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class MagiclinkredirectResponse(ResponseBase): + request_id: str + redirect_url: str + html_response_data: None + + +class MagiclinksredirectcaptchaResponse(ResponseBase): + request_id: str + redirect_url: str diff --git a/stytch/b2b/models/password_service.py b/stytch/b2b/models/password_service.py new file mode 100644 index 00000000..8e3f6be3 --- /dev/null +++ b/stytch/b2b/models/password_service.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + + +from stytch.core.models import ResponseBase + + +class PasswordsstrengthcheckResponse(ResponseBase): + request_id: str + valid_password: bool + score: None + breached_password: bool + feedback: None + strength_policy: str + breach_detection_on_create: bool diff --git a/stytch/b2b/models/session_service.py b/stytch/b2b/models/session_service.py new file mode 100644 index 00000000..9323396e --- /dev/null +++ b/stytch/b2b/models/session_service.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 + +from typing import Any, Dict, List + +from stytch.core.models import ResponseBase + + +class MultitenantsessionsjwksResponse(ResponseBase): + keys: List[Dict[str, Any]] + request_id: str diff --git a/stytch/models/discovery_service.py b/stytch/models/discovery_service.py index dcfd20d5..e5a0d9b4 100644 --- a/stytch/models/discovery_service.py +++ b/stytch/models/discovery_service.py @@ -1,30 +1 @@ #!/usr/bin/env python3 - - -from stytch.core.models import ResponseBase - - -class DiscoveryorganizationsResponse(ResponseBase): - request_id: str - email_address: str - discovered_organizations: None - - -class DiscoveryintermediatesessionexchangeResponse(ResponseBase): - request_id: str - member_id: str - member_session: None - session_token: str - session_jwt: str - member: None - organization: None - - -class DiscoveryorganizationcreateResponse(ResponseBase): - request_id: str - member_id: str - member_session: None - session_token: str - session_jwt: str - member: None - organization: None diff --git a/stytch/models/magic_service.py b/stytch/models/magic_service.py index 17bf4ae7..019b658b 100644 --- a/stytch/models/magic_service.py +++ b/stytch/models/magic_service.py @@ -68,6 +68,12 @@ class MagiclinksemailrevokeinviteResponse(ResponseBase): request_id: str +class MagiclinkscreateResponse(ResponseBase): + request_id: str + user_id: str + token: str + + class MagiclinkredirectResponse(ResponseBase): request_id: str redirect_url: str @@ -77,9 +83,3 @@ class MagiclinkredirectResponse(ResponseBase): class MagiclinksredirectcaptchaResponse(ResponseBase): request_id: str redirect_url: str - - -class MagiclinkscreateResponse(ResponseBase): - request_id: str - user_id: str - token: str diff --git a/stytch/models/multi_tenant_password_service.py b/stytch/models/multi_tenant_password_service.py index 0384a13a..e5a0d9b4 100644 --- a/stytch/models/multi_tenant_password_service.py +++ b/stytch/models/multi_tenant_password_service.py @@ -1,70 +1 @@ #!/usr/bin/env python3 - - -from stytch.core.models import ResponseBase - - -class MultitenantpasswordstrengthcheckResponse(ResponseBase): - request_id: str - valid_password: bool - score: None - breached_password: bool - luds_feedback: None - strength_policy: str - breach_detection_on_create: bool - zxcvbn_feedback: None - - -class MultitenantpasswordmigrateResponse(ResponseBase): - request_id: str - member_id: str - member_created: bool - member: None - organization: None - - -class MultitenantpasswordauthenticateResponse(ResponseBase): - request_id: str - member_id: str - organization_id: str - member: None - session_token: str - session_jwt: str - member_session: None - organization: None - - -class MultitenantpasswordemailresetstartResponse(ResponseBase): - request_id: str - member_id: str - member_email_id: str - - -class MultitenantpasswordemailresetResponse(ResponseBase): - request_id: str - member_id: str - member_email_id: str - organization_id: str - member: None - session_token: str - session_jwt: str - member_session: None - organization: None - - -class MultitenantpasswordsessionresetResponse(ResponseBase): - request_id: str - member_id: str - member_session: None - member: None - organization: None - - -class MultitenantpasswordexistingpasswordresetResponse(ResponseBase): - request_id: str - member_id: str - member_session: None - member: None - session_token: str - session_jwt: str - organization: None diff --git a/stytch/models/multi_tenant_session_service.py b/stytch/models/multi_tenant_session_service.py index f68b421d..e5a0d9b4 100644 --- a/stytch/models/multi_tenant_session_service.py +++ b/stytch/models/multi_tenant_session_service.py @@ -1,32 +1 @@ #!/usr/bin/env python3 - - -from stytch.core.models import ResponseBase - - -class MultitenantsessionsgetResponse(ResponseBase): - request_id: str - member_sessions: None - - -class MultitenantsessionsauthenticateResponse(ResponseBase): - request_id: str - member_session: None - session_token: str - session_jwt: str - member: None - organization: None - - -class MultitenantsessionsrevokeResponse(ResponseBase): - request_id: str - - -class MultitenantsessionsexchangeResponse(ResponseBase): - request_id: str - member_id: str - member_session: None - session_token: str - session_jwt: str - member: None - organization: None diff --git a/stytch/models/o_auth_service.py b/stytch/models/o_auth_service.py index 5b7831c5..98bd59ac 100644 --- a/stytch/models/o_auth_service.py +++ b/stytch/models/o_auth_service.py @@ -1,8 +1,7 @@ #!/usr/bin/env python3 -from typing import Optional -from stytch.core.models import OAuthSession, ResponseBase, StytchSession, User +from stytch.core.models import OAuthSession, ResponseBase, User class OauthattachResponse(ResponseBase): @@ -10,184 +9,6 @@ class OauthattachResponse(ResponseBase): oauth_attach_token: str -class OauthgoogleonetapstartResponse(ResponseBase): - request_id: str - google_client_id: str - stytch_csrf_token: str - oauth_callback_id: str - - -class OauthgooglestartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthgoogleidtokenauthenticateResponse(ResponseBase): - request_id: str - user_id: str - provider_subject: str - session: Optional[StytchSession] - session_token: str - session_jwt: str - user: User - reset_sessions: bool - user_created: bool - - -class OauthmicrosoftstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthapplestartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthappleidtokenauthenticateResponse(ResponseBase): - request_id: str - user_id: str - provider_subject: str - session: Optional[StytchSession] - session_token: str - session_jwt: str - user: User - reset_sessions: bool - user_created: bool - - -class OauthgithubstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthfacebookstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthamazonstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthbitbucketstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthcoinbasestartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthdiscordstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthfigmastartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthgitlabstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthinstagramstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthlinkedinstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthshopifystartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthslackstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthsnapchatstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthspotifystartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthsteamstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthtiktokstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthtwitchstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - -class OauthtwitterstartResponse(ResponseBase): - request_id: str - redirect_url: str - oauth_state: str - cname_domain: str - - class OauthauthenticateResponse(ResponseBase): request_id: str user_id: str diff --git a/stytch/models/organization_service.py b/stytch/models/organization_service.py index 5baa949e..e5a0d9b4 100644 --- a/stytch/models/organization_service.py +++ b/stytch/models/organization_service.py @@ -1,71 +1 @@ #!/usr/bin/env python3 - -from typing import List - -from stytch.b2b.core.models import Member, Organization -from stytch.core.models import ResponseBase - - -class OrganizationscreateResponse(ResponseBase): - request_id: str - organization: Organization - - -class OrganizationsgetResponse(ResponseBase): - request_id: str - organization: Organization - - -class OrganizationsupdateResponse(ResponseBase): - request_id: str - organization: Organization - - -class OrganizationsdeleteResponse(ResponseBase): - request_id: str - organization_id: str - - -class OrganizationsmembercreateResponse(ResponseBase): - request_id: str - member_id: str - member: None - organization: Organization - - -class OrganizationsmemberupdateResponse(ResponseBase): - request_id: str - member_id: str - member: None - organization: Organization - - -class OrganizationsmemberdeleteResponse(ResponseBase): - request_id: str - member_id: str - - -class OrganizationssearchexternalResponse(ResponseBase): - request_id: str - organizations: List[Organization] - results_metadata: ResultsMetadata - - -class OrganizationsmembersearchexternalResponse(ResponseBase): - request_id: str - members: List[Member] - results_metadata: ResultsMetadata - - -class OrganizationsmemberdeletepasswordResponse(ResponseBase): - request_id: str - member_id: str - member: None - organization: None - - -class OrganizationsmembergetResponse(ResponseBase): - request_id: str - member_id: str - member: None - organization: None diff --git a/stytch/models/password_service.py b/stytch/models/password_service.py index 8329ba21..ba16b8b3 100644 --- a/stytch/models/password_service.py +++ b/stytch/models/password_service.py @@ -24,16 +24,6 @@ class PasswordsauthenticateResponse(ResponseBase): user: User -class PasswordsstrengthcheckResponse(ResponseBase): - request_id: str - valid_password: bool - score: None - breached_password: bool - feedback: None - strength_policy: str - breach_detection_on_create: bool - - class PasswordsemailresetstartResponse(ResponseBase): request_id: str user_id: str @@ -71,3 +61,13 @@ class PasswordsmigrateResponse(ResponseBase): email_id: str user_created: bool user: User + + +class PasswordsstrengthcheckResponse(ResponseBase): + request_id: str + valid_password: bool + score: None + breached_password: bool + feedback: None + strength_policy: str + breach_detection_on_create: bool diff --git a/stytch/models/session_service.py b/stytch/models/session_service.py index d94ccf9e..13802d0b 100644 --- a/stytch/models/session_service.py +++ b/stytch/models/session_service.py @@ -25,8 +25,3 @@ class SessionsrevokeResponse(ResponseBase): class SessionsjwksResponse(ResponseBase): keys: List[Dict[str, Any]] request_id: str - - -class MultitenantsessionsjwksResponse(ResponseBase): - keys: List[Dict[str, Any]] - request_id: str diff --git a/stytch/models/sso_service.py b/stytch/models/sso_service.py index 9516b33f..e5a0d9b4 100644 --- a/stytch/models/sso_service.py +++ b/stytch/models/sso_service.py @@ -1,64 +1 @@ #!/usr/bin/env python3 - -from typing import Optional - -from stytch.core.models import ResponseBase - - -class CreateoidcconnectionResponse(ResponseBase): - request_id: str - connection: None - - -class CreatesamlconnectionResponse(ResponseBase): - request_id: str - connection: None - - -class UpdateoidcconnectionResponse(ResponseBase): - request_id: str - connection: None - warning: Optional[str] = None - - -class UpdatesamlconnectionResponse(ResponseBase): - request_id: str - connection: None - - -class UpdatesamlconnectionbyurlResponse(ResponseBase): - request_id: str - connection: None - - -class UpdatesamlconnectionbydocResponse(ResponseBase): - request_id: str - connection: None - - -class GetssoconnectionsResponse(ResponseBase): - request_id: str - saml_connections: None - oidc_connections: None - - -class DeletessoconnectionResponse(ResponseBase): - request_id: str - connection_id: str - - -class SsoauthenticateResponse(ResponseBase): - request_id: str - member_id: str - organization_id: str - member: None - session_token: str - session_jwt: str - member_session: None - reset_session: bool - organization: None - - -class DeletesamlverificationcertificateResponse(ResponseBase): - request_id: str - certificate_id: str