📦 feat(api_key): add ApiKey model and related classes for database operations
📦 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
This commit is contained in:
parent
fd6ef1815b
commit
1a51cc0848
11 changed files with 67 additions and 51 deletions
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .api_key import ApiKey, ApiKeyCreate, ApiKeyRead
|
||||||
|
|
||||||
|
__all__ = ["ApiKey", "ApiKeyCreate", "ApiKeyRead"]
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .component import Component, ComponentModel
|
||||||
|
|
||||||
|
__all__ = ["Component", "ComponentModel"]
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from .flow import Flow, FlowCreate, FlowRead, FlowUpdate
|
||||||
|
|
||||||
|
__all__ = ["Flow", "FlowCreate", "FlowRead", "FlowUpdate"]
|
||||||
|
|
@ -6,8 +6,6 @@ from sqlmodel import Field, JSON, Column
|
||||||
from uuid import UUID, uuid4
|
from uuid import UUID, uuid4
|
||||||
from typing import Dict, Optional
|
from typing import Dict, Optional
|
||||||
|
|
||||||
# if TYPE_CHECKING:
|
|
||||||
|
|
||||||
|
|
||||||
class FlowBase(SQLModelSerializable):
|
class FlowBase(SQLModelSerializable):
|
||||||
name: str = Field(index=True)
|
name: str = Field(index=True)
|
||||||
|
|
@ -16,7 +14,6 @@ class FlowBase(SQLModelSerializable):
|
||||||
|
|
||||||
@validator("data")
|
@validator("data")
|
||||||
def validate_json(v):
|
def validate_json(v):
|
||||||
# dict_keys(['description', 'name', 'id', 'data'])
|
|
||||||
if not v:
|
if not v:
|
||||||
return v
|
return v
|
||||||
if not isinstance(v, dict):
|
if not isinstance(v, dict):
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
from .token import Token
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"Token",
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
from .user import User, UserCreate, UserRead, UserUpdate
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"User",
|
||||||
|
"UserCreate",
|
||||||
|
"UserRead",
|
||||||
|
"UserUpdate",
|
||||||
|
]
|
||||||
40
src/backend/langflow/services/database/models/user/user.py
Normal file
40
src/backend/langflow/services/database/models/user/user.py
Normal file
|
|
@ -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()
|
||||||
|
|
@ -1,53 +1,10 @@
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
from uuid import UUID
|
||||||
from fastapi import Depends, HTTPException
|
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 langflow.services.utils import get_session
|
||||||
from pydantic import BaseModel
|
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
from sqlalchemy.orm import Session
|
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:
|
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(
|
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:
|
||||||
user_db = get_user_by_username(db, user.username) # type: ignore
|
user_db = get_user_by_username(db, user.username) # type: ignore
|
||||||
if user_db and user_db.id != user_id:
|
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)):
|
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)
|
return update_user(user_id, user_data, db)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue