47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
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,
|
|
)
|