"""Émission d'un jeton de lien magique et construction de l'URL publique. Partagé par l'endpoint d'authentification et par les emails de planning.""" import datetime as dt from sqlmodel import Session from app.auth.tokens import hash_token, new_raw_token from app.config import get_settings from app.models import Account, MagicLinkToken, local_now def issue_magic_link_token(session: Session, account: Account) -> str: """Crée un `MagicLinkToken` pour le compte et renvoie le jeton en clair. N'effectue pas de commit.""" raw = new_raw_token() session.add( MagicLinkToken( account_id=account.id, token_hash=hash_token(raw), expires_at=local_now() + dt.timedelta(minutes=get_settings().magic_link_ttl_minutes), ) ) return raw def build_magic_link_url(raw_token: str) -> str: settings = get_settings() base = settings.public_base_url.rstrip("/") return f"{base}{settings.magic_link_path}?token={raw_token}"