Spaces:
Running
Running
""" | |
Search History Model | |
This module defines the search history model for tracking dark web searches and trends. | |
""" | |
from datetime import datetime | |
from typing import Optional, List | |
from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey, Text, Float | |
from sqlalchemy.orm import relationship | |
from src.models.base import Base | |
class SearchHistory(Base): | |
""" | |
Model for tracking search history and trends in dark web content. | |
Attributes: | |
id: Unique identifier for the search | |
query: The search query or term | |
timestamp: When the search was performed | |
user_id: ID of the user who performed the search (optional) | |
result_count: Number of results returned | |
category: Category of the search (e.g., "marketplace", "forum", "paste", etc.) | |
is_saved: Whether this is a saved/favorited search | |
notes: Optional notes about this search | |
tags: Tags associated with this search | |
""" | |
__tablename__ = "search_history" | |
id = Column(Integer, primary_key=True, index=True) | |
query = Column(String(255), nullable=False, index=True) | |
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False, index=True) | |
user_id = Column(Integer, ForeignKey("users.id"), nullable=True) | |
result_count = Column(Integer, default=0) | |
category = Column(String(50), nullable=True) | |
is_saved = Column(Boolean, default=False) | |
notes = Column(Text, nullable=True) | |
tags = Column(String(255), nullable=True) # Comma-separated tags | |
# Relationships | |
user = relationship("User", back_populates="searches") | |
search_results = relationship("SearchResult", back_populates="search", cascade="all, delete-orphan") | |
def __repr__(self): | |
return f"<SearchHistory(id={self.id}, query='{self.query}', timestamp={self.timestamp})>" | |
class SearchResult(Base): | |
""" | |
Model for individual search results associated with a search query. | |
Attributes: | |
id: Unique identifier for the search result | |
search_id: ID of the parent search | |
content_id: ID of the content found (if in our database) | |
url: URL of the result | |
title: Title of the result | |
snippet: Text snippet from the result | |
source: Source of the result (e.g., "dark web forum", "marketplace", etc.) | |
relevance_score: Score indicating relevance to the search query | |
timestamp: When this result was found | |
""" | |
__tablename__ = "search_results" | |
id = Column(Integer, primary_key=True, index=True) | |
search_id = Column(Integer, ForeignKey("search_history.id"), nullable=False) | |
content_id = Column(Integer, ForeignKey("dark_web_contents.id"), nullable=True) | |
url = Column(String(1024), nullable=True) | |
title = Column(String(255), nullable=True) | |
snippet = Column(Text, nullable=True) | |
source = Column(String(100), nullable=True) | |
relevance_score = Column(Float, default=0.0) | |
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False) | |
# Relationships | |
search = relationship("SearchHistory", back_populates="search_results") | |
content = relationship("DarkWebContent", back_populates="search_results") | |
def __repr__(self): | |
return f"<SearchResult(id={self.id}, search_id={self.search_id}, title='{self.title}')>" | |
class SavedSearch(Base): | |
""" | |
Model for saved searches with custom parameters for periodic monitoring. | |
Attributes: | |
id: Unique identifier for the saved search | |
name: Name of the saved search | |
query: The search query or term | |
user_id: ID of the user who created the saved search | |
created_at: When this saved search was created | |
last_run_at: When this saved search was last executed | |
frequency: How often to run this search (in hours, 0 for manual only) | |
notification_enabled: Whether to send notifications for new results | |
is_active: Whether this saved search is active | |
threshold: Threshold for notifications (e.g., min number of new results) | |
""" | |
__tablename__ = "saved_searches" | |
id = Column(Integer, primary_key=True, index=True) | |
name = Column(String(100), nullable=False) | |
query = Column(String(255), nullable=False) | |
user_id = Column(Integer, ForeignKey("users.id"), nullable=False) | |
created_at = Column(DateTime, default=datetime.utcnow, nullable=False) | |
last_run_at = Column(DateTime, nullable=True) | |
frequency = Column(Integer, default=24) # In hours, 0 for manual only | |
notification_enabled = Column(Boolean, default=True) | |
is_active = Column(Boolean, default=True) | |
threshold = Column(Integer, default=1) # Min number of new results for notification | |
category = Column(String(50), nullable=True) | |
# Relationships | |
user = relationship("User", back_populates="saved_searches") | |
def __repr__(self): | |
return f"<SavedSearch(id={self.id}, name='{self.name}', query='{self.query}')>" | |
class TrendTopic(Base): | |
""" | |
Model for tracking trending topics on the dark web. | |
Attributes: | |
id: Unique identifier for the trend topic | |
topic: The topic or term | |
first_seen: When this topic was first detected | |
last_seen: When this topic was last detected | |
mention_count: Number of mentions of this topic | |
growth_rate: Rate of growth in mentions (percentage) | |
category: Category of the trend (e.g., "ransomware", "data breach", etc.) | |
is_active: Whether this trend is currently active | |
""" | |
__tablename__ = "trend_topics" | |
id = Column(Integer, primary_key=True, index=True) | |
topic = Column(String(100), nullable=False, index=True) | |
first_seen = Column(DateTime, default=datetime.utcnow, nullable=False) | |
last_seen = Column(DateTime, default=datetime.utcnow, nullable=False) | |
mention_count = Column(Integer, default=1) | |
growth_rate = Column(Float, default=0.0) | |
category = Column(String(50), nullable=True) | |
is_active = Column(Boolean, default=True) | |
def __repr__(self): | |
return f"<TrendTopic(id={self.id}, topic='{self.topic}', mention_count={self.mention_count})>" |