diff --git a/src/backend/langflow/api/router.py b/src/backend/langflow/api/router.py index ea1938a75..70cce437d 100644 --- a/src/backend/langflow/api/router.py +++ b/src/backend/langflow/api/router.py @@ -6,6 +6,8 @@ from langflow.api.v1 import ( validate_router, flows_router, component_router, + users_router, + api_key_router, ) router = APIRouter( @@ -16,3 +18,5 @@ router.include_router(endpoints_router) router.include_router(validate_router) router.include_router(component_router) router.include_router(flows_router) +router.include_router(users_router) +router.include_router(api_key_router) diff --git a/src/backend/langflow/api/v1/__init__.py b/src/backend/langflow/api/v1/__init__.py index b6e7b36d8..38f1c9148 100644 --- a/src/backend/langflow/api/v1/__init__.py +++ b/src/backend/langflow/api/v1/__init__.py @@ -3,6 +3,8 @@ from langflow.api.v1.validate import router as validate_router from langflow.api.v1.chat import router as chat_router from langflow.api.v1.flows import router as flows_router from langflow.api.v1.components import router as component_router +from langflow.api.v1.users import router as users_router +from langflow.api.v1.api_key import router as api_key_router __all__ = [ "chat_router", @@ -10,4 +12,6 @@ __all__ = [ "component_router", "validate_router", "flows_router", + "users_router", + "api_key_router", ] diff --git a/src/backend/langflow/routers/api_key.py b/src/backend/langflow/api/v1/api_key.py similarity index 100% rename from src/backend/langflow/routers/api_key.py rename to src/backend/langflow/api/v1/api_key.py diff --git a/src/backend/langflow/routers/login.py b/src/backend/langflow/api/v1/login.py similarity index 100% rename from src/backend/langflow/routers/login.py rename to src/backend/langflow/api/v1/login.py diff --git a/src/backend/langflow/api/v1/schemas.py b/src/backend/langflow/api/v1/schemas.py index d188e5c7a..d788469fa 100644 --- a/src/backend/langflow/api/v1/schemas.py +++ b/src/backend/langflow/api/v1/schemas.py @@ -3,6 +3,7 @@ from pathlib import Path from typing import Any, Dict, List, Optional, Union from langflow.services.database.models.api_key import ApiKeyRead from langflow.services.database.models.flow import FlowCreate, FlowRead +from langflow.services.database.models.user import UserRead from pydantic import BaseModel, Field, validator import json @@ -141,3 +142,8 @@ class ApiKeyResponse(BaseModel): total_count: int user_id: str api_keys: List[ApiKeyRead] + + +class UsersResponse(BaseModel): + total_count: int + users: List[UserRead] diff --git a/src/backend/langflow/routers/users.py b/src/backend/langflow/api/v1/users.py similarity index 88% rename from src/backend/langflow/routers/users.py rename to src/backend/langflow/api/v1/users.py index 2a944cb64..33ddc9763 100644 --- a/src/backend/langflow/routers/users.py +++ b/src/backend/langflow/api/v1/users.py @@ -1,10 +1,10 @@ from uuid import UUID +from langflow.api.v1.schemas import UsersResponse from langflow.services.database.models.user import ( User, - UserAddModel, - UserListModel, - UserPatchModel, - UsersResponse, + UserCreate, + UserRead, + UserUpdate, ) from sqlalchemy import func @@ -15,16 +15,16 @@ from fastapi import APIRouter, Depends, HTTPException from langflow.services.utils import get_session from langflow.services.auth.utils import get_current_active_user, get_password_hash -from langflow.services.database.models.user import ( +from langflow.services.database.models.user.utils import ( update_user, ) router = APIRouter(tags=["Login"]) -@router.post("/user", response_model=UserListModel) +@router.post("/user", response_model=UserRead) def add_user( - user: UserAddModel, + user: UserCreate, db: Session = Depends(get_session), ) -> User: """ @@ -44,7 +44,7 @@ def add_user( return new_user -@router.get("/user", response_model=UserListModel) +@router.get("/user", response_model=UserRead) def read_current_user(current_user: User = Depends(get_current_active_user)) -> User: """ Retrieve the current user's data. @@ -70,14 +70,14 @@ def read_all_users( return UsersResponse( total_count=total_count, # type: ignore - users=[UserListModel(**dict(user.User)) for user in users], + users=[UserRead(**dict(user.User)) for user in users], ) -@router.patch("/user/{user_id}", response_model=UserListModel) +@router.patch("/user/{user_id}", response_model=UserRead) def patch_user( user_id: UUID, - user: UserPatchModel, + user: UserUpdate, _: Session = Depends(get_current_active_user), db: Session = Depends(get_session), ) -> User: diff --git a/src/backend/langflow/routers/health.py b/src/backend/langflow/routers/health.py deleted file mode 100644 index 244ef001d..000000000 --- a/src/backend/langflow/routers/health.py +++ /dev/null @@ -1,8 +0,0 @@ -from fastapi import APIRouter - -router = APIRouter() - - -@router.get("/health") -def get_health(): - return {"status": "OK"} diff --git a/src/backend/langflow/services/auth/utils.py b/src/backend/langflow/services/auth/utils.py index f897151e7..aa4bec669 100644 --- a/src/backend/langflow/services/auth/utils.py +++ b/src/backend/langflow/services/auth/utils.py @@ -4,8 +4,8 @@ from jose import JWTError, jwt from typing import Annotated from uuid import UUID from langflow.services.auth.service import AuthManager -from langflow.services.database.models.user import ( - User, +from langflow.services.database.models.user.user import User +from langflow.services.database.models.user.utils import ( get_user_by_id, get_user_by_username, update_user_last_login_at,