Skip to content

Commit 1586251

Browse files
committed
refactor: Allow emailverification init without directly using ParentRecipeEmailVerificationConfig
1 parent 34e492a commit 1586251

File tree

12 files changed

+130
-176
lines changed

12 files changed

+130
-176
lines changed

supertokens_python/recipe/emailverification/__init__.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@
1313
# under the License.
1414
from __future__ import annotations
1515

16-
from typing import TYPE_CHECKING, Callable
16+
from typing import TYPE_CHECKING, Callable, Union, Optional, Any, Awaitable, Dict
1717

1818
from . import exceptions as ex
1919
from . import utils
2020
from .emaildelivery import services as emaildelivery_services
2121
from . import recipe
22+
from .interfaces import TypeGetEmailForUserIdFunction
23+
from .types import EmailTemplateVars, User
24+
from ...ingredients.emaildelivery.types import EmailDeliveryConfig
2225

2326
InputOverrideConfig = utils.OverrideConfig
2427
ParentRecipeEmailVerificationConfig = utils.ParentRecipeEmailVerificationConfig
@@ -33,8 +36,22 @@
3336

3437
from ...recipe_module import RecipeModule
3538

39+
from .utils import MODE_TYPE, OverrideConfig
40+
3641

3742
def init(
38-
config: ParentRecipeEmailVerificationConfig,
43+
mode: MODE_TYPE = "OPTIONAL",
44+
email_delivery: Union[EmailDeliveryConfig[EmailTemplateVars], None] = None,
45+
get_email_for_user_id: Optional[TypeGetEmailForUserIdFunction] = None,
46+
create_and_send_custom_email: Union[
47+
Callable[[User, str, Dict[str, Any]], Awaitable[None]], None
48+
] = None,
49+
override: Union[OverrideConfig, None] = None,
3950
) -> Callable[[AppInfo], RecipeModule]:
40-
return EmailVerificationRecipe.init(config)
51+
return EmailVerificationRecipe.init(
52+
mode,
53+
email_delivery,
54+
get_email_for_user_id,
55+
create_and_send_custom_email,
56+
override,
57+
)

supertokens_python/recipe/emailverification/recipe.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from __future__ import annotations
1515

1616
from os import environ
17-
from typing import TYPE_CHECKING, List, Union, Any, Dict, Callable, Optional
17+
from typing import TYPE_CHECKING, List, Union, Any, Dict, Callable, Optional, Awaitable
1818

1919
from supertokens_python.exceptions import SuperTokensError, raise_general_exception
2020
from supertokens_python.ingredients.emaildelivery import EmailDeliveryIngredient
@@ -25,6 +25,8 @@
2525
EmailVerificationIngredients,
2626
VerificationEmailTemplateVars,
2727
VerificationEmailTemplateVarsUser,
28+
EmailTemplateVars,
29+
User,
2830
)
2931
from supertokens_python.recipe_module import APIHandled, RecipeModule
3032
from .ev_claim import EmailVerificationClaimValidators
@@ -48,6 +50,7 @@
4850
from ..session import SessionRecipe
4951
from ..session.claim_base_classes.boolean_claim import BooleanClaim
5052
from ..session.interfaces import SessionContainer
53+
from ...ingredients.emaildelivery.types import EmailDeliveryConfig
5154
from ...logger import log_debug_message
5255
from ...post_init_callbacks import PostSTInitCallbacks
5356

@@ -65,6 +68,8 @@
6568
from .utils import (
6669
ParentRecipeEmailVerificationConfig,
6770
validate_and_normalise_user_input,
71+
MODE_TYPE,
72+
OverrideConfig,
6873
)
6974

7075

@@ -179,10 +184,25 @@ def get_all_cors_headers(self) -> List[str]:
179184
return []
180185

