From 1a51cc0848211b8133da1994aaff90b740a40f9f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 24 Aug 2023 17:32:26 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=A6=20feat(api=5Fkey):=20add=20ApiKey?= =?UTF-8?q?=20model=20and=20related=20classes=20for=20database=20operation?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 📦 feat(component): add Component model and related classes for database operations 📦 feat(flow): add Flow model and related classes for database operations 📦 feat(token): add Token model for authentication 📦 feat(user): add User model and related classes for database operations 📦 feat(user): add utility functions for user operations --- .../database/models/api_key/__init__.py | 3 ++ .../database/models/{ => api_key}/api_key.py | 0 .../database/models/component/__init__.py | 3 ++ .../models/{ => component}/component.py | 0 .../services/database/models/flow/__init__.py | 3 ++ .../database/models/{ => flow}/flow.py | 3 -- .../database/models/token/__init__.py | 5 ++ .../database/models/{ => token}/token.py | 0 .../services/database/models/user/__init__.py | 8 +++ .../services/database/models/user/user.py | 40 ++++++++++++++ .../models/{user.py => user/utils.py} | 53 ++----------------- 11 files changed, 67 insertions(+), 51 deletions(-) create mode 100644 src/backend/langflow/services/database/models/api_key/__init__.py rename src/backend/langflow/services/database/models/{ => api_key}/api_key.py (100%) create mode 100644 src/backend/langflow/services/database/models/component/__init__.py rename src/backend/langflow/services/database/models/{ => component}/component.py (100%) create mode 100644 src/backend/langflow/services/database/models/flow/__init__.py rename src/backend/langflow/services/database/models/{ => flow}/flow.py (94%) create mode 100644 src/backend/langflow/services/database/models/token/__init__.py rename src/backend/langflow/services/database/models/{ => token}/token.py (100%) create mode 100644 src/backend/langflow/services/database/models/user/__init__.py create mode 100644 src/backend/langflow/services/database/models/user/user.py rename src/backend/langflow/services/database/models/{user.py => user/utils.py} (51%) diff --git a/src/backend/langflow/services/database/models/api_key/__init__.py b/src/backend/langflow/services/database/models/api_key/__init__.py new file mode 100644 index 000000000..c97425ee8 --- /dev/null +++ b/src/backend/langflow/services/database/models/api_key/__init__.py @@ -0,0 +1,3 @@ +from .api_key import ApiKey, ApiKeyCreate, ApiKeyRead + +__all__ = ["ApiKey", "ApiKeyCreate", "ApiKeyRead"] diff --git a/src/backend/langflow/services/database/models/api_key.py b/src/backend/langflow/services/database/models/api_key/api_key.py similarity index 100% rename from src/backend/langflow/services/database/models/api_key.py rename to src/backend/langflow/services/database/models/api_key/api_key.py diff --git a/src/backend/langflow/services/database/models/component/__init__.py b/src/backend/langflow/services/database/models/component/__init__.py new file mode 100644 index 000000000..c787c3e04 --- /dev/null +++ b/src/backend/langflow/services/database/models/component/__init__.py @@ -0,0 +1,3 @@ +from .component import Component, ComponentModel + +__all__ = ["Component", "ComponentModel"] diff --git a/src/backend/langflow/services/database/models/component.py b/src/backend/langflow/services/database/models/component/component.py similarity index 100% rename from src/backend/langflow/services/database/models/component.py rename to src/backend/langflow/services/database/models/component/component.py diff --git a/src/backend/langflow/services/database/models/flow/__init__.py b/src/backend/langflow/services/database/models/flow/__init__.py new file mode 100644 index 000000000..7c7cc0172 --- /dev/null +++ b/src/backend/langflow/services/database/models/flow/__init__.py @@ -0,0 +1,3 @@ +from .flow import Flow, FlowCreate, FlowRead, FlowUpdate + +__all__ = ["Flow", "FlowCreate", "FlowRead", "FlowUpdate"] diff --git a/src/backend/langflow/services/database/models/flow.py b/src/backend/langflow/services/database/models/flow/flow.py similarity index 94% rename from src/backend/langflow/services/database/models/flow.py rename to src/backend/langflow/services/database/models/flow/flow.py index 2bc83f9dc..a05de5791 100644 --- a/src/backend/langflow/services/database/models/flow.py +++ b/src/backend/langflow/services/database/models/flow/flow.py @@ -6,8 +6,6 @@ from sqlmodel import Field, JSON, Column from uuid import UUID, uuid4 from typing import Dict, Optional -# if TYPE_CHECKING: - class FlowBase(SQLModelSerializable): name: str = Field(index=True) @@ -16,7 +14,6 @@ class FlowBase(SQLModelSerializable): @validator("data") def validate_json(v): - # dict_keys(['description', 'name', 'id', 'data']) if not v: return v if not isinstance(v, dict): diff --git a/src/backend/langflow/services/database/models/token/__init__.py b/src/backend/langflow/services/database/models/token/__init__.py new file mode 100644 index 000000000..9b9fa397d --- /dev/null +++ b/src/backend/langflow/services/database/models/token/__init__.py @@ -0,0 +1,5 @@ +from .token import Token + +__all__ = [ + "Token", +] diff --git a/src/backend/langflow/services/database/models/token.py b/src/backend/langflow/services/database/models/token/token.py similarity index 100% rename from src/backend/langflow/services/database/models/token.py rename to src/backend/langflow/services/database/models/token/token.py diff --git a/src/backend/langflow/services/database/models/user/__init__.py b/src/backend/langflow/services/database/models/user/__init__.py new file mode 100644 index 000000000..da9170eb7 --- /dev/null +++ b/src/backend/langflow/services/database/models/user/__init__.py @@ -0,0 +1,8 @@ +from .user import User, UserCreate, UserRead, UserUpdate + +__all__ = [ + "User", + "UserCreate", + "UserRead", + "UserUpdate", +] diff --git a/src/backend/langflow/services/database/models/user/user.py b/src/backend/langflow/services/database/models/user/user.py new file mode 100644 index 000000000..3a4308b42 --- /dev/null +++ b/src/backend/langflow/services/database/models/user/user.py @@ -0,0 +1,40 @@ +from langflow.services.database.models.base import SQLModel, SQLModelSerializable +from sqlmodel import Field + + +from datetime import datetime +from typing import Optional +from uuid import UUID, uuid4 + + +class User(SQLModelSerializable, table=True): + id: UUID = Field(default_factory=uuid4, primary_key=True, unique=True) + username: str = Field(index=True, unique=True) + password: str = Field() + is_active: bool = Field(default=False) + is_superuser: bool = Field(default=False) + create_at: datetime = Field(default_factory=datetime.utcnow) + updated_at: datetime = Field(default_factory=datetime.utcnow) + last_login_at: Optional[datetime] = Field() + + +class UserCreate(SQLModel): + username: str = Field() + password: str = Field() + + +class UserRead(SQLModel): + id: UUID = Field(default_factory=uuid4) + username: str = Field() + is_active: bool = Field() + is_superuser: bool = Field() + create_at: datetime = Field() + updated_at: datetime = Field() + last_login_at: Optional[datetime] = Field() + + +class UserUpdate(SQLModel): + username: Optional[str] = Field() + is_active: Optional[bool] = Field() + is_superuser: Optional[bool] = Field() + last_login_at: Optional[datetime] = Field() diff --git a/src/backend/langflow/services/database/models/user.py b/src/backend/langflow/services/database/models/user/utils.py similarity index 51% rename from src/backend/langflow/services/database/models/user.py rename to src/backend/langflow/services/database/models/user/utils.py index f9a3c80f8..3b600bd9a 100644 --- a/src/backend/langflow/services/database/models/user.py +++ b/src/backend/langflow/services/database/models/user/utils.py @@ -1,53 +1,10 @@ +from datetime import datetime, timezone +from uuid import UUID from fastapi import Depends, HTTPException -from langflow.services.database.models.base import SQLModel, SQLModelSerializable +from langflow.services.database.models.user.user import User, UserUpdate from langflow.services.utils import get_session -from pydantic import BaseModel from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import Session -from sqlmodel import Field - - -from datetime import datetime, timezone -from typing import List, Optional -from uuid import UUID, uuid4 - - -class User(SQLModelSerializable, table=True): - id: UUID = Field(default_factory=uuid4, primary_key=True, unique=True) - username: str = Field(index=True, unique=True) - password: str = Field() - is_active: bool = Field(default=False) - is_superuser: bool = Field(default=False) - create_at: datetime = Field(default_factory=datetime.utcnow) - updated_at: datetime = Field(default_factory=datetime.utcnow) - last_login_at: Optional[datetime] = Field() - - -class UserAddModel(SQLModel): - username: str = Field() - password: str = Field() - - -class UserListModel(SQLModel): - id: UUID = Field(default_factory=uuid4) - username: str = Field() - is_active: bool = Field() - is_superuser: bool = Field() - create_at: datetime = Field() - updated_at: datetime = Field() - last_login_at: Optional[datetime] = Field() - - -class UserPatchModel(SQLModel): - username: Optional[str] = Field() - is_active: Optional[bool] = Field() - is_superuser: Optional[bool] = Field() - last_login_at: Optional[datetime] = Field() - - -class UsersResponse(BaseModel): - total_count: int - users: List[UserListModel] def get_user_by_username(db: Session, username: str) -> User: @@ -61,7 +18,7 @@ def get_user_by_id(db: Session, id: UUID) -> User: def update_user( - user_id: UUID, user: UserPatchModel, db: Session = Depends(get_session) + user_id: UUID, user: UserUpdate, db: Session = Depends(get_session) ) -> User: user_db = get_user_by_username(db, user.username) # type: ignore if user_db and user_db.id != user_id: @@ -90,6 +47,6 @@ def update_user( def update_user_last_login_at(user_id: UUID, db: Session = Depends(get_session)): - user_data = UserPatchModel(last_login_at=datetime.now(timezone.utc)) # type: ignore + user_data = UserUpdate(last_login_at=datetime.now(timezone.utc)) # type: ignore return update_user(user_id, user_data, db)