Mark-Lasfar
commited on
Commit
·
6ec5390
1
Parent(s):
bbbddac
Fix ChunkedIteratorResult in SQLAlchemyUserDatabase and toggleBtn null error
Browse files- api/auth.py +2 -2
- api/database.py +11 -9
- init_db.py +20 -27
api/auth.py
CHANGED
|
@@ -4,7 +4,7 @@ from fastapi_users.db import SQLAlchemyUserDatabase
|
|
| 4 |
from httpx_oauth.clients.google import GoogleOAuth2
|
| 5 |
from httpx_oauth.clients.github import GitHubOAuth2
|
| 6 |
from fastapi_users.router.oauth import get_oauth_router
|
| 7 |
-
from api.database import User, OAuthAccount, get_user_db
|
| 8 |
from api.models import UserRead, UserCreate, UserUpdate
|
| 9 |
from fastapi_users.manager import BaseUserManager, IntegerIDMixin
|
| 10 |
from fastapi import Depends, Request, FastAPI
|
|
@@ -163,7 +163,7 @@ class UserManager(IntegerIDMixin, BaseUserManager[User, int]):
|
|
| 163 |
|
| 164 |
user_dict = {
|
| 165 |
"email": account_email,
|
| 166 |
-
"hashed_password": self.password_helper.hash(secrets.token_hex(32)),
|
| 167 |
"is_active": True,
|
| 168 |
"is_verified": is_verified_by_default,
|
| 169 |
}
|
|
|
|
| 4 |
from httpx_oauth.clients.google import GoogleOAuth2
|
| 5 |
from httpx_oauth.clients.github import GitHubOAuth2
|
| 6 |
from fastapi_users.router.oauth import get_oauth_router
|
| 7 |
+
from api.database import User, OAuthAccount, get_user_db
|
| 8 |
from api.models import UserRead, UserCreate, UserUpdate
|
| 9 |
from fastapi_users.manager import BaseUserManager, IntegerIDMixin
|
| 10 |
from fastapi import Depends, Request, FastAPI
|
|
|
|
| 163 |
|
| 164 |
user_dict = {
|
| 165 |
"email": account_email,
|
| 166 |
+
"hashed_password": self.password_helper.hash(secrets.token_hex(32)),
|
| 167 |
"is_active": True,
|
| 168 |
"is_verified": is_verified_by_default,
|
| 169 |
}
|
api/database.py
CHANGED
|
@@ -1,8 +1,9 @@
|
|
| 1 |
import os
|
| 2 |
from sqlalchemy import Column, String, Integer, ForeignKey, DateTime, Boolean, Text
|
| 3 |
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
|
| 4 |
-
from sqlalchemy.orm import relationship
|
| 5 |
-
from
|
|
|
|
| 6 |
from typing import AsyncGenerator
|
| 7 |
from fastapi import Depends
|
| 8 |
from datetime import datetime
|
|
@@ -15,7 +16,7 @@ SQLALCHEMY_DATABASE_URL = os.getenv("SQLALCHEMY_DATABASE_URL")
|
|
| 15 |
if not SQLALCHEMY_DATABASE_URL:
|
| 16 |
raise ValueError("SQLALCHEMY_DATABASE_URL is not set in environment variables.")
|
| 17 |
|
| 18 |
-
# إنشاء محرك async
|
| 19 |
async_engine = create_async_engine(SQLALCHEMY_DATABASE_URL, echo=True)
|
| 20 |
|
| 21 |
# إعداد جلسة async
|
|
@@ -77,17 +78,19 @@ class Message(Base):
|
|
| 77 |
conversation = relationship("Conversation", back_populates="messages")
|
| 78 |
|
| 79 |
async def get_db() -> AsyncGenerator[AsyncSession, None]:
|
| 80 |
-
async
|
|
|
|
| 81 |
try:
|
| 82 |
-
yield
|
| 83 |
finally:
|
| 84 |
-
await
|
| 85 |
|
| 86 |
-
async def get_user_db(session: AsyncSession = Depends(get_db)):
|
|
|
|
| 87 |
yield SQLAlchemyUserDatabase(session, User, OAuthAccount)
|
| 88 |
|
| 89 |
-
# إنشاء الجداول بشكل async
|
| 90 |
async def init_db():
|
|
|
|
| 91 |
try:
|
| 92 |
async with async_engine.begin() as conn:
|
| 93 |
await conn.run_sync(Base.metadata.create_all)
|
|
@@ -95,4 +98,3 @@ async def init_db():
|
|
| 95 |
except Exception as e:
|
| 96 |
logger.error(f"Error creating database tables: {e}")
|
| 97 |
raise
|
| 98 |
-
|
|
|
|
| 1 |
import os
|
| 2 |
from sqlalchemy import Column, String, Integer, ForeignKey, DateTime, Boolean, Text
|
| 3 |
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
|
| 4 |
+
from sqlalchemy.orm import relationship
|
| 5 |
+
from sqlalchemy.ext.declarative import declarative_base
|
| 6 |
+
from fastapi_users.db import SQLAlchemyBaseUserTable, SQLAlchemyUserDatabase
|
| 7 |
from typing import AsyncGenerator
|
| 8 |
from fastapi import Depends
|
| 9 |
from datetime import datetime
|
|
|
|
| 16 |
if not SQLALCHEMY_DATABASE_URL:
|
| 17 |
raise ValueError("SQLALCHEMY_DATABASE_URL is not set in environment variables.")
|
| 18 |
|
| 19 |
+
# إنشاء محرك async (استخدم sqlite+aiosqlite للدعم async)
|
| 20 |
async_engine = create_async_engine(SQLALCHEMY_DATABASE_URL, echo=True)
|
| 21 |
|
| 22 |
# إعداد جلسة async
|
|
|
|
| 78 |
conversation = relationship("Conversation", back_populates="messages")
|
| 79 |
|
| 80 |
async def get_db() -> AsyncGenerator[AsyncSession, None]:
|
| 81 |
+
"""Get async database session."""
|
| 82 |
+
async with AsyncSessionLocal() as session:
|
| 83 |
try:
|
| 84 |
+
yield session
|
| 85 |
finally:
|
| 86 |
+
await session.close()
|
| 87 |
|
| 88 |
+
async def get_user_db(session: AsyncSession = Depends(get_db)) -> AsyncGenerator[SQLAlchemyUserDatabase, None]:
|
| 89 |
+
"""Get user database for fastapi-users."""
|
| 90 |
yield SQLAlchemyUserDatabase(session, User, OAuthAccount)
|
| 91 |
|
|
|
|
| 92 |
async def init_db():
|
| 93 |
+
"""Initialize database tables asynchronously."""
|
| 94 |
try:
|
| 95 |
async with async_engine.begin() as conn:
|
| 96 |
await conn.run_sync(Base.metadata.create_all)
|
|
|
|
| 98 |
except Exception as e:
|
| 99 |
logger.error(f"Error creating database tables: {e}")
|
| 100 |
raise
|
|
|
init_db.py
CHANGED
|
@@ -1,35 +1,31 @@
|
|
| 1 |
import os
|
| 2 |
import logging
|
| 3 |
-
from
|
| 4 |
-
from sqlalchemy.orm import sessionmaker
|
| 5 |
-
from api.database import Base, User, OAuthAccount, Conversation, Message
|
| 6 |
|
| 7 |
# Setup logging
|
| 8 |
logging.basicConfig(level=logging.INFO)
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
| 11 |
-
# جلب URL قاعدة البيانات من المتغيرات البيئية
|
| 12 |
-
SQLALCHEMY_DATABASE_URL = os.getenv("SQLALCHEMY_DATABASE_URL", "sqlite:///./data/mgzon_users.db")
|
| 13 |
-
if not SQLALCHEMY_DATABASE_URL:
|
| 14 |
-
logger.error("SQLALCHEMY_DATABASE_URL is not set in environment variables.")
|
| 15 |
-
raise ValueError("SQLALCHEMY_DATABASE_URL is required.")
|
| 16 |
-
|
| 17 |
-
# إنشاء المحرك
|
| 18 |
-
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
|
| 19 |
-
|
| 20 |
-
# إعداد الجلسة
|
| 21 |
-
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
| 22 |
-
|
| 23 |
def init_db():
|
| 24 |
logger.info("Starting database initialization...")
|
| 25 |
|
| 26 |
-
# إنشاء الجداول
|
| 27 |
-
|
| 28 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
|
| 30 |
-
# تنظيف البيانات غير المتسقة
|
| 31 |
-
|
| 32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
# حذف سجلات oauth_accounts اللي مش مرتبطة بمستخدم موجود
|
| 34 |
stmt = delete(OAuthAccount).where(
|
| 35 |
OAuthAccount.user_id.notin_(select(User.id))
|
|
@@ -71,12 +67,9 @@ def init_db():
|
|
| 71 |
session.commit()
|
| 72 |
logger.info("Test conversation created successfully.")
|
| 73 |
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
raise
|
| 78 |
-
finally:
|
| 79 |
-
session.close()
|
| 80 |
|
| 81 |
logger.info("Database initialization completed.")
|
| 82 |
|
|
|
|
| 1 |
import os
|
| 2 |
import logging
|
| 3 |
+
from api.database import async_engine, Base, User, OAuthAccount, Conversation, Message, AsyncSessionLocal
|
|
|
|
|
|
|
| 4 |
|
| 5 |
# Setup logging
|
| 6 |
logging.basicConfig(level=logging.INFO)
|
| 7 |
logger = logging.getLogger(__name__)
|
| 8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
def init_db():
|
| 10 |
logger.info("Starting database initialization...")
|
| 11 |
|
| 12 |
+
# إنشاء الجداول (sync version for init_db.py)
|
| 13 |
+
try:
|
| 14 |
+
from sqlalchemy import create_engine
|
| 15 |
+
sync_engine = create_engine(os.getenv("SQLALCHEMY_DATABASE_URL", "sqlite:///./data/mgzon_users.db"))
|
| 16 |
+
Base.metadata.create_all(bind=sync_engine)
|
| 17 |
+
logger.info("Database tables created successfully.")
|
| 18 |
+
except Exception as e:
|
| 19 |
+
logger.error(f"Error creating database tables: {e}")
|
| 20 |
+
raise
|
| 21 |
|
| 22 |
+
# تنظيف البيانات غير المتسقة (sync for simplicity in init_db)
|
| 23 |
+
try:
|
| 24 |
+
from sqlalchemy import select, delete
|
| 25 |
+
from sqlalchemy.orm import sessionmaker
|
| 26 |
+
sync_engine = create_engine(os.getenv("SQLALCHEMY_DATABASE_URL", "sqlite:///./data/mgzon_users.db"))
|
| 27 |
+
SyncSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=sync_engine)
|
| 28 |
+
with SyncSessionLocal() as session:
|
| 29 |
# حذف سجلات oauth_accounts اللي مش مرتبطة بمستخدم موجود
|
| 30 |
stmt = delete(OAuthAccount).where(
|
| 31 |
OAuthAccount.user_id.notin_(select(User.id))
|
|
|
|
| 67 |
session.commit()
|
| 68 |
logger.info("Test conversation created successfully.")
|
| 69 |
|
| 70 |
+
except Exception as e:
|
| 71 |
+
logger.error(f"Error during initialization: {e}")
|
| 72 |
+
raise
|
|
|
|
|
|
|
|
|
|
| 73 |
|
| 74 |
logger.info("Database initialization completed.")
|
| 75 |
|