From d9cbf17b1a779f5a05cbf29798edea56e4823aa1 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 24 Aug 2023 17:41:41 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=84=20chore(router.py):=20add=20users?= =?UTF-8?q?=5Frouter=20and=20api=5Fkey=5Frouter=20to=20the=20APIRouter=20t?= =?UTF-8?q?o=20include=20the=20new=20routes=20for=20users=20and=20api=20ke?= =?UTF-8?q?ys=20=F0=9F=94=84=20chore(=5F=5Finit=5F=5F.py):=20add=20users?= =?UTF-8?q?=5Frouter=20and=20api=5Fkey=5Frouter=20to=20the=20=5F=5Fall=5F?= =?UTF-8?q?=5F=20list=20to=20include=20the=20new=20routes=20for=20users=20?= =?UTF-8?q?and=20api=20keys=20=F0=9F=86=95=20feat(api=5Fkey.py):=20add=20n?= =?UTF-8?q?ew=20routes=20for=20retrieving,=20creating,=20and=20deleting=20?= =?UTF-8?q?API=20keys=20=F0=9F=86=95=20feat(login.py):=20add=20new=20route?= =?UTF-8?q?s=20for=20user=20login,=20auto=20login,=20and=20token=20refresh?= =?UTF-8?q?=20=F0=9F=86=95=20feat(schemas.py):=20add=20new=20schemas=20for?= =?UTF-8?q?=20API=20key=20response=20and=20users=20response=20=F0=9F=86=95?= =?UTF-8?q?=20feat(users.py):=20add=20new=20routes=20for=20adding,=20readi?= =?UTF-8?q?ng,=20updating,=20and=20deleting=20users=20=F0=9F=97=91?= =?UTF-8?q?=EF=B8=8F=20chore(health.py):=20remove=20health=20router=20as?= =?UTF-8?q?=20it=20is=20no=20longer=20needed=20=F0=9F=94=84=20chore(utils.?= =?UTF-8?q?py):=20update=20import=20statements=20for=20User=20model=20and?= =?UTF-8?q?=20update=5Fuser=5Flast=5Flogin=5Fat=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/router.py | 4 ++++ src/backend/langflow/api/v1/__init__.py | 4 ++++ .../langflow/{routers => api/v1}/api_key.py | 0 .../langflow/{routers => api/v1}/login.py | 0 src/backend/langflow/api/v1/schemas.py | 6 +++++ .../langflow/{routers => api/v1}/users.py | 22 +++++++++---------- src/backend/langflow/routers/health.py | 8 ------- src/backend/langflow/services/auth/utils.py | 4 ++-- 8 files changed, 27 insertions(+), 21 deletions(-) rename src/backend/langflow/{routers => api/v1}/api_key.py (100%) rename src/backend/langflow/{routers => api/v1}/login.py (100%) rename src/backend/langflow/{routers => api/v1}/users.py (88%) delete mode 100644 src/backend/langflow/routers/health.py 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,