feat: New Chat, Search Chat and Master Slave DB Architecture for CRM and Oracle Canvas

This commit is contained in:
Sagnik
2026-04-24 04:18:33 +05:30
parent f04571bd7b
commit eabecf7a25
7 changed files with 1117 additions and 520 deletions

View File

@@ -134,6 +134,14 @@ async def _ctx_from_request(request: Request, user: UserPrincipal) -> PolicyCont
)
async def _resolve_page_id(request: Request, user: UserPrincipal, page_id: str) -> str:
normalized = (page_id or "").strip()
if normalized and normalized.lower() != "main":
return normalized
me = await _get_current_user_profile(request, user)
return str(me["defaultPageId"])
# ── Pydantic Models ───────────────────────────────────────────────────────────
class PromptSubmitRequest(BaseModel):
@@ -184,6 +192,14 @@ class PersonaRenderRequest(BaseModel):
variables: dict[str, Any] = Field(default_factory=dict)
class PageCreateRequest(BaseModel):
title: str = Field(default="Untitled Canvas", max_length=256)
class PageUpdateRequest(BaseModel):
title: str = Field(..., min_length=1, max_length=256)
# ── Endpoints ─────────────────────────────────────────────────────────────────
@router.get("/me", summary="Get current user profile")
@@ -191,8 +207,41 @@ async def get_me(request: Request, user: UserPrincipal = Depends(get_current_use
return _ok(await _get_current_user_profile(request, user))
@router.get("/canvas-pages", summary="List canvas pages for current user")
async def list_canvas_pages(
request: Request,
search: str | None = None,
limit: int = 50,
user: UserPrincipal = Depends(get_current_user),
) -> dict:
ctx = await _ctx_from_request(request, user)
pages = await canvas_service.list_pages(
tenant_id=ctx.tenant_id,
owner_id=ctx.actor_id,
search=search,
limit=limit,
)
return _ok(pages, meta={"count": len(pages)})
@router.post("/canvas-pages", summary="Create a new canvas page")
async def create_canvas_page(
payload: PageCreateRequest,
request: Request,
user: UserPrincipal = Depends(get_current_user),
) -> dict:
ctx = await _ctx_from_request(request, user)
page = await canvas_service.create_page(
tenant_id=ctx.tenant_id,
owner_id=ctx.actor_id,
title=payload.title.strip() or "Untitled Canvas",
)
return _ok(page)
@router.get("/canvas-pages/{page_id}", summary="Get canvas page by ID")
async def get_canvas_page(page_id: str, request: Request, user: UserPrincipal = Depends(get_current_user)) -> dict:
page_id = await _resolve_page_id(request, user, page_id)
ctx = await _ctx_from_request(request, user)
page = await canvas_service.get_page(page_id, ctx.tenant_id)
if not page:
@@ -200,6 +249,46 @@ async def get_canvas_page(page_id: str, request: Request, user: UserPrincipal =
return _ok(page)
@router.patch("/canvas-pages/{page_id}", summary="Rename a canvas page")
async def rename_canvas_page(
page_id: str,
payload: PageUpdateRequest,
request: Request,
user: UserPrincipal = Depends(get_current_user),
) -> dict:
page_id = await _resolve_page_id(request, user, page_id)
ctx = await _ctx_from_request(request, user)
try:
page = await canvas_service.update_page_title(
page_id=page_id,
tenant_id=ctx.tenant_id,
owner_id=ctx.actor_id,
title=payload.title,
)
except ValueError as exc:
raise HTTPException(status_code=404, detail=str(exc)) from exc
return _ok(page)
@router.delete("/canvas-pages/{page_id}", summary="Delete a canvas page")
async def delete_canvas_page(
page_id: str,
request: Request,
user: UserPrincipal = Depends(get_current_user),
) -> dict:
page_id = await _resolve_page_id(request, user, page_id)
ctx = await _ctx_from_request(request, user)
try:
await canvas_service.delete_page(
page_id=page_id,
tenant_id=ctx.tenant_id,
owner_id=ctx.actor_id,
)
except ValueError as exc:
raise HTTPException(status_code=404, detail=str(exc)) from exc
return _ok({"pageId": page_id, "deleted": True})
@router.post("/canvas-pages/{page_id}/prompts", summary="Submit a prompt to generate canvas components")
async def submit_prompt(
page_id: str,
@@ -207,6 +296,7 @@ async def submit_prompt(
request: Request,
user: UserPrincipal = Depends(get_current_user),
) -> dict:
page_id = await _resolve_page_id(request, user, page_id)
ctx = await _ctx_from_request(request, user)
execution = await prompt_orchestrator.execute(
tenant_id=ctx.tenant_id,
@@ -253,6 +343,7 @@ async def create_fork(
request: Request,
user: UserPrincipal = Depends(get_current_user),
) -> dict:
page_id = await _resolve_page_id(request, user, page_id)
ctx = await _ctx_from_request(request, user)
page = await canvas_service.get_page(page_id, ctx.tenant_id)
if not page:
@@ -277,6 +368,7 @@ async def rollback_canvas(
request: Request,
user: UserPrincipal = Depends(get_current_user),
) -> dict:
page_id = await _resolve_page_id(request, user, page_id)
ctx = await _ctx_from_request(request, user)
result = await canvas_service.rollback(
page_id=page_id,
@@ -295,6 +387,7 @@ async def rollback_canvas(
@router.get("/canvas-pages/{page_id}/revisions", summary="List revision history for a canvas page")
async def list_revisions(page_id: str, request: Request, user: UserPrincipal = Depends(get_current_user)) -> dict:
page_id = await _resolve_page_id(request, user, page_id)
ctx = await _ctx_from_request(request, user)
revisions = await canvas_service.list_revisions(page_id, ctx.tenant_id)
return _ok(revisions, meta={"count": len(revisions)})