Module supertokens_python.recipe.emailverification.api.implementation
Expand source code
# Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved.
#
# This software is licensed under the Apache License, Version 2.0 (the
# "License") as published by the Apache Software Foundation.
#
# You may not use this file except in compliance with the License. You may
# obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import annotations
from typing import TYPE_CHECKING, Any, Dict, Union
from supertokens_python.logger import log_debug_message
from supertokens_python.recipe.emailverification.interfaces import (
APIInterface, CreateEmailVerificationTokenEmailAlreadyVerifiedError,
EmailVerifyPostInvalidTokenError, EmailVerifyPostOkResult,
GenerateEmailVerifyTokenPostEmailAlreadyVerifiedError,
GenerateEmailVerifyTokenPostOkResult, IsEmailVerifiedGetOkResult,
VerifyEmailUsingTokenOkResult)
if TYPE_CHECKING:
from supertokens_python.recipe.emailverification.interfaces import (
APIOptions
)
from supertokens_python.recipe.emailverification.types import User, VerificationEmailTemplateVarsUser, \
VerificationEmailTemplateVars
from supertokens_python.recipe.session.asyncio import get_session
class APIImplementation(APIInterface):
async def email_verify_post(self, token: str, api_options: APIOptions, user_context: Dict[str, Any]) -> Union[EmailVerifyPostOkResult, EmailVerifyPostInvalidTokenError]:
response = await api_options.recipe_implementation.verify_email_using_token(token, user_context)
if isinstance(response, VerifyEmailUsingTokenOkResult):
return EmailVerifyPostOkResult(response.user)
return EmailVerifyPostInvalidTokenError()
async def is_email_verified_get(self, api_options: APIOptions, user_context: Dict[str, Any]) -> IsEmailVerifiedGetOkResult:
session = await get_session(api_options.request)
if session is None:
raise Exception('Session is undefined. Should not come here.')
user_id = session.get_user_id(user_context)
email = await api_options.config.get_email_for_user_id(user_id, user_context)
is_verified = await api_options.recipe_implementation.is_email_verified(user_id, email, user_context)
return IsEmailVerifiedGetOkResult(is_verified)
async def generate_email_verify_token_post(self, api_options: APIOptions, user_context: Dict[str, Any]) -> Union[GenerateEmailVerifyTokenPostOkResult, GenerateEmailVerifyTokenPostEmailAlreadyVerifiedError]:
session = await get_session(api_options.request)
if session is None:
raise Exception('Session is undefined. Should not come here.')
user_id = session.get_user_id(user_context)
email = await api_options.config.get_email_for_user_id(user_id, user_context)
token_result = await api_options.recipe_implementation.create_email_verification_token(user_id, email, user_context)
if isinstance(token_result, CreateEmailVerificationTokenEmailAlreadyVerifiedError):
log_debug_message("Email verification email not sent to %s because it is already verified", email)
return GenerateEmailVerifyTokenPostEmailAlreadyVerifiedError()
user = User(user_id, email)
email_verify_link = (await api_options.config.get_email_verification_url(
user, user_context)) + '?token=' + token_result.token + '&rid=' + api_options.recipe_id
log_debug_message("Sending email verification email to %s", email)
email_delivery_user = VerificationEmailTemplateVarsUser(user.user_id, user.email)
email_verification_email_delivery_input = VerificationEmailTemplateVars(
user=email_delivery_user,
email_verify_link=email_verify_link,
user_context=user_context
)
await api_options.email_delivery.ingredient_interface_impl.send_email(email_verification_email_delivery_input, user_context)
return GenerateEmailVerifyTokenPostOkResult()
Classes
class APIImplementation
-
Helper class that provides a standard way to create an ABC using inheritance.
Expand source code
class APIImplementation(APIInterface): async def email_verify_post(self, token: str, api_options: APIOptions, user_context: Dict[str, Any]) -> Union[EmailVerifyPostOkResult, EmailVerifyPostInvalidTokenError]: response = await api_options.recipe_implementation.verify_email_using_token(token, user_context) if isinstance(response, VerifyEmailUsingTokenOkResult): return EmailVerifyPostOkResult(response.user) return EmailVerifyPostInvalidTokenError() async def is_email_verified_get(self, api_options: APIOptions, user_context: Dict[str, Any]) -> IsEmailVerifiedGetOkResult: session = await get_session(api_options.request) if session is None: raise Exception('Session is undefined. Should not come here.') user_id = session.get_user_id(user_context) email = await api_options.config.get_email_for_user_id(user_id, user_context) is_verified = await api_options.recipe_implementation.is_email_verified(user_id, email, user_context) return IsEmailVerifiedGetOkResult(is_verified) async def generate_email_verify_token_post(self, api_options: APIOptions, user_context: Dict[str, Any]) -> Union[GenerateEmailVerifyTokenPostOkResult, GenerateEmailVerifyTokenPostEmailAlreadyVerifiedError]: session = await get_session(api_options.request) if session is None: raise Exception('Session is undefined. Should not come here.') user_id = session.get_user_id(user_context) email = await api_options.config.get_email_for_user_id(user_id, user_context) token_result = await api_options.recipe_implementation.create_email_verification_token(user_id, email, user_context) if isinstance(token_result, CreateEmailVerificationTokenEmailAlreadyVerifiedError): log_debug_message("Email verification email not sent to %s because it is already verified", email) return GenerateEmailVerifyTokenPostEmailAlreadyVerifiedError() user = User(user_id, email) email_verify_link = (await api_options.config.get_email_verification_url( user, user_context)) + '?token=' + token_result.token + '&rid=' + api_options.recipe_id log_debug_message("Sending email verification email to %s", email) email_delivery_user = VerificationEmailTemplateVarsUser(user.user_id, user.email) email_verification_email_delivery_input = VerificationEmailTemplateVars( user=email_delivery_user, email_verify_link=email_verify_link, user_context=user_context ) await api_options.email_delivery.ingredient_interface_impl.send_email(email_verification_email_delivery_input, user_context) return GenerateEmailVerifyTokenPostOkResult()
Ancestors
- APIInterface
- abc.ABC
Methods
async def email_verify_post(self, token: str, api_options: APIOptions, user_context: Dict[str, Any]) ‑> Union[EmailVerifyPostOkResult, EmailVerifyPostInvalidTokenError]
-
Expand source code
async def email_verify_post(self, token: str, api_options: APIOptions, user_context: Dict[str, Any]) -> Union[EmailVerifyPostOkResult, EmailVerifyPostInvalidTokenError]: response = await api_options.recipe_implementation.verify_email_using_token(token, user_context) if isinstance(response, VerifyEmailUsingTokenOkResult): return EmailVerifyPostOkResult(response.user) return EmailVerifyPostInvalidTokenError()
async def generate_email_verify_token_post(self, api_options: APIOptions, user_context: Dict[str, Any]) ‑> Union[GenerateEmailVerifyTokenPostOkResult, GenerateEmailVerifyTokenPostEmailAlreadyVerifiedError]
-
Expand source code
async def generate_email_verify_token_post(self, api_options: APIOptions, user_context: Dict[str, Any]) -> Union[GenerateEmailVerifyTokenPostOkResult, GenerateEmailVerifyTokenPostEmailAlreadyVerifiedError]: session = await get_session(api_options.request) if session is None: raise Exception('Session is undefined. Should not come here.') user_id = session.get_user_id(user_context) email = await api_options.config.get_email_for_user_id(user_id, user_context) token_result = await api_options.recipe_implementation.create_email_verification_token(user_id, email, user_context) if isinstance(token_result, CreateEmailVerificationTokenEmailAlreadyVerifiedError): log_debug_message("Email verification email not sent to %s because it is already verified", email) return GenerateEmailVerifyTokenPostEmailAlreadyVerifiedError() user = User(user_id, email) email_verify_link = (await api_options.config.get_email_verification_url( user, user_context)) + '?token=' + token_result.token + '&rid=' + api_options.recipe_id log_debug_message("Sending email verification email to %s", email) email_delivery_user = VerificationEmailTemplateVarsUser(user.user_id, user.email) email_verification_email_delivery_input = VerificationEmailTemplateVars( user=email_delivery_user, email_verify_link=email_verify_link, user_context=user_context ) await api_options.email_delivery.ingredient_interface_impl.send_email(email_verification_email_delivery_input, user_context) return GenerateEmailVerifyTokenPostOkResult()
async def is_email_verified_get(self, api_options: APIOptions, user_context: Dict[str, Any]) ‑> IsEmailVerifiedGetOkResult
-
Expand source code
async def is_email_verified_get(self, api_options: APIOptions, user_context: Dict[str, Any]) -> IsEmailVerifiedGetOkResult: session = await get_session(api_options.request) if session is None: raise Exception('Session is undefined. Should not come here.') user_id = session.get_user_id(user_context) email = await api_options.config.get_email_for_user_id(user_id, user_context) is_verified = await api_options.recipe_implementation.is_email_verified(user_id, email, user_context) return IsEmailVerifiedGetOkResult(is_verified)