diff --git a/backend/app/models.py b/backend/app/models.py new file mode 100644 index 0000000..ae92f99 --- /dev/null +++ b/backend/app/models.py @@ -0,0 +1,108 @@ +import json +from datetime import datetime, timezone +from sqlalchemy import Boolean, Column, DateTime, Float, Integer, String, Text +from app.database import Base + + +def _now(): + return datetime.now(timezone.utc) + + +class NetObjectModel(Base): + __tablename__ = "net_objects" + + id = Column(String, primary_key=True, index=True) + name = Column(String, nullable=False) + slug = Column(String, nullable=True) + type = Column(String, nullable=False) + parent_id = Column(String, nullable=True, index=True) + status = Column(String, nullable=False, default="active") + vendor = Column(String, nullable=True) + model = Column(String, nullable=True) + serial = Column(String, nullable=True) + notes = Column(Text, nullable=True) + created_at = Column(DateTime(timezone=True), default=_now) + updated_at = Column(DateTime(timezone=True), default=_now, onupdate=_now) + + +class RelationModel(Base): + __tablename__ = "relations" + + id = Column(String, primary_key=True, index=True) + type = Column(String, nullable=False) + layer = Column(String, nullable=False) + source_id = Column(String, nullable=False, index=True) + target_id = Column(String, nullable=False, index=True) + direction = Column(String, nullable=False, default="forward") + source = Column(String, nullable=False) + confidence = Column(Float, nullable=False, default=1.0) + status = Column(String, nullable=False, default="active") + attributes_json = Column(Text, nullable=True, default="{}") + created_at = Column(DateTime(timezone=True), default=_now) + updated_at = Column(DateTime(timezone=True), default=_now, onupdate=_now) + + @property + def attributes(self): + return json.loads(self.attributes_json or "{}") + + @attributes.setter + def attributes(self, value): + self.attributes_json = json.dumps(value) + + +class JobModel(Base): + __tablename__ = "jobs" + + id = Column(String, primary_key=True, index=True) + type = Column(String, nullable=False) + status = Column(String, nullable=False, default="pending") + progress = Column(Integer, nullable=False, default=0) + message = Column(Text, nullable=True) + error = Column(Text, nullable=True) + payload_json = Column(Text, nullable=True) + result_json = Column(Text, nullable=True) + created_at = Column(DateTime(timezone=True), default=_now) + started_at = Column(DateTime(timezone=True), nullable=True) + finished_at = Column(DateTime(timezone=True), nullable=True) + + +class DiscoveryProfileModel(Base): + __tablename__ = "discovery_profiles" + + id = Column(String, primary_key=True, index=True) + name = Column(String, nullable=False) + strategy = Column(String, nullable=False, default="fast") + use_icmp = Column(Boolean, nullable=False, default=True) + use_arp = Column(Boolean, nullable=False, default=True) + use_snmp = Column(Boolean, nullable=False, default=False) + use_lldp = Column(Boolean, nullable=False, default=False) + use_portscan = Column(Boolean, nullable=False, default=False) + notes = Column(Text, nullable=True) + + +class DiscoveryRunModel(Base): + __tablename__ = "discovery_runs" + + id = Column(String, primary_key=True, index=True) + profile_id = Column(String, nullable=False, index=True) + subnet_ids_json = Column(Text, nullable=False, default="[]") + job_id = Column(String, nullable=True) + status = Column(String, nullable=False, default="pending") + summary_json = Column(Text, nullable=True) + created_at = Column(DateTime(timezone=True), default=_now) + started_at = Column(DateTime(timezone=True), nullable=True) + finished_at = Column(DateTime(timezone=True), nullable=True) + + +class UserModel(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True, autoincrement=True) + username = Column(String, unique=True, nullable=False, index=True) + email = Column(String, unique=True, nullable=True) + hashed_password = Column(String, nullable=False) + role = Column(String, nullable=False, default="viewer") + disabled = Column(Boolean, nullable=False, default=False) + force_password_change = Column(Boolean, nullable=False, default=False) + created_at = Column(DateTime(timezone=True), default=_now) + updated_at = Column(DateTime(timezone=True), default=_now, onupdate=_now)