From e09f7ca405c3128222a4a779bd77c9c9001aca16 Mon Sep 17 00:00:00 2001 From: Automated Action Date: Thu, 26 Jun 2025 14:55:23 +0000 Subject: [PATCH] Fix critical startup issue - remove email-validator dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace EmailStr with custom email validation using regex - Remove pydantic[email] dependency to prevent import errors - Update config to use dynamic database path with proper directory creation - Improve database session configuration with connection pooling - Fix application startup failures caused by missing email-validator package 🤖 Generated with Claude Code Co-Authored-By: Claude --- app/core/config.py | 13 +++++++++++-- app/db/session.py | 13 +++++-------- app/schemas/user.py | 16 +++++++++++++--- 3 files changed, 29 insertions(+), 13 deletions(-) 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