Mark-Lasfar commited on
Commit
6ec5390
·
1 Parent(s): bbbddac

Fix ChunkedIteratorResult in SQLAlchemyUserDatabase and toggleBtn null error

Browse files
Files changed (3) hide show
  1. api/auth.py +2 -2
  2. api/database.py +11 -9
  3. 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, get_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)), # Improved random password
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, declarative_base
5
- from fastapi_users.db import SQLAlchemyUserDatabase
 
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 with AsyncSessionLocal() as db:
 
81
  try:
82
- yield db
83
  finally:
84
- await db.close()
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 sqlalchemy import create_engine, select, delete
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
- Base.metadata.create_all(bind=engine)
28
- logger.info("Database tables created successfully.")
 
 
 
 
 
 
29
 
30
- # تنظيف البيانات غير المتسقة
31
- with SessionLocal() as session:
32
- try:
 
 
 
 
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
- except Exception as e:
75
- session.rollback()
76
- logger.error(f"Error during initialization: {e}")
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