import enum from enum import Enum from sqlalchemy import ( Column, DateTime, Enum as SQLAEnum, ForeignKey, Index, JSON, PrimaryKeyConstraint, String, Table, Text, ) from sqlalchemy.sql import func from orm import metadata from orm.sql_types import UnsignedInt class ProcessStatus(enum.StrEnum): ACTIVE = "ACTIVE" STOPPING = "STOPPING" STOPPED = "STOPPED" DELETED = "DELETED" process_schema_table = Table( "process_schema", metadata, Column("id", UnsignedInt, primary_key=True, autoincrement=True), Column("title", String(100), nullable=False), Column("description", Text, nullable=False), Column("owner_id", UnsignedInt, ForeignKey("account.id"), nullable=False), Column("creator_id", UnsignedInt, ForeignKey("account.id"), nullable=False), Column("created_at", DateTime(timezone=True), server_default=func.now()), Column("settings", JSON, default={}), Column("status", SQLAEnum(ProcessStatus), nullable=False), Index( "idx_owner_id", "owner_id", ), ) process_version_archive_table = Table( "process_version_archive", metadata, Column("id", UnsignedInt, autoincrement=True, nullable=False), Column("ps_id", UnsignedInt, ForeignKey("process_schema.id"), nullable=False), Column("version", UnsignedInt, default=1, nullable=False), Column("snapshot", JSON, default={}), Column("owner_id", UnsignedInt, ForeignKey("account.id"), nullable=False), Column("created_at", DateTime(timezone=True), server_default=func.now()), Column("is_last", UnsignedInt, default=0), PrimaryKeyConstraint("id", "version"), ) class NodeStatus(enum.StrEnum): ACTIVE = "ACTIVE" DISABLED = "DISABLED" DELETED = "DELETED" class NodeType(Enum): TYPE1 = "Type1" TYPE2 = "Type2" TYPE3 = "Type3" ps_node_table = Table( "ps_node", metadata, Column("id", UnsignedInt, autoincrement=True, primary_key=True, nullable=False), Column("ps_id", UnsignedInt, ForeignKey("process_schema.id"), nullable=False), Column("node_type", SQLAEnum(NodeType), nullable=False), Column("settings", JSON, default={}), Column("creator_id", UnsignedInt, ForeignKey("account.id"), nullable=False), Column("created_at", DateTime(timezone=True), server_default=func.now()), Column("status", SQLAEnum(NodeStatus), nullable=False), Index("idx_ps_id", "ps_id"), ) class NodeLinkStatus(enum.StrEnum): ACTIVE = "ACTIVE" STOPPING = "STOPPING" STOPPED = "STOPPED" DELETED = "DELETED" node_link_table = Table( "node_link", metadata, Column("id", UnsignedInt, autoincrement=True, primary_key=True, nullable=False), Column("link_name", String(20), nullable=False), Column("node_id", UnsignedInt, ForeignKey("ps_node.id"), nullable=False), Column("next_node_id", UnsignedInt, ForeignKey("ps_node.id"), nullable=False), Column("settings", JSON, default={}), Column("creator_id", UnsignedInt, ForeignKey("account.id"), nullable=False), Column("created_at", DateTime(timezone=True), server_default=func.now()), Column("status", SQLAEnum(NodeLinkStatus), nullable=False), Index("idx_node_id", "node_id"), Index("idx_next_node_id", "next_node_id"), )