Spaces:
No application file
No application file
import re | |
from contextlib import asynccontextmanager | |
from datetime import datetime | |
from fastapi import Depends | |
from pydantic import validator | |
from sqlalchemy.ext.asyncio import create_async_engine | |
from sqlalchemy.orm import sessionmaker | |
from sqlmodel import Field, SQLModel | |
from sqlmodel.ext.asyncio.session import AsyncSession | |
from scams import scam_categories | |
from settings import settings | |
database_url = settings.DATABASE_URL.get_secret_value() | |
engine = create_async_engine(database_url, echo=settings.is_dev()) | |
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) | |
async def create_db_and_tables(): | |
async with engine.begin() as conn: | |
await conn.run_sync(SQLModel.metadata.create_all) | |
async def get_session() -> AsyncSession: | |
""" | |
Dependency function to provide an async database session. | |
Ensures proper cleanup after use. | |
""" | |
async with async_session() as session: | |
try: | |
yield session | |
finally: | |
await session.close() | |
class Scammer(SQLModel, table=True): | |
"""Scammer ORM Model.""" | |
id: int = Field(default=None, primary_key=True) | |
scammer_mobile: str = Field(index=True, description="Scammer mobile number") | |
scam_id: int = Field(description="Scam ID of the scam type") | |
reporter_ordeal: str = Field(description="Summary of the scam") | |
reporter_mobile: str = Field(description="Reporter mobile number") | |
created_at: datetime = Field( | |
default_factory=datetime.utcnow, description="Timestamp of report creation" | |
) | |
def validate_mobile_number(cls, value: str) -> str: | |
"""Validate mobile numbers using a regex.""" | |
pattern = r"^\+\d{1,3}-?\d{6,14}$" # E.164 format | |
if not re.match(pattern, value): | |
raise ValueError(f"Invalid mobile number: {value}") | |
return value | |
def validate_scam_id(cls, value: int) -> int: | |
"""Validate if scam_id exists in scam_categories.""" | |
if value not in scam_categories.keys(): | |
raise ValueError( | |
f"Invalid scam_id: {value}. Must be one of {list(scam_categories.keys())}." | |
) | |
return value | |