|
|
from uuid import UUID |
|
|
|
|
|
from fastapi import APIRouter, HTTPException |
|
|
from sqlalchemy.exc import NoResultFound |
|
|
|
|
|
from langflow.api.utils import CurrentActiveUser, DbSession |
|
|
from langflow.services.database.models.variable import VariableCreate, VariableRead, VariableUpdate |
|
|
from langflow.services.deps import get_variable_service |
|
|
from langflow.services.variable.constants import GENERIC_TYPE |
|
|
from langflow.services.variable.service import DatabaseVariableService |
|
|
|
|
|
router = APIRouter(prefix="/variables", tags=["Variables"]) |
|
|
|
|
|
|
|
|
@router.post("/", response_model=VariableRead, status_code=201) |
|
|
async def create_variable( |
|
|
*, |
|
|
session: DbSession, |
|
|
variable: VariableCreate, |
|
|
current_user: CurrentActiveUser, |
|
|
): |
|
|
"""Create a new variable.""" |
|
|
variable_service = get_variable_service() |
|
|
if not variable.name and not variable.value: |
|
|
raise HTTPException(status_code=400, detail="Variable name and value cannot be empty") |
|
|
|
|
|
if not variable.name: |
|
|
raise HTTPException(status_code=400, detail="Variable name cannot be empty") |
|
|
|
|
|
if not variable.value: |
|
|
raise HTTPException(status_code=400, detail="Variable value cannot be empty") |
|
|
|
|
|
if variable.name in await variable_service.list_variables(user_id=current_user.id, session=session): |
|
|
raise HTTPException(status_code=400, detail="Variable name already exists") |
|
|
try: |
|
|
return await variable_service.create_variable( |
|
|
user_id=current_user.id, |
|
|
name=variable.name, |
|
|
value=variable.value, |
|
|
default_fields=variable.default_fields or [], |
|
|
type_=variable.type or GENERIC_TYPE, |
|
|
session=session, |
|
|
) |
|
|
except Exception as e: |
|
|
if isinstance(e, HTTPException): |
|
|
raise |
|
|
raise HTTPException(status_code=500, detail=str(e)) from e |
|
|
|
|
|
|
|
|
@router.get("/", response_model=list[VariableRead], status_code=200) |
|
|
async def read_variables( |
|
|
*, |
|
|
session: DbSession, |
|
|
current_user: CurrentActiveUser, |
|
|
): |
|
|
"""Read all variables.""" |
|
|
variable_service = get_variable_service() |
|
|
if not isinstance(variable_service, DatabaseVariableService): |
|
|
msg = "Variable service is not an instance of DatabaseVariableService" |
|
|
raise TypeError(msg) |
|
|
try: |
|
|
return await variable_service.get_all(user_id=current_user.id, session=session) |
|
|
except Exception as e: |
|
|
raise HTTPException(status_code=500, detail=str(e)) from e |
|
|
|
|
|
|
|
|
@router.patch("/{variable_id}", response_model=VariableRead, status_code=200) |
|
|
async def update_variable( |
|
|
*, |
|
|
session: DbSession, |
|
|
variable_id: UUID, |
|
|
variable: VariableUpdate, |
|
|
current_user: CurrentActiveUser, |
|
|
): |
|
|
"""Update a variable.""" |
|
|
variable_service = get_variable_service() |
|
|
if not isinstance(variable_service, DatabaseVariableService): |
|
|
msg = "Variable service is not an instance of DatabaseVariableService" |
|
|
raise TypeError(msg) |
|
|
try: |
|
|
return await variable_service.update_variable_fields( |
|
|
user_id=current_user.id, |
|
|
variable_id=variable_id, |
|
|
variable=variable, |
|
|
session=session, |
|
|
) |
|
|
except NoResultFound as e: |
|
|
raise HTTPException(status_code=404, detail="Variable not found") from e |
|
|
|
|
|
except Exception as e: |
|
|
raise HTTPException(status_code=500, detail=str(e)) from e |
|
|
|
|
|
|
|
|
@router.delete("/{variable_id}", status_code=204) |
|
|
async def delete_variable( |
|
|
*, |
|
|
session: DbSession, |
|
|
variable_id: UUID, |
|
|
current_user: CurrentActiveUser, |
|
|
) -> None: |
|
|
"""Delete a variable.""" |
|
|
variable_service = get_variable_service() |
|
|
try: |
|
|
await variable_service.delete_variable_by_id(user_id=current_user.id, variable_id=variable_id, session=session) |
|
|
except Exception as e: |
|
|
raise HTTPException(status_code=500, detail=str(e)) from e |
|
|
|