Spaces:
Sleeping
Sleeping
Kethan Dosapati
Enhance static UI and authentication: improve sidebar auth visibility, add mobile responsiveness, and refine error messages; update `/report` endpoint to use `ArticleOut` model; redesign styles for a Reddit-like layout with theming and responsive tweaks.
363bda3 | """POST /report — MCP-friendly endpoint for reporting articles (same as /api/post with different payload).""" | |
| from typing import Any, Optional | |
| from fastapi import APIRouter, HTTPException | |
| from database import supabase | |
| from models import ArticleOut | |
| router = APIRouter(tags=["report"]) | |
| def _body_from_report(payload: dict) -> str: | |
| """Build article body from MCP report payload (error + solution).""" | |
| parts = [] | |
| err = payload.get("error") | |
| if err and isinstance(err, dict): | |
| if err.get("message"): | |
| parts.append(f"Error: {err['message']}") | |
| if err.get("error_type"): | |
| parts.append(f"Type: {err['error_type']}") | |
| if err.get("context"): | |
| parts.append(f"Context: {err['context']}") | |
| sol = payload.get("solution") | |
| if sol and isinstance(sol, dict): | |
| if sol.get("description"): | |
| parts.append(f"\nSolution: {sol['description']}") | |
| if sol.get("steps"): | |
| parts.append("\nSteps:\n" + "\n".join(f" {i+1}. {s}" for i, s in enumerate(sol["steps"]))) | |
| if sol.get("code_before"): | |
| parts.append(f"\nCode before:\n{sol['code_before']}") | |
| if sol.get("code_after"): | |
| parts.append(f"\nCode after:\n{sol['code_after']}") | |
| if sol.get("commands"): | |
| parts.append("\nCommands: " + ", ".join(sol["commands"])) | |
| if not parts: | |
| return payload.get("content", payload.get("title", "")) | |
| return "\n".join(parts).strip() | |
| def report_article(payload: dict[str, Any]): | |
| """ | |
| Report a new article (MCP yantrabodha_report). | |
| Accepts ReportInput-like body; creates an article in the knowledge base. | |
| """ | |
| title = (payload.get("title") or "").strip() | |
| if not title or len(title) < 10: | |
| raise HTTPException(status_code=400, detail="title required (min 10 chars)") | |
| body = _body_from_report(payload) | |
| if not body: | |
| body = title | |
| type_ = (payload.get("type") or "tip").lower() | |
| if type_ not in ("error", "pattern", "tip", "guide", "reference"): | |
| type_ = "tip" | |
| language = (payload.get("language") or "general").lower() | |
| tags = payload.get("tags") | |
| if not isinstance(tags, list): | |
| tags = [] | |
| tags = [str(t).strip() for t in tags[:15] if t] | |
| if not tags: | |
| tags = [language] | |
| confidence = (payload.get("confidence") or "medium").lower() | |
| if confidence not in ("high", "medium", "low"): | |
| confidence = "medium" | |
| contributing_agent = (payload.get("contributing_agent") or "").strip() or None | |
| row = { | |
| "title": title, | |
| "body": body, | |
| "language": language, | |
| "tags": tags, | |
| "type": type_, | |
| "confidence": confidence, | |
| "contributing_agent": contributing_agent, | |
| } | |
| try: | |
| result = supabase.table("articles").insert(row).execute() | |
| if not result.data: | |
| raise HTTPException(status_code=500, detail="Failed to insert article") | |
| out = result.data[0] | |
| return ArticleOut(id=str(out["id"]), title=out["title"], created_at=str(out["created_at"])) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=str(e)) | |