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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion supertokens_python/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,12 @@ def default_api_override(
overrides = plugin.get(recipe_id)
if overrides is not None:
if overrides.config is not None:
config = overrides.config(config)
overrideable_config = config.to_overrideable_config()
overridden_config = overrides.config(overrideable_config)

config = config.from_overrideable_config(
overrideable_config=overridden_config,
) # type: ignore - various config types used, but will never pass config from a different recipe

if overrides.functions is not None:
function_layers.append(overrides.functions)
Expand Down
27 changes: 26 additions & 1 deletion supertokens_python/recipe/accountlinking/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
BaseConfigWithoutAPIOverride,
BaseNormalisedConfigWithoutAPIOverride,
BaseNormalisedOverrideConfigWithoutAPI,
BaseOverrideableConfig,
BaseOverrideConfigWithoutAPI,
)

Expand Down Expand Up @@ -144,7 +145,9 @@ def __init__(self, should_require_verification: bool):
self.should_require_verification = should_require_verification


class AccountLinkingConfig(BaseConfigWithoutAPIOverride[RecipeInterface]):
class AccountLinkingOverrideableConfig(BaseOverrideableConfig):
"""Input config properties overrideable using the plugin config overrides"""

on_account_linked: Optional[
Callable[[User, RecipeLevelUser, Dict[str, Any]], Awaitable[None]]
] = None
Expand All @@ -162,6 +165,28 @@ class AccountLinkingConfig(BaseConfigWithoutAPIOverride[RecipeInterface]):
] = None


class AccountLinkingConfig(
AccountLinkingOverrideableConfig,
BaseConfigWithoutAPIOverride[RecipeInterface, AccountLinkingOverrideableConfig],
):
def to_overrideable_config(self) -> AccountLinkingOverrideableConfig:
"""Create a `AccountLinkingOverrideableConfig` from the current config."""
return AccountLinkingOverrideableConfig(**self.model_dump())

def from_overrideable_config(
self,
overrideable_config: AccountLinkingOverrideableConfig,
) -> "AccountLinkingConfig":
"""
Create a `AccountLinkingConfig` from a `AccountLinkingOverrideableConfig`.
Not a classmethod since it needs to be used in a dynamic context within plugins.
"""
return AccountLinkingConfig(
**overrideable_config.model_dump(),
override=self.override,
)


class NormalisedAccountLinkingConfig(
BaseNormalisedConfigWithoutAPIOverride[RecipeInterface]
):
Expand Down
27 changes: 26 additions & 1 deletion supertokens_python/recipe/dashboard/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
BaseConfig,
BaseNormalisedConfig,
BaseNormalisedOverrideConfig,
BaseOverrideableConfig,
BaseOverrideConfig,
)

Expand Down Expand Up @@ -85,11 +86,35 @@ def to_json(self) -> Dict[str, Any]:
"""Deprecated, use `DashboardOverrideConfig` instead."""


class DashboardConfig(BaseConfig[RecipeInterface, APIInterface]):
class DashboardOverrideableConfig(BaseOverrideableConfig):
"""Input config properties overrideable using the plugin config overrides"""

api_key: Optional[str] = None
admins: Optional[List[str]] = None


class DashboardConfig(
DashboardOverrideableConfig,
BaseConfig[RecipeInterface, APIInterface, DashboardOverrideableConfig],
):
def to_overrideable_config(self) -> DashboardOverrideableConfig:
"""Create a `DashboardOverrideableConfig` from the current config."""
return DashboardOverrideableConfig(**self.model_dump())

def from_overrideable_config(
self,
overrideable_config: DashboardOverrideableConfig,
) -> "DashboardConfig":
"""
Create a `DashboardConfig` from a `DashboardOverrideableConfig`.
Not a classmethod since it needs to be used in a dynamic context within plugins.
"""
return DashboardConfig(
**overrideable_config.model_dump(),
override=self.override,
)


