# /opt/docker/dev/service_finder/backend/app/services/social_auth_service.py import uuid import logging from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from app.models.identity import User, Person, SocialAccount, UserRole from app.services.security_service import security_service from app.core.security import generate_secure_slug logger = logging.getLogger(__name__) class SocialAuthService: @staticmethod async def get_or_create_social_user( db: AsyncSession, provider: str, social_id: str, email: str, first_name: str, last_name: str, referred_by_code: str = None ): """ LOGIKA MEGŐRIZVE: Step 1 regisztráció slug és flotta nélkül. Támogatja a meghívó kód (referral code) átvételét Google SSO regisztrációnál. """ # 1. Meglévő fiók ellenőrzése stmt = select(SocialAccount).where(SocialAccount.provider == provider, SocialAccount.social_id == social_id) social_acc = (await db.execute(stmt)).scalar_one_or_none() if social_acc: return (await db.execute(select(User).where(User.id == social_acc.user_id))).scalar_one_or_none() # 2. Új Identity és User (Step 1) stmt_u = select(User).where(User.email == email) user = (await db.execute(stmt_u)).scalar_one_or_none() if not user: # Meghívó keresése referral kód alapján referred_by_id = None if referred_by_code: referrer_stmt = select(User).where(User.referral_code == referred_by_code) referrer = (await db.execute(referrer_stmt)).scalar_one_or_none() if referrer: referred_by_id = referrer.id logger.info(f"Social user {email} referred by {referrer.email} (ID: {referrer.id})") else: logger.warning(f"Referral code '{referred_by_code}' not found for social registration, ignoring.") new_person = Person( first_name=first_name or "Social", last_name=last_name or "User", is_active=False, identity_docs={}, ice_contact={} ) db.add(new_person) await db.flush() referral_code = generate_secure_slug(8).upper() user = User( email=email, person_id=new_person.id, role=UserRole.USER, is_active=False, referral_code=referral_code, referred_by_id=referred_by_id ) db.add(user) await db.flush() await security_service.log_event(db, user.id, "USER_REGISTER_SOCIAL", "info", target_type="User", target_id=str(user.id)) # 3. Kapcsolat rögzítése db.add(SocialAccount(user_id=user.id, provider=provider, social_id=social_id, email=email)) await db.commit() await db.refresh(user) return user