| """Coding Canvas API Routes""" |
| import logging |
| from typing import List, Optional |
| from fastapi import Depends |
| from pydantic import BaseModel |
| from sqlalchemy.orm import Session |
|
|
| from core.base_routes import BaseAPIRouter |
| from core.canvas_coding_service import CodingCanvasService |
| from core.database import get_db |
|
|
| logger = logging.getLogger(__name__) |
| router = BaseAPIRouter(prefix="/api/canvas/coding", tags=["canvas_coding"]) |
|
|
|
|
| class CreateCodingRequest(BaseModel): |
| user_id: str |
| repo: str |
| branch: str |
| canvas_id: Optional[str] = None |
| agent_id: Optional[str] = None |
| layout: str = "repo_view" |
|
|
|
|
| class AddFileRequest(BaseModel): |
| user_id: str |
| path: str |
| content: str |
| language: str = "text" |
|
|
|
|
| class AddDiffRequest(BaseModel): |
| user_id: str |
| file_path: str |
| old_content: str |
| new_content: str |
|
|
|
|
| @router.post("/create") |
| async def create_coding_canvas(request: CreateCodingRequest, db: Session = Depends(get_db)): |
| """Create a new coding canvas.""" |
| service = CodingCanvasService(db) |
| result = service.create_coding_canvas( |
| user_id=request.user_id, |
| repo=request.repo, |
| branch=request.branch, |
| canvas_id=request.canvas_id, |
| agent_id=request.agent_id, |
| layout=request.layout |
| ) |
| if not result.get("success"): |
| raise router.error_response( |
| error_code="CODING_CANVAS_CREATE_FAILED", |
| message=result.get("error", "Failed to create coding canvas"), |
| status_code=400 |
| ) |
|
|
| return router.success_response( |
| data=result, |
| message="Coding canvas created successfully" |
| ) |
|
|
|
|
| @router.post("/{canvas_id}/file") |
| async def add_file(canvas_id: str, request: AddFileRequest, db: Session = Depends(get_db)): |
| """Add a file to the coding workspace.""" |
| service = CodingCanvasService(db) |
| result = service.add_file( |
| canvas_id=canvas_id, |
| user_id=request.user_id, |
| path=request.path, |
| content=request.content, |
| language=request.language |
| ) |
| if not result.get("success"): |
| raise router.error_response( |
| error_code="ADD_FILE_FAILED", |
| message=result.get("error", "Failed to add file"), |
| status_code=400 |
| ) |
|
|
| return router.success_response( |
| data=result, |
| message=f"File {request.path} added successfully" |
| ) |
|
|
|
|
| @router.post("/{canvas_id}/diff") |
| async def add_diff(canvas_id: str, request: AddDiffRequest, db: Session = Depends(get_db)): |
| """Add a diff view.""" |
| service = CodingCanvasService(db) |
| result = service.add_diff( |
| canvas_id=canvas_id, |
| user_id=request.user_id, |
| file_path=request.file_path, |
| old_content=request.old_content, |
| new_content=request.new_content |
| ) |
| if not result.get("success"): |
| raise router.error_response( |
| error_code="ADD_DIFF_FAILED", |
| message=result.get("error", "Failed to add diff"), |
| status_code=400 |
| ) |
|
|
| return router.success_response( |
| data=result, |
| message=f"Diff for {request.file_path} added successfully" |
| ) |
|
|
|
|
| @router.get("/{canvas_id}") |
| async def get_coding_canvas(canvas_id: str, db: Session = Depends(get_db)): |
| """Get a coding canvas.""" |
| from sqlalchemy import desc |
|
|
| from core.models import CanvasAudit |
|
|
| audit = db.query(CanvasAudit).filter( |
| CanvasAudit.canvas_id == canvas_id, |
| CanvasAudit.canvas_type == "coding" |
| ).order_by(desc(CanvasAudit.created_at)).first() |
|
|
| if not audit: |
| raise router.not_found_error( |
| resource="CodingCanvas", |
| resource_id=canvas_id |
| ) |
|
|
| return router.success_response( |
| data=audit.audit_metadata, |
| message="Coding canvas retrieved successfully" |
| ) |
|
|