from sqlalchemy import Boolean, Column, DateTime, Float, Index, JSON, String, Text from sqlalchemy.sql import func from app.db.session import Base class EarthNewsItem(Base): __tablename__ = "earth_news_items" id = Column(String(160), primary_key=True) title = Column(String(500), nullable=False) summary = Column(Text, nullable=False, default="") content_language = Column(String(32), nullable=False, default="en") localizations = Column(JSON, nullable=False, default=dict) url = Column(Text, nullable=False) source = Column(String(255), nullable=False, default="") feed_name = Column(String(255), nullable=False, default="") region = Column(String(80), nullable=False, index=True) homepage_url = Column(Text, nullable=False, default="") published_at = Column(DateTime(timezone=True), nullable=True, index=True) latitude = Column(Float, nullable=False) longitude = Column(Float, nullable=False) location_label = Column(String(255), nullable=False) location_source = Column(String(80), nullable=False, default="region_anchor") verified = Column(Boolean, nullable=False, default=False, index=True) location_meta = Column(JSON, nullable=False, default=dict) first_seen_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) last_seen_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False, index=True) resolved_at = Column(DateTime(timezone=True), nullable=True, index=True) enrichment_status = Column(String(80), nullable=False, default="pending", index=True) enrichment_error = Column(Text, nullable=True) enriched_at = Column(DateTime(timezone=True), nullable=True, index=True) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) __table_args__ = ( Index("idx_earth_news_region_published", "region", "published_at"), Index("idx_earth_news_region_seen", "region", "last_seen_at"), )