Tai Truong
fix readme
d202ada
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