@@ -0,0 +1,38 @@ +import logging + +from asgiref.sync import sync_to_async +from ninja import Router +from ninja.errors import HttpError + +from authentication.models import EmailToken +from authentication.schemas import ConfirmInSchema, TokensOutSchema + +from django.utils.translation import gettext as _ +from rest_framework_simplejwt.tokens import RefreshToken + +logger = logging.getLogger(__name__) + +router = Router(tags=['auth']) + + +@router.post('confirm', auth=None, tags=['auth/confirm'], response=TokensOutSchema) +async def confirm_user(request, payload: ConfirmInSchema): + try: + token = await EmailToken.objects.select_related('user').aget(key=payload.token) + user = token.user + await token.adelete() + if user.is_confirmed: + raise HttpError(400, _('User is already confirmed')) + user.is_confirmed = True + await user.asave() + refresh = await sync_to_async(RefreshToken.for_user)(user) + access = refresh.access_token + return TokensOutSchema(access=str(access), refresh=str(refresh)) + except EmailToken.DoesNotExist: + raise HttpError(400, _('No email token found')) + except HttpError as exc: + raise HttpError(exc.status_code, exc.message) + except Exception as exc: + logger.exception(exc) + raise HttpError(500, _('Could not confirm email, please try again.')) + @@ -270,6 +270,10 @@ class UserService: @atomic def delete_user(self, request: Request): logout(request) + + if self.user.account_type in ('business_admin', 'business_security', 'business_account'): + self.user.business_account.delete() + self.user.is_deleted = True self.user.is_confirmed = False self.user.save() @@ -51,3 +51,11 @@ class RefreshInSchema(Schema): class AccessOutSchema(Schema): access: str + +class ConfirmInSchema(Schema): + token: str + + +class TokensOutSchema(Schema): + access: str + refresh: str @@ -18,6 +18,7 @@ from backend.public import urlpatterns as public_urlpatterns api = NinjaAPI(title='AIR API', version='1.0.0', docs_url=None) compatibility_api = NinjaAPI(title='AIR API DEBUG', version='0.0.1', docs_url=None) +compatibility_api_v2 = NinjaAPI(title='AIR API DEBUG v2', version='2.0.0', docs_url=None) api.add_router('copywrite/', 'tools.copywrite.routes.v1.router') api.add_router('users/', 'users.routes.v1.router') @@ -29,6 +30,8 @@ compatibility_api.add_router('payments/', 'payments.routes.v1.router') compatibility_api.add_router('reports/', 'reports.routes.v1.router') compatibility_api.add_router('ml_model/', 'ml_model.routes.v1.router') +compatibility_api_v2.add_router('auth/', 'authentication.routes.v2.router') + logger = logging.getLogger(__name__) @@ -72,6 +75,7 @@ if settings.DEBUG: ] api.docs_url = '/docs' compatibility_api.docs_url = '/docs' + compatibility_api_v2.docs_url = '/docs' urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) @@ -87,6 +91,7 @@ urlpatterns += [ path('api/v1/public/', include('tools.public_api.urls')), path('api/v1/api/', api.urls), path('api/v1/', compatibility_api.urls), + path('api/v1/v2/', compatibility_api_v2.urls), ] urlpatterns += public_urlpatterns