from sqlalchemy import Table, Column, Integer, String, Text, Enum as SQLAEnum, JSON, ForeignKey, DateTime, Index, PrimaryKeyConstraint from sqlalchemy.sql import func from enum import Enum, auto from api.db.sql_types import UnsignedInt from api.db import metadata # Определение перечислений для статуса процесса class ProcessStatus(str, Enum): ACTIVE = auto() STOPPING = auto() STOPPED = auto() DELETED = auto() # Определение таблицы process_schema 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(str, Enum): ACTIVE = auto() DISABLED = auto() DELETED = auto() 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(str, Enum): ACTIVE = auto() STOPPING = auto() STOPPED = auto() DELETED = auto() 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'))