103 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from fastapi import APIRouter, Depends, HTTPException, status
 | 
						|
 | 
						|
from sqlalchemy.ext.asyncio import AsyncConnection
 | 
						|
 | 
						|
from api.db.connection.session import get_connection_dep
 | 
						|
from api.db.logic.account import get_user_by_login
 | 
						|
 | 
						|
from api.schemas.base import bearer_schema
 | 
						|
from api.schemas.process.process_schema import ProcessSchemaSettingsNodeLink, ProcessSchemaSettingsNode
 | 
						|
from api.schemas.process.ps_node import Ps_NodeFrontResponseNode, Ps_NodeRequest
 | 
						|
from api.schemas.process.ps_node import Ps_NodeFrontResponse
 | 
						|
from api.services.auth import get_current_user
 | 
						|
 | 
						|
 | 
						|
from api.db.logic.ps_node import create_ps_node_schema
 | 
						|
from api.db.logic.node_link import get_last_link_name_by_node_id, create_node_link_schema
 | 
						|
 | 
						|
from api.db.logic.process_schema import update_process_schema_settings_by_id
 | 
						|
 | 
						|
from core import VorkNodeRegistry, VorkNodeLink
 | 
						|
 | 
						|
from model_nodes import VorkNodeLinkData
 | 
						|
from api.utils.to_camel_dict import to_camel_dict
 | 
						|
 | 
						|
 | 
						|
api_router = APIRouter(
 | 
						|
    prefix="/ps_node",
 | 
						|
    tags=["ps node"],
 | 
						|
)
 | 
						|
 | 
						|
 | 
						|
@api_router.post("", dependencies=[Depends(bearer_schema)], response_model=Ps_NodeFrontResponse)
 | 
						|
async def create_ps_node_endpoint(
 | 
						|
    ps_node: Ps_NodeRequest,
 | 
						|
    connection: AsyncConnection = Depends(get_connection_dep),
 | 
						|
    current_user=Depends(get_current_user),
 | 
						|
):
 | 
						|
    user_validation = await get_user_by_login(connection, current_user)
 | 
						|
 | 
						|
    registery = VorkNodeRegistry()
 | 
						|
 | 
						|
    vork_node = registery.get(ps_node.data["node_type"])
 | 
						|
 | 
						|
    if vork_node is None:
 | 
						|
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Node not found")
 | 
						|
 | 
						|
    node_descriptor = vork_node.form()
 | 
						|
    try:
 | 
						|
        node_instance = vork_node(data=ps_node.data, links=ps_node.links)
 | 
						|
 | 
						|
        node_instance_validated = node_instance.validate()
 | 
						|
 | 
						|
    except Exception as e:
 | 
						|
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
 | 
						|
 | 
						|
    db_ps_node = await create_ps_node_schema(connection, node_instance_validated, user_validation.id)
 | 
						|
    link_name = await get_last_link_name_by_node_id(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(connection, validated_link, user_validation.id)
 | 
						|
 | 
						|
    links_settings = ProcessSchemaSettingsNodeLink(
 | 
						|
        id=db_node_link.id,
 | 
						|
        link_name=db_node_link.link_name,
 | 
						|
        parent_port_number=db_node_link.link_point_id,
 | 
						|
        from_id=db_node_link.node_id,
 | 
						|
        to_id=db_node_link.next_node_id,
 | 
						|
    )
 | 
						|
 | 
						|
    node_settings = ProcessSchemaSettingsNode(
 | 
						|
        id=db_ps_node.id,
 | 
						|
        node_type=db_ps_node.node_type,
 | 
						|
        data=node_instance_validated.data.model_dump(),
 | 
						|
        from_node=None,
 | 
						|
        links=[{"links": links_settings.model_dump()}],
 | 
						|
    )
 | 
						|
 | 
						|
    settings_dict = {"node": node_settings.model_dump(mode="json")}
 | 
						|
 | 
						|
    await update_process_schema_settings_by_id(connection, db_ps_node.ps_id, settings_dict)
 | 
						|
 | 
						|
    ps_node_front_response = Ps_NodeFrontResponse(
 | 
						|
        description=node_descriptor.model_dump(),
 | 
						|
        node=Ps_NodeFrontResponseNode(
 | 
						|
            id=db_ps_node.id,
 | 
						|
            node_type=db_ps_node.node_type,
 | 
						|
            data=to_camel_dict(node_instance_validated.data.model_dump()),
 | 
						|
        ),
 | 
						|
        links=[{"links": links_settings.model_dump()}],
 | 
						|
    )
 | 
						|
 | 
						|
    return ps_node_front_response
 |