Move users service into a module

This commit is contained in:
Campbell Alden 2026-08-03 00:01:15 +09:00
parent 72ece8af72
commit 395164f630
5 changed files with 115 additions and 98 deletions

View file

@ -0,0 +1,50 @@
from src.services.email import EmailService
from email.headerregistry import Address
from .data import UserDTO, UserProfile, SignupError, LoginError
from .repo import UserRepo
def is_valid_email(email: str) -> bool:
try:
parsed = Address(addr_spec=email)
return bool(parsed.username and parsed.domain and '.' in parsed.domain)
except (ValueError, TypeError):
return False
def is_valid_password(password: str) -> bool:
# TODO: Enforce other or saner rules?
long_enough = len(password) > 8
short_enough = len(password) < 32
has_symbol = any([s in password for s in list('@#$%^&*!?/')])
return long_enough and short_enough and has_symbol
class UserService:
def __init__(self, repo: UserRepo, email_service: EmailService):
self._repo = repo
self._email_service = email_service
def login(self, user: UserDTO) -> UserProfile:
full_user = self._repo.auth_as_user(user)
if full_user:
return full_user.to_profile()
else:
raise LoginError('No user found for that email or password')
def signup(self, user: UserDTO) -> UserProfile:
if not is_valid_email(user.email):
raise SignupError(f'{user.email} was not an acceptable email address')
if not is_valid_password(user.raw_password.expose_secret()):
raise SignupError('The given password was not acceptable')
# Create a user in persistence
created_user = self._repo.create_user(user).to_profile()
return created_user
def get_user_by_id(self, user_id: int) -> UserProfile | None:
user = self._repo.get_user_by_id(user_id)
if user:
return user.to_profile()