Spaces:
Running
Running
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"]) | |
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 | |
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 | |
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 | |
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 | |