diff --git a/app/core/config.py b/app/core/config.py index 65c29d1..bd53031 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -10,8 +10,17 @@ class Settings(BaseSettings): ALGORITHM: str = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 8 - DB_DIR: Path = Path("/app/storage/db") - SQLALCHEMY_DATABASE_URL: str = f"sqlite:///{DB_DIR}/db.sqlite" + # Use relative path from current working directory or absolute path if specified + DB_DIR: Path = Path(os.getenv("DB_DIR", "/app/storage/db")) + + def __init__(self, **kwargs): + super().__init__(**kwargs) + # Ensure the database directory exists + self.DB_DIR.mkdir(parents=True, exist_ok=True) + + @property + def SQLALCHEMY_DATABASE_URL(self) -> str: + return f"sqlite:///{self.DB_DIR}/db.sqlite" PAYMENT_PROVIDER_API_URL: str = os.getenv("PAYMENT_PROVIDER_API_URL", "") PAYMENT_PROVIDER_API_KEY: str = os.getenv("PAYMENT_PROVIDER_API_KEY", "") diff --git a/app/db/session.py b/app/db/session.py index 5d3573d..a19d0c9 100644 --- a/app/db/session.py +++ b/app/db/session.py @@ -1,16 +1,13 @@ from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker -from pathlib import Path - -DB_DIR = Path("/app/storage/db") -DB_DIR.mkdir(parents=True, exist_ok=True) - -SQLALCHEMY_DATABASE_URL = f"sqlite:///{DB_DIR}/db.sqlite" +from app.core.config import settings engine = create_engine( - SQLALCHEMY_DATABASE_URL, - connect_args={"check_same_thread": False} + settings.SQLALCHEMY_DATABASE_URL, + connect_args={"check_same_thread": False}, + pool_pre_ping=True, + pool_recycle=300 ) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) diff --git a/app/schemas/user.py b/app/schemas/user.py index 52c7c81..0f21744 100644 --- a/app/schemas/user.py +++ b/app/schemas/user.py @@ -1,17 +1,27 @@ from typing import Optional -from pydantic import BaseModel, EmailStr +from pydantic import BaseModel, field_validator from datetime import datetime +import re class UserBase(BaseModel): - email: Optional[EmailStr] = None + email: Optional[str] = None username: Optional[str] = None is_active: Optional[bool] = True is_verified: Optional[bool] = False + @field_validator('email') + @classmethod + def validate_email(cls, v): + if v is not None: + email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' + if not re.match(email_pattern, v): + raise ValueError('Invalid email format') + return v + class UserCreate(UserBase): - email: EmailStr + email: str username: str password: str