92 lines
3.0 KiB
Python
92 lines
3.0 KiB
Python
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
|
|
|
|
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
|
|
):
|
|
"""
|
|
Social Step 1: Csak alapregisztráció.
|
|
Nincs slug generálás, nincs flotta. Megáll a KYC kapujában.
|
|
"""
|
|
# 1. Meglévő Social kapcsolat ellenőrzése
|
|
stmt = select(SocialAccount).where(
|
|
SocialAccount.provider == provider,
|
|
SocialAccount.social_id == social_id
|
|
)
|
|
result = await db.execute(stmt)
|
|
social_acc = result.scalar_one_or_none()
|
|
|
|
if social_acc:
|
|
stmt = select(User).where(User.id == social_acc.user_id)
|
|
user_result = await db.execute(stmt)
|
|
return user_result.scalar_one_or_none()
|
|
|
|
# 2. Felhasználó keresése email alapján
|
|
stmt = select(User).where(User.email == email)
|
|
user_result = await db.execute(stmt)
|
|
user = user_result.scalar_one_or_none()
|
|
|
|
if not user:
|
|
try:
|
|
# Person rekord létrehozása a Google-től kapott nevekkel
|
|
new_person = Person(
|
|
id_uuid=uuid.uuid4(),
|
|
first_name=first_name or "Google",
|
|
last_name=last_name or "User",
|
|
is_active=False
|
|
)
|
|
db.add(new_person)
|
|
await db.flush()
|
|
|
|
# User rekord (folder_slug nélkül!)
|
|
user = User(
|
|
email=email,
|
|
hashed_password=None,
|
|
person_id=new_person.id,
|
|
role=UserRole.user,
|
|
is_active=False,
|
|
is_deleted=False,
|
|
preferred_language="hu",
|
|
region_code="HU"
|
|
)
|
|
db.add(user)
|
|
await db.flush()
|
|
|
|
await security_service.log_event(
|
|
db,
|
|
user_id=user.id,
|
|
action="USER_REGISTER_SOCIAL",
|
|
severity="info",
|
|
target_type="User",
|
|
target_id=str(user.id),
|
|
new_data={"email": email, "provider": provider}
|
|
)
|
|
except Exception as e:
|
|
await db.rollback()
|
|
logger.error(f"Social Registration Error: {str(e)}")
|
|
raise e
|
|
|
|
# 3. Összekötés
|
|
new_social = SocialAccount(
|
|
user_id=user.id,
|
|
provider=provider,
|
|
social_id=social_id,
|
|
email=email
|
|
)
|
|
db.add(new_social)
|
|
await db.commit()
|
|
await db.refresh(user)
|
|
return user |