ira/sim-search-api/app/db/models.py

75 lines
2.5 KiB
Python

"""
Database models for the sim-search API.
This module defines the SQLAlchemy ORM models for the database.
"""
import datetime
import uuid
from typing import Dict, Any, List
from sqlalchemy import Column, String, Boolean, ForeignKey, DateTime, Integer, JSON, Text
from sqlalchemy.orm import relationship
from app.db.session import Base
def generate_uuid() -> str:
"""Generate a UUID string."""
return str(uuid.uuid4())
class User(Base):
"""User model."""
__tablename__ = "users"
id = Column(String, primary_key=True, index=True, default=generate_uuid)
email = Column(String, unique=True, index=True, nullable=False)
hashed_password = Column(String, nullable=False)
full_name = Column(String, nullable=True)
is_active = Column(Boolean, default=True)
is_superuser = Column(Boolean, default=False)
searches = relationship("Search", back_populates="user")
reports = relationship("Report", back_populates="user")
class Search(Base):
"""Search model."""
__tablename__ = "searches"
id = Column(String, primary_key=True, index=True, default=generate_uuid)
user_id = Column(String, ForeignKey("users.id"))
query = Column(String, nullable=False)
enhanced_query = Column(String, nullable=True)
query_type = Column(String, nullable=True)
engines = Column(String, nullable=True) # Comma-separated list
results_count = Column(Integer, default=0)
results = Column(JSON, nullable=True)
created_at = Column(DateTime, default=datetime.datetime.utcnow)
user = relationship("User", back_populates="searches")
reports = relationship("Report", back_populates="search")
class Report(Base):
"""Report model."""
__tablename__ = "reports"
id = Column(String, primary_key=True, index=True, default=generate_uuid)
user_id = Column(String, ForeignKey("users.id"))
search_id = Column(String, ForeignKey("searches.id"), nullable=True)
title = Column(String, nullable=False)
content = Column(Text, nullable=False)
detail_level = Column(String, nullable=False, default="standard")
query_type = Column(String, nullable=True)
model_used = Column(String, nullable=True)
created_at = Column(DateTime, default=datetime.datetime.utcnow)
updated_at = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow)
user = relationship("User", back_populates="reports")
search = relationship("Search", back_populates="reports")