from app.models.user import User from app.repositories.protocols import IUserRepository from app.services.referral_service import ReferralService class UserService: def __init__( self, users: IUserRepository, referrals: ReferralService, ) -> None: self._users = users self._referrals = referrals async def ensure_user( self, *, telegram_id: int, username: str | None, first_name: str | None, start_payload: str | None, ) -> User: referrer_internal_id = await self._referrals.resolve_referrer_id( start_payload, invitee_telegram_id=telegram_id, ) existing = await self._users.get_by_telegram_id(telegram_id) if existing is not None: await self._users.update_profile( existing, username=username, first_name=first_name, ) if referrer_internal_id is not None: await self._users.set_referrer_if_unset( existing, referrer_internal_id, ) return existing return await self._users.create( telegram_id=telegram_id, username=username, first_name=first_name, referrer_id=referrer_internal_id, )