fix: add folder_id and sort_order to AIChatSession model, fix UUID conversion in routes, add migration 0003
This commit is contained in:
@@ -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 ---
|
||||||
|
|||||||
@@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user