66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
from typing import List, Dict, Any
|
||
from sqlalchemy.ext.asyncio import AsyncConnection
|
||
|
||
from api.db.logic.ps_node import (
|
||
get_nodes_for_deletion_ordered,
|
||
delete_ps_nodes_delete_handler,
|
||
create_ps_node_schema,
|
||
)
|
||
from api.db.logic.node_link import get_last_link_name_by_node_id, create_node_link_schema
|
||
from api.schemas.process.ps_node import Ps_NodeFrontResponse
|
||
from core import VorkNodeRegistry, VorkNodeLink
|
||
from model_nodes import VorkNodeLinkData
|
||
|
||
|
||
class PsNodeService:
|
||
"""Сервис для работы с ps nodes"""
|
||
|
||
def __init__(self, connection: AsyncConnection):
|
||
self.connection = connection
|
||
|
||
async def delete(self, next_node_id: int) -> Dict[str, List[int]]:
|
||
"""
|
||
Удаляет ноды в правильном порядке.
|
||
"""
|
||
ordered_node_ids = await get_nodes_for_deletion_ordered(self.connection, next_node_id)
|
||
deleted_node_ids = await delete_ps_nodes_delete_handler(self.connection, ordered_node_ids)
|
||
|
||
return {
|
||
"deleted_node_ids": deleted_node_ids,
|
||
}
|
||
|
||
async def create(
|
||
self, ps_node_data: Dict[str, Any], links: Dict[str, Any], creator_id: int
|
||
) -> Ps_NodeFrontResponse:
|
||
"""
|
||
Создаёт новую ноду с линком и обновляет настройки схемы процесса.
|
||
"""
|
||
registery = VorkNodeRegistry()
|
||
vork_node = registery.get(ps_node_data["node_type"])
|
||
node_descriptor = vork_node.form()
|
||
|
||
node_instance = vork_node(data=ps_node_data, links=links)
|
||
node_instance_validated = node_instance.validate()
|
||
|
||
db_ps_node = await create_ps_node_schema(self.connection, node_instance_validated, node_descriptor, creator_id)
|
||
link_name = await get_last_link_name_by_node_id(self.connection, db_ps_node.ps_id)
|
||
|
||
link_data = VorkNodeLinkData(
|
||
parent_port_number=node_instance_validated.parent_port_number,
|
||
to_id=db_ps_node.id,
|
||
from_id=node_instance_validated.parent_id,
|
||
last_link_name=link_name,
|
||
)
|
||
|
||
link = VorkNodeLink(data=link_data.model_dump())
|
||
validated_link = link.validate()
|
||
|
||
db_node_link = await create_node_link_schema(self.connection, validated_link, creator_id)
|
||
|
||
ps_node_front_response = Ps_NodeFrontResponse(
|
||
node=db_ps_node.model_dump(),
|
||
link=[{"link": db_node_link.model_dump()}],
|
||
)
|
||
|
||
return ps_node_front_response
|