79 lines
3.0 KiB
Python
Executable File
79 lines
3.0 KiB
Python
Executable File
# /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 |