fix: add folder_id and sort_order to AIChatSession model, fix UUID conversion in routes, add migration 0003

This commit is contained in:
Agent Zero
2026-07-17 21:20:49 +02:00
parent 165350eda0
commit 3fc4dcdb96
5 changed files with 38 additions and 3 deletions
@@ -0,0 +1,8 @@
-- Migration 0003: Add sort_order columns for drag&drop reordering
ALTER TABLE ai_chat_sessions ADD COLUMN IF NOT EXISTS sort_order INTEGER NOT NULL DEFAULT 0;
ALTER TABLE ai_chat_folders ADD COLUMN IF NOT EXISTS sort_order INTEGER NOT NULL DEFAULT 0;
CREATE INDEX IF NOT EXISTS ix_ai_sessions_folder ON ai_chat_sessions(folder_id);
CREATE INDEX IF NOT EXISTS ix_ai_sessions_sort ON ai_chat_sessions(sort_order);
CREATE INDEX IF NOT EXISTS ix_ai_folders_sort ON ai_chat_folders(sort_order);
@@ -149,6 +149,12 @@ class AIChatSession(Base, TenantMixin):
title: Mapped[str] = mapped_column(String(255), nullable=False, default="Neuer Chat") title: Mapped[str] = mapped_column(String(255), nullable=False, default="Neuer Chat")
is_pinned: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) is_pinned: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
is_sidebar: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) is_sidebar: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
folder_id: Mapped[uuid.UUID | None] = mapped_column(
PGUUID(as_uuid=True),
ForeignKey("ai_chat_folders.id", ondelete="SET NULL"),
nullable=True,
)
sort_order: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
# --- Chat Messages --- # --- Chat Messages ---
@@ -200,6 +206,7 @@ class AIChatFolder(Base, TenantMixin):
nullable=True, nullable=True,
) )
user_id: Mapped[uuid.UUID] = mapped_column(PGUUID(as_uuid=True), nullable=False) user_id: Mapped[uuid.UUID] = mapped_column(PGUUID(as_uuid=True), nullable=False)
sort_order: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
# --- Chat Attachments --- # --- Chat Attachments ---
+15 -2
View File
@@ -457,11 +457,16 @@ async def create_session(
if default_agent: if default_agent:
agent_id = default_agent.id agent_id = default_agent.id
folder_id = None
if data.folder_id:
folder_id = uuid.UUID(data.folder_id)
session = AIChatSession( session = AIChatSession(
user_id=user_id, user_id=user_id,
agent_id=agent_id, agent_id=agent_id,
title=data.title, title=data.title,
is_sidebar=data.is_sidebar, is_sidebar=data.is_sidebar,
folder_id=folder_id,
tenant_id=tenant_id, tenant_id=tenant_id,
) )
db.add(session) db.add(session)
@@ -486,6 +491,11 @@ async def update_session(
update_data = data.model_dump(exclude_unset=True) update_data = data.model_dump(exclude_unset=True)
if "agent_id" in update_data and update_data["agent_id"]: if "agent_id" in update_data and update_data["agent_id"]:
update_data["agent_id"] = uuid.UUID(update_data["agent_id"]) update_data["agent_id"] = uuid.UUID(update_data["agent_id"])
if "folder_id" in update_data:
if update_data["folder_id"]:
update_data["folder_id"] = uuid.UUID(update_data["folder_id"])
else:
update_data["folder_id"] = None
for field, val in update_data.items(): for field, val in update_data.items():
setattr(session, field, val) setattr(session, field, val)
await db.commit() await db.commit()
@@ -643,8 +653,11 @@ async def update_folder(
raise HTTPException(status_code=404, detail="Folder not found") raise HTTPException(status_code=404, detail="Folder not found")
update_data = data.model_dump(exclude_unset=True) update_data = data.model_dump(exclude_unset=True)
if "parent_id" in update_data and update_data["parent_id"]: if "parent_id" in update_data:
update_data["parent_id"] = uuid.UUID(update_data["parent_id"]) if update_data["parent_id"]:
update_data["parent_id"] = uuid.UUID(update_data["parent_id"])
else:
update_data["parent_id"] = None
for field, val in update_data.items(): for field, val in update_data.items():
setattr(folder, field, val) setattr(folder, field, val)
await db.commit() await db.commit()
@@ -163,6 +163,7 @@ class ChatSessionCreate(BaseModel):
title: str = Field(default="Neuer Chat", max_length=255) title: str = Field(default="Neuer Chat", max_length=255)
agent_id: str | None = None agent_id: str | None = None
is_sidebar: bool = False is_sidebar: bool = False
folder_id: str | None = None
class ChatSessionUpdate(BaseModel): class ChatSessionUpdate(BaseModel):
@@ -170,6 +171,7 @@ class ChatSessionUpdate(BaseModel):
is_pinned: bool | None = None is_pinned: bool | None = None
agent_id: str | None = None agent_id: str | None = None
folder_id: str | None = None folder_id: str | None = None
sort_order: int | None = None
class ChatSessionResponse(BaseModel): class ChatSessionResponse(BaseModel):
@@ -181,6 +183,7 @@ class ChatSessionResponse(BaseModel):
is_pinned: bool is_pinned: bool
is_sidebar: bool is_sidebar: bool
folder_id: str | None = None folder_id: str | None = None
sort_order: int = 0
created_at: datetime | None = None created_at: datetime | None = None
updated_at: datetime | None = None updated_at: datetime | None = None
@@ -215,6 +218,7 @@ class ChatFolderCreate(BaseModel):
class ChatFolderUpdate(BaseModel): class ChatFolderUpdate(BaseModel):
name: str | None = Field(None, min_length=1, max_length=255) name: str | None = Field(None, min_length=1, max_length=255)
parent_id: str | None = None parent_id: str | None = None
sort_order: int | None = None
class ChatFolderResponse(BaseModel): class ChatFolderResponse(BaseModel):
@@ -223,6 +227,7 @@ class ChatFolderResponse(BaseModel):
name: str name: str
parent_id: str | None = None parent_id: str | None = None
user_id: str user_id: str
sort_order: int = 0
created_at: datetime | None = None created_at: datetime | None = None
@@ -115,7 +115,8 @@ def session_to_response(session: AIChatSession) -> dict[str, Any]:
"title": session.title, "title": session.title,
"is_pinned": session.is_pinned, "is_pinned": session.is_pinned,
"is_sidebar": session.is_sidebar, "is_sidebar": session.is_sidebar,
"folder_id": str(session.folder_id) if hasattr(session, 'folder_id') and session.folder_id else None, "folder_id": str(session.folder_id) if session.folder_id else None,
"sort_order": session.sort_order,
"created_at": session.created_at.isoformat() if session.created_at else None, "created_at": session.created_at.isoformat() if session.created_at else None,
"updated_at": session.updated_at.isoformat() if session.updated_at else None, "updated_at": session.updated_at.isoformat() if session.updated_at else None,
} }
@@ -141,6 +142,7 @@ def folder_to_response(folder: AIChatFolder) -> dict[str, Any]:
"name": folder.name, "name": folder.name,
"parent_id": str(folder.parent_id) if folder.parent_id else None, "parent_id": str(folder.parent_id) if folder.parent_id else None,
"user_id": str(folder.user_id), "user_id": str(folder.user_id),
"sort_order": folder.sort_order,
"created_at": folder.created_at.isoformat() if folder.created_at else None, "created_at": folder.created_at.isoformat() if folder.created_at else None,
} }