from __future__ import annotations from datetime import datetime from sqlalchemy import ( Column, Integer, BigInteger, String, DateTime, JSON, UniqueConstraint, ) from .base import AlchemyBase class NodeEvent(AlchemyBase): __tablename__ = 'node_events' __table_args__ = ( UniqueConstraint('origin_public_key', 'seq', name='uq_node_events_origin_seq'), UniqueConstraint('uid', name='uq_node_events_uid'), ) id = Column(Integer, autoincrement=True, primary_key=True) origin_public_key = Column(String(128), nullable=False) origin_host = Column(String(256), nullable=True) seq = Column(BigInteger, nullable=False) uid = Column(String(64), nullable=False) event_type = Column(String(64), nullable=False) payload = Column(JSON, nullable=False, default=dict) signature = Column(String(512), nullable=False) created_at = Column(DateTime, nullable=False, default=datetime.utcnow) received_at = Column(DateTime, nullable=False, default=datetime.utcnow) applied_at = Column(DateTime, nullable=True) status = Column(String(32), nullable=False, default='recorded') class NodeEventCursor(AlchemyBase): __tablename__ = 'node_event_cursors' __table_args__ = ( UniqueConstraint('source_public_key', name='uq_event_cursor_source'), ) id = Column(Integer, autoincrement=True, primary_key=True) source_public_key = Column(String(128), nullable=False) last_seq = Column(BigInteger, nullable=False, default=0) updated_at = Column(DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) source_public_host = Column(String(256), nullable=True)