connect/api/api/db/tables/process.py

85 lines
3.2 KiB
Python

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'))