forked from sagnik/Project_Velocity
feat: New Chat, Search Chat and Master Slave DB Architecture for CRM and Oracle Canvas
This commit is contained in:
@@ -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)})
|
||||
|
||||
Reference in New Issue
Block a user