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()
@router.post("/report", response_model=ArticleOut, status_code=201)
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))