"""Optional, time-boxed raw storage (Chapter 06) — retention (~30 days) enforced by `flask cleanup` (Chapter 12).""" from __future__ import annotations from app.extensions import db class LogEntry(db.Model): __tablename__ = "log_entries" id: int = db.Column(db.Integer, primary_key=True) log_file_id: int = db.Column(db.Integer, db.ForeignKey("log_files.id", ondelete="CASCADE"), nullable=False) timestamp = db.Column(db.DateTime, nullable=False) # normalized to UTC (Ch07) ip: str = db.Column(db.String(45), nullable=False) # IPv4 or IPv6 method: str = db.Column(db.String(10), nullable=False) path: str = db.Column(db.Text, nullable=False) status_code: int = db.Column(db.SmallInteger, nullable=False) bytes_sent: int = db.Column(db.Integer, nullable=False, default=0) referrer: str | None = db.Column(db.Text, nullable=True) user_agent: str | None = db.Column(db.Text, nullable=True) is_bot: bool = db.Column(db.Boolean, nullable=False, default=False) flagged: bool = db.Column(db.Boolean, nullable=False, default=False) __table_args__ = ( db.Index("ix_log_entries_file_ts", "log_file_id", "timestamp"), db.Index("ix_log_entries_ip", "ip"), db.Index("ix_log_entries_path", "path"), db.Index("ix_log_entries_timestamp", "timestamp"), )