33from __future__ import annotations
44
55import logging
6- from typing import TYPE_CHECKING , Annotated , Any , cast
6+ from typing import TYPE_CHECKING , Annotated , Any
77
88from advanced_alchemy .exceptions import DuplicateKeyError
99from advanced_alchemy .utils .text import slugify
4747 from litestar .security .jwt import OAuth2Login , Token
4848
4949 from app .domain .accounts .services import (
50- EmailVerificationTokenService ,
5150 PasswordResetService ,
5251 RoleService ,
5352 UserService ,
5453 )
5554 from app .lib .email import AppEmailService
56- from app .lib .email .service import UserProtocol
5755 from app .lib .settings import AppSettings
5856
5957logger = logging .getLogger (__name__ )
@@ -397,19 +395,20 @@ async def signup(
397395 request : Request [m .User , Token , Any ],
398396 users_service : UserService ,
399397 roles_service : RoleService ,
400- verification_service : EmailVerificationTokenService ,
401- app_email_service : AppEmailService ,
402398 data : AccountRegister ,
399+ app_mailer : AppEmailService ,
403400 ) -> User :
404401 """User Signup.
405402
406403 Args:
407404 request: Request
408405 users_service: User Service
409406 roles_service: Role Service
410- verification_service: Email Verification Service
411- app_email_service: Email service for sending verification emails
412407 data: Account Register Data
408+ app_mailer: Email service for sending notifications
409+
410+ Raises:
411+ ClientException: If user with this email already exists
413412
414413 Returns:
415414 User
@@ -426,21 +425,18 @@ async def signup(
426425 user = await users_service .create (user_data )
427426 except DuplicateKeyError as exc :
428427 raise ClientException (detail = "User with this email already exists" , status_code = 409 ) from exc
429- request .app .emit (event_id = "user_created" , user_id = user .id )
430-
431- _ , verification_token = await verification_service .create_verification_token (user_id = user .id , email = user .email )
432- await app_email_service .send_verification_email (cast ("UserProtocol" , user ), verification_token )
428+ request .app .emit (event_id = "user_created" , user_id = user .id , mailer = app_mailer )
433429
434430 return users_service .to_schema (user , schema_type = User )
435431
436432 @post (operation_id = "ForgotPassword" , path = "/api/access/forgot-password" , exclude_from_auth = True , security = [])
437433 async def forgot_password (
438434 self ,
439- data : ForgotPasswordRequest ,
440- request : Request [m .User , Token , Any ],
441435 users_service : UserService ,
442436 password_reset_service : PasswordResetService ,
443- app_email_service : AppEmailService ,
437+ app_mailer : AppEmailService ,
438+ request : Request [m .User , Token , Any ],
439+ data : ForgotPasswordRequest ,
444440 ) -> PasswordResetSent :
445441 """Initiate password reset flow.
446442
@@ -449,15 +445,11 @@ async def forgot_password(
449445 request: HTTP request object
450446 users_service: User service
451447 password_reset_service: Password reset service
452- app_email_service : Email service for sending reset emails
448+ app_mailer : Email service for sending notifications
453449
454450 Returns:
455451 Response indicating reset email status
456452 """
457-
458- ip_address = request .client .host if request .client else "unknown"
459- user_agent = request .headers .get ("user-agent" , "unknown" )
460-
461453 user = await users_service .get_one_or_none (email = data .email )
462454
463455 if user is None or not user .is_active :
@@ -470,15 +462,7 @@ async def forgot_password(
470462 message = "Too many password reset requests. Please try again later" , expires_in_minutes = 60
471463 )
472464
473- _ , reset_token = await password_reset_service .create_reset_token (
474- user_id = user .id , ip_address = ip_address , user_agent = user_agent
475- )
476-
477- await app_email_service .send_password_reset_email (
478- user = cast ("UserProtocol" , user ),
479- reset_token = reset_token ,
480- expires_in_minutes = 60 ,
481- )
465+ request .app .emit (event_id = "password_reset_requested" , user_id = user .id , mailer = app_mailer )
482466
483467 return PasswordResetSent (
484468 message = "If the email exists, a password reset link has been sent" , expires_in_minutes = 60
@@ -516,15 +500,17 @@ async def reset_password_with_token(
516500 data : ResetPasswordRequest ,
517501 users_service : UserService ,
518502 password_reset_service : PasswordResetService ,
519- app_email_service : AppEmailService ,
503+ request : Request [m .User , Token , Any ],
504+ app_mailer : AppEmailService ,
520505 ) -> PasswordResetComplete :
521506 """Complete password reset with token.
522507
523508 Args:
524509 data: Password reset request data
525510 users_service: User service
526511 password_reset_service: Password reset service
527- app_email_service: Email service for sending confirmation emails
512+ request: HTTP request object
513+ app_mailer: Email service for sending notifications
528514
529515 Returns:
530516 Password reset confirmation
@@ -545,6 +531,6 @@ async def reset_password_with_token(
545531
546532 user = await users_service .reset_password_with_token (user_id = reset_token .user_id , new_password = data .password )
547533
548- await app_email_service . send_password_reset_confirmation_email ( cast ( "UserProtocol " , user ) )
534+ request . app . emit ( event_id = "password_reset_completed " , user_id = user . id , mailer = app_mailer )
549535
550536 return PasswordResetComplete (message = "Password has been successfully reset" , user_id = user .id )
0 commit comments