Spaces:
Build error
Build error
| from typing import Any, Optional | |
| from datetime import datetime | |
| from sqlalchemy import select | |
| from sqlalchemy.ext.asyncio import AsyncSession | |
| from google_auth_service.user_store import BaseUserStore | |
| from google_auth_service.google_provider import GoogleUserInfo | |
| from core.database import async_session_maker | |
| from core.models import User | |
| import uuid | |
| import logging | |
| logger = logging.getLogger(__name__) | |
| class SQLAlchemyUserStore(BaseUserStore): | |
| """ | |
| Adapter to allow GoogleAuth library to use SQLAlchemy models. | |
| """ | |
| async def get(self, user_id: str) -> Optional[User]: | |
| async with async_session_maker() as db: | |
| query = select(User).where(User.user_id == user_id) | |
| result = await db.execute(query) | |
| return result.scalar_one_or_none() | |
| async def save(self, google_info: GoogleUserInfo) -> User: | |
| async with async_session_maker() as db: | |
| query = select(User).where(User.email == google_info.email) | |
| result = await db.execute(query) | |
| user = result.scalar_one_or_none() | |
| if user: | |
| # Update existing | |
| if not user.google_id: | |
| user.google_id = google_info.google_id | |
| user.name = google_info.name | |
| user.profile_picture = google_info.picture | |
| user.last_used_at = datetime.utcnow() | |
| else: | |
| # Create new | |
| user = User( | |
| user_id="usr_" + str(uuid.uuid4()), | |
| email=google_info.email, | |
| google_id=google_info.google_id, | |
| name=google_info.name, | |
| profile_picture=google_info.picture, | |
| credits=0, # Business logic | |
| token_version=1 | |
| ) | |
| db.add(user) | |
| logger.info(f"New user created: {user.email}") | |
| await db.commit() | |
| await db.refresh(user) | |
| return user | |
| async def get_token_version(self, user_id: str) -> Optional[int]: | |
| async with async_session_maker() as db: | |
| query = select(User.token_version).where(User.user_id == user_id) | |
| result = await db.execute(query) | |
| return result.scalar_one_or_none() | |
| async def invalidate_token(self, user_id: str) -> None: | |
| async with async_session_maker() as db: | |
| query = select(User).where(User.user_id == user_id) | |
| result = await db.execute(query) | |
| user = result.scalar_one_or_none() | |
| if user: | |
| user.token_version = (user.token_version or 1) + 1 | |
| await db.commit() | |