This commit is contained in:
2026-04-21 19:00:53 +05:45
commit ebb12e6ab7
20 changed files with 1391 additions and 0 deletions
View File
+27
View File
@@ -0,0 +1,27 @@
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import BaseModel, Field, ConfigDict
class FilterParams(BaseModel):
limit : int = Field(100, gt=0, le=100)
offset : int = Field(0, ge=0)
order_by : str = "created_at"
search : str | None = None
tags : list[str] = []
class ListResponseBase(BaseModel):
total : int
offset : int
limit : int
model_config = ConfigDict(from_attributes=True)
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file=".env")
DATABASE_URL : str
TEST_DATABASE_URL : str
FIRST_SUPERUSER : str
FIRST_SUPERUSER_PASSWORD : str
FIRST_SUPERUSER_EMAIL : str
settings = Settings()
+49
View File
@@ -0,0 +1,49 @@
from sqlalchemy import create_engine, event
from sqlalchemy.orm import sessionmaker, with_loader_criteria
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.exc import SQLAlchemyError
from typing import Annotated
from fastapi import Depends
from sqlalchemy.orm import Session
from dotenv import load_dotenv
import os
load_dotenv()
engine = create_engine(os.getenv("DATABASE_URL", ""))
SessionLocal = sessionmaker(autoflush=False, bind=engine)
def safe_commit(db : Session):
try:
db.commit()
except SQLAlchemyError:
db.rollback()
raise
def get_db():
db = SessionLocal()
try:
yield db
except Exception:
db.rollback()
raise
finally:
db.close()
@event.listens_for(SessionLocal, "do_orm_execute")
def _add_filtering_criterial(execute_state):
skip_filter = execute_state.execution_options.get("skip_filter", False)
if execute_state.is_select and not skip_filter:
from ..models.models import AuditMixin
execute_state.statement = execute_state.statement.options(
with_loader_criteria(
AuditMixin,
lambda cls: cls.is_archived.is_(False),
include_aliases = True,
)
)
db_dependency = Annotated[Session, Depends(get_db)]