class NormalisedDashboardConfig(BaseNormalisedConfig[RecipeInterface, APIInterface]):
api_key: Optional[str]
admins: Optional[List[str]]
Expand Down
27 changes: 26 additions & 1 deletion supertokens_python/recipe/emailpassword/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
BaseConfig,
BaseNormalisedConfig,
BaseNormalisedOverrideConfig,
BaseOverrideableConfig,
BaseOverrideConfig,
)
from supertokens_python.utils import get_filtered_list
Expand Down Expand Up @@ -225,11 +226,35 @@ def validate_and_normalise_reset_password_using_token_config(
"""Deprecated, use `EmailPasswordOverrideConfig` instead."""


class EmailPasswordConfig(BaseConfig[RecipeInterface, APIInterface]):
class EmailPasswordOverrideableConfig(BaseOverrideableConfig):
"""Input config properties overrideable using the plugin config overrides"""

sign_up_feature: Union[InputSignUpFeature, None] = None
email_delivery: Union[EmailDeliveryConfig[EmailTemplateVars], None] = None


class EmailPasswordConfig(
EmailPasswordOverrideableConfig,
BaseConfig[RecipeInterface, APIInterface, EmailPasswordOverrideableConfig],
):
def to_overrideable_config(self) -> EmailPasswordOverrideableConfig:
"""Create a `EmailPasswordOverrideableConfig` from the current config."""
return EmailPasswordOverrideableConfig(**self.model_dump())

def from_overrideable_config(
self,
overrideable_config: EmailPasswordOverrideableConfig,
) -> "EmailPasswordConfig":
"""
Create a `EmailPasswordConfig` from a `EmailPasswordOverrideableConfig`.
Not a classmethod since it needs to be used in a dynamic context within plugins.
"""
return EmailPasswordConfig(
**overrideable_config.model_dump(),
override=self.override,
)


class NormalisedEmailPasswordConfig(
BaseNormalisedConfig[RecipeInterface, APIInterface]
):
Expand Down
27 changes: 26 additions & 1 deletion supertokens_python/recipe/emailverification/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
BaseConfig,
BaseNormalisedConfig,
BaseNormalisedOverrideConfig,
BaseOverrideableConfig,
BaseOverrideConfig,
)

Expand All @@ -50,12 +51,36 @@
"""Deprecated, use `EmailVerificationOverrideConfig` instead."""


class EmailVerificationConfig(BaseConfig[RecipeInterface, APIInterface]):
class EmailVerificationOverrideableConfig(BaseOverrideableConfig):
"""Input config properties overrideable using the plugin config overrides"""

mode: MODE_TYPE
email_delivery: Union[EmailDeliveryConfig[EmailTemplateVars], None] = None
get_email_for_recipe_user_id: Optional[TypeGetEmailForUserIdFunction] = None


class EmailVerificationConfig(
EmailVerificationOverrideableConfig,
BaseConfig[RecipeInterface, APIInterface, EmailVerificationOverrideableConfig],
):
def to_overrideable_config(self) -> EmailVerificationOverrideableConfig:
"""Create a `EmailVerificationOverrideableConfig` from the current config."""
return EmailVerificationOverrideableConfig(**self.model_dump())

def from_overrideable_config(
self,
overrideable_config: EmailVerificationOverrideableConfig,
) -> "EmailVerificationConfig":
"""
Create a `EmailVerificationConfig` from a `EmailVerificationOverrideableConfig`.
Not a classmethod since it needs to be used in a dynamic context within plugins.
"""
return EmailVerificationConfig(
**overrideable_config.model_dump(),
override=self.override,
)


class NormalisedEmailVerificationConfig(
BaseNormalisedConfig[RecipeInterface, APIInterface]
):
Expand Down
27 changes: 26 additions & 1 deletion supertokens_python/recipe/jwt/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
BaseConfig,
BaseNormalisedConfig,
BaseNormalisedOverrideConfig,
BaseOverrideableConfig,
BaseOverrideConfig,
)

Expand All @@ -32,10 +33,34 @@
"""Deprecated, use `JWTOverrideConfig` instead."""


class JWTConfig(BaseConfig[RecipeInterface, APIInterface]):
class JWTOverrideableConfig(BaseOverrideableConfig):
"""Input config properties overrideable using the plugin config overrides"""

jwt_validity_seconds: Optional[int] = None


class JWTConfig(
JWTOverrideableConfig,
BaseConfig[RecipeInterface, APIInterface, JWTOverrideableConfig],
):
def to_overrideable_config(self) -> JWTOverrideableConfig:
"""Create a `JWTOverrideableConfig` from the current config."""
return JWTOverrideableConfig(**self.model_dump())

def from_overrideable_config(
self,
overrideable_config: JWTOverrideableConfig,
) -> "JWTConfig":
"""
Create a `JWTConfig` from a `JWTOverrideableConfig`.
Not a classmethod since it needs to be used in a dynamic context within plugins.
"""
return JWTConfig(
**overrideable_config.model_dump(),
override=self.override,
)


class NormalisedJWTConfig(BaseNormalisedConfig[RecipeInterface, APIInterface]):
jwt_validity_seconds: int

Expand Down
27 changes: 26 additions & 1 deletion supertokens_python/recipe/multifactorauth/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
BaseConfig,
BaseNormalisedConfig,
BaseNormalisedOverrideConfig,
BaseOverrideableConfig,
BaseOverrideConfig,
)

Expand Down Expand Up @@ -50,10 +51,34 @@ def __init__(self, c: Dict[str, Any], v: bool):
"""Deprecated, use `MultiFactorAuthOverrideConfig` instead."""