181186
@staticmethod
182-
def init(config: ParentRecipeEmailVerificationConfig):
187+
def init(
188+
mode: MODE_TYPE = "OPTIONAL",
189+
email_delivery: Union[EmailDeliveryConfig[EmailTemplateVars], None] = None,
190+
get_email_for_user_id: Optional[TypeGetEmailForUserIdFunction] = None,
191+
create_and_send_custom_email: Union[
192+
Callable[[User, str, Dict[str, Any]], Awaitable[None]], None
193+
] = None,
194+
override: Union[OverrideConfig, None] = None,
195+
):
183196
def func(app_info: AppInfo):
184197
if EmailVerificationRecipe.__instance is None:
185198
ingredients = EmailVerificationIngredients(email_delivery=None)
199+
config = ParentRecipeEmailVerificationConfig(
200+
mode,
201+
email_delivery,
202+
get_email_for_user_id,
203+
create_and_send_custom_email,
204+
override,
205+
)
186206
EmailVerificationRecipe.__instance = EmailVerificationRecipe(
187207
EmailVerificationRecipe.recipe_id,
188208
app_info,
@@ -374,9 +394,6 @@ async def generate_email_verify_token_post(
374394
)
375395
return GenerateEmailVerifyTokenPostOkResult()
376396

377-
if isinstance(email_info, UnknownUserIdError):
378-
pass
379-
380397
raise Exception(
381398
"Should never come here: UNKNOWN_USER_ID or invalid result from get_email_for_user_id"
382399
)

supertokens_python/recipe/emailverification/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ def __init__(
4848

4949

5050
class ParentRecipeEmailVerificationConfig:
51-
# TODO: Now that this class will be used directly, we might want to rename this?
51+
# TODO: Rename this? ^
5252
def __init__(
5353
self,
54-
mode: MODE_TYPE,
54+
mode: MODE_TYPE = "OPTIONAL",
5555
email_delivery: Union[EmailDeliveryConfig[EmailTemplateVars], None] = None,
5656
get_email_for_user_id: Optional[TypeGetEmailForUserIdFunction] = None,
5757
create_and_send_custom_email: Union[

tests/auth-react/django3x/mysite/utils.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
from supertokens_python.recipe.emailverification.types import User as EVUser
2929
from supertokens_python.recipe.emailverification import (
3030
EmailVerificationRecipe,
31-
ParentRecipeEmailVerificationConfig,
3231
)
3332
from supertokens_python.recipe.emailverification import (
3433
InputOverrideConfig as EVInputOverrideConfig,
@@ -847,11 +846,9 @@ async def authorisation_url_get(
847846
recipe_list = [
848847
session.init(override=session.InputOverrideConfig(apis=override_session_apis)),
849848
emailverification.init(
850-
ParentRecipeEmailVerificationConfig(
851-
mode="REQUIRED",
852-
create_and_send_custom_email=ev_create_and_send_custom_email, # TODO: Is it correct to create a seperate func for this?
853-
override=EVInputOverrideConfig(apis=override_email_verification_apis),
854-
)
849+
mode="REQUIRED",
850+
create_and_send_custom_email=ev_create_and_send_custom_email, # TODO: Is it correct to create a seperate func for this?
851+
override=EVInputOverrideConfig(apis=override_email_verification_apis),
855852
),
856853
emailpassword.init(
857854
sign_up_feature=emailpassword.InputSignUpFeature(form_fields),

tests/auth-react/fastapi-server/app.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,6 @@
6565
from supertokens_python.recipe.emailverification.interfaces import (
6666
APIOptions as EVAPIOptions,
6767
)
68-
from supertokens_python.recipe.emailverification.utils import (
69-
ParentRecipeEmailVerificationConfig,
70-
)
7168
from supertokens_python.recipe.jwt import JWTRecipe
7269
from supertokens_python.recipe.passwordless import (
7370
ContactEmailOnlyConfig,
@@ -904,11 +901,9 @@ async def authorisation_url_get(
904901
recipe_list = [
905902
session.init(override=session.InputOverrideConfig(apis=override_session_apis)),
906903
emailverification.init(
907-
ParentRecipeEmailVerificationConfig(
908-
mode="REQUIRED",
909-
create_and_send_custom_email=ev_create_and_send_custom_email, # TODO: Is this correct?
910-
override=EVInputOverrideConfig(apis=override_email_verification_apis),
911-
)
904+
mode="REQUIRED",
905+
create_and_send_custom_email=ev_create_and_send_custom_email, # TODO: Is this correct?
906+
override=EVInputOverrideConfig(apis=override_email_verification_apis),
912907
),
913908
emailpassword.init(
914909
sign_up_feature=emailpassword.InputSignUpFeature(form_fields),

tests/auth-react/flask-server/app.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@
5757
from supertokens_python.recipe.emailverification.interfaces import (
5858
APIOptions as EVAPIOptions,
5959
)
60-
from supertokens_python.recipe.emailverification.utils import (
61-
ParentRecipeEmailVerificationConfig,
62-
)
6360
from supertokens_python.recipe.jwt import JWTRecipe
6461
from supertokens_python.recipe.passwordless import (
6562
ContactEmailOnlyConfig,
@@ -891,11 +888,9 @@ async def authorisation_url_get(
891888
recipe_list = [
892889
session.init(override=session.InputOverrideConfig(apis=override_session_apis)),
893890
emailverification.init(
894-
ParentRecipeEmailVerificationConfig(
895-
mode="REQUIRED",
896-
create_and_send_custom_email=ev_create_and_send_custom_email,
897-
override=EVInputOverrideConfig(apis=override_email_verification_apis),
898-
)
891+
mode="REQUIRED",
892+
create_and_send_custom_email=ev_create_and_send_custom_email,
893+
override=EVInputOverrideConfig(apis=override_email_verification_apis),
899894
),
900895
emailpassword.init(
901896
sign_up_feature=emailpassword.InputSignUpFeature(form_fields),

tests/emailpassword/test_emaildelivery.py

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,6 @@
4848
VerificationEmailTemplateVars,
4949
)
5050
from supertokens_python.recipe.emailverification.types import User as EVUser
51-
from supertokens_python.recipe.emailverification.utils import (
52-
ParentRecipeEmailVerificationConfig,
53-
)
5451
from supertokens_python.recipe.session import SessionRecipe
5552
from supertokens_python.recipe.session.recipe_implementation import (
5653
RecipeImplementation as SessionRecipeImplementation,
@@ -530,9 +527,7 @@ async def test_email_verification_default_backward_compatibility(
530527
),
531528
framework="fastapi",
532529
recipe_list=[
533-
emailverification.init(
534-
ParentRecipeEmailVerificationConfig(mode="OPTIONAL")
535-
),
530+
emailverification.init(),
536531
emailpassword.init(),
537532
session.init(),
538533
],
@@ -597,9 +592,7 @@ async def test_email_verification_default_backward_compatibility_suppress_error(
597592
),
598593
framework="fastapi",
599594
recipe_list=[
600-
emailverification.init(
601-
ParentRecipeEmailVerificationConfig(mode="OPTIONAL")
602-
),
595+
emailverification.init(),
603596
emailpassword.init(),
604597
session.init(),
605598
],
@@ -672,10 +665,8 @@ async def custom_create_and_send_custom_email(
672665
framework="fastapi",
673666
recipe_list=[
674667
emailverification.init(
675-
ParentRecipeEmailVerificationConfig(
676-
mode="REQUIRED",
677-
create_and_send_custom_email=custom_create_and_send_custom_email,
678-
)
668+
mode="REQUIRED",
669+
create_and_send_custom_email=custom_create_and_send_custom_email,
679670
),
680671
emailpassword.init(),
681672
session.init(),
@@ -741,13 +732,11 @@ async def send_email(
741732
framework="fastapi",
742733
recipe_list=[
743734
emailverification.init(
744-
ParentRecipeEmailVerificationConfig(
745-
mode="OPTIONAL",
746-
email_delivery=EmailDeliveryConfig(
747-
service=None,
748-
override=email_delivery_override,
749-
),
750-
)
735+
mode="OPTIONAL",
736+
email_delivery=EmailDeliveryConfig(
737+
service=None,
738+
override=email_delivery_override,
739+
),
751740
),
752741
emailpassword.init(),
753742
session.init(),
@@ -874,13 +863,11 @@ async def send_email_override(
874863
framework="fastapi",
875864
recipe_list=[
876865
emailverification.init(
877-
ParentRecipeEmailVerificationConfig(
878-
mode="OPTIONAL",
879-
email_delivery=EmailDeliveryConfig(
880-
service=email_delivery_service,
881-
override=email_delivery_override,
882-
),
883-
)
866+
mode="OPTIONAL",
867+
email_delivery=EmailDeliveryConfig(
868+
service=email_delivery_service,
869+
override=email_delivery_override,
870+
),
884871
),
885872
emailpassword.init(),
886873
session.init(),

0 commit comments

Comments
 (0)