class MultiFactorAuthConfig(BaseConfig[RecipeInterface, APIInterface]):
class MultiFactorAuthOverrideableConfig(BaseOverrideableConfig):
"""Input config properties overrideable using the plugin config overrides"""

first_factors: Optional[List[str]] = None


class MultiFactorAuthConfig(
MultiFactorAuthOverrideableConfig,
BaseConfig[RecipeInterface, APIInterface, MultiFactorAuthOverrideableConfig],
):
def to_overrideable_config(self) -> MultiFactorAuthOverrideableConfig:
"""Create a `MultiFactorAuthOverrideableConfig` from the current config."""
return MultiFactorAuthOverrideableConfig(**self.model_dump())

def from_overrideable_config(
self,
overrideable_config: MultiFactorAuthOverrideableConfig,
) -> "MultiFactorAuthConfig":
"""
Create a `MultiFactorAuthConfig` from a `MultiFactorAuthOverrideableConfig`.
Not a classmethod since it needs to be used in a dynamic context within plugins.
"""
return MultiFactorAuthConfig(
**overrideable_config.model_dump(),
override=self.override,
)


class NormalisedMultiFactorAuthConfig(
BaseNormalisedConfig[RecipeInterface, APIInterface]
):
Expand Down
27 changes: 26 additions & 1 deletion supertokens_python/recipe/multitenancy/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
BaseConfig,
BaseNormalisedConfig,
BaseNormalisedOverrideConfig,
BaseOverrideableConfig,
BaseOverrideConfig,
)
from supertokens_python.utils import (
Expand Down Expand Up @@ -74,10 +75,34 @@ async def on_recipe_disabled_for_tenant(
"""Deprecated, use `MultitenancyOverrideConfig` instead."""


class MultitenancyConfig(BaseConfig[RecipeInterface, APIInterface]):
class MultitenancyOverrideableConfig(BaseOverrideableConfig):
"""Input config properties overrideable using the plugin config overrides"""

get_allowed_domains_for_tenant_id: Optional[TypeGetAllowedDomainsForTenantId] = None


class MultitenancyConfig(
MultitenancyOverrideableConfig,
BaseConfig[RecipeInterface, APIInterface, MultitenancyOverrideableConfig],
):
def to_overrideable_config(self) -> MultitenancyOverrideableConfig:
"""Create a `MultitenancyOverrideableConfig` from the current config."""
return MultitenancyOverrideableConfig(**self.model_dump())

def from_overrideable_config(
self,
overrideable_config: MultitenancyOverrideableConfig,
) -> "MultitenancyConfig":
"""
Create a `MultitenancyConfig` from a `MultitenancyOverrideableConfig`.
Not a classmethod since it needs to be used in a dynamic context within plugins.
"""
return MultitenancyConfig(
**overrideable_config.model_dump(),
override=self.override,
)


class NormalisedMultitenancyConfig(BaseNormalisedConfig[RecipeInterface, APIInterface]):
get_allowed_domains_for_tenant_id: Optional[TypeGetAllowedDomainsForTenantId]

Expand Down
28 changes: 27 additions & 1 deletion supertokens_python/recipe/oauth2provider/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
BaseConfig,
BaseNormalisedConfig,
BaseNormalisedOverrideConfig,
BaseOverrideableConfig,
BaseOverrideConfig,
)

Expand All @@ -30,7 +31,32 @@
"""Deprecated, use `OAuth2ProviderOverrideConfig` instead."""


class OAuth2ProviderConfig(BaseConfig[RecipeInterface, APIInterface]): ...
class OAuth2ProviderOverrideableConfig(BaseOverrideableConfig):
"""Input config properties overrideable using the plugin config overrides"""

...


class OAuth2ProviderConfig(
OAuth2ProviderOverrideableConfig,
BaseConfig[RecipeInterface, APIInterface, OAuth2ProviderOverrideableConfig],
):
def to_overrideable_config(self) -> OAuth2ProviderOverrideableConfig:
"""Create a `OAuth2ProviderOverrideableConfig` from the current config."""
return OAuth2ProviderOverrideableConfig(**self.model_dump())

def from_overrideable_config(
self,
overrideable_config: OAuth2ProviderOverrideableConfig,
) -> "OAuth2ProviderConfig":
"""
Create a `OAuth2ProviderConfig` from a `OAuth2ProviderOverrideableConfig`.
Not a classmethod since it needs to be used in a dynamic context within plugins.
"""
return OAuth2ProviderConfig(
**overrideable_config.model_dump(),
override=self.override,
)


class NormalisedOAuth2ProviderConfig(
Expand Down
Loading
Loading