JairoDanielMT commited on
Commit
30fcc0b
·
1 Parent(s): 42b3110
app/__init__.py ADDED
File without changes
app/__init__.py/main.py DELETED
@@ -1,90 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import io
4
- from typing import Any, Dict, Literal, Optional
5
-
6
- from fastapi import FastAPI, HTTPException
7
- from fastapi.responses import HTMLResponse, RedirectResponse, StreamingResponse
8
- from pydantic import BaseModel, Field
9
-
10
- from .renderer import render_html, render_pdf_bytes
11
-
12
- app = FastAPI(
13
- title="Doc Compiler Service",
14
- version="1.0.0",
15
- description=(
16
- "Servicio de compilación que recibe JSON de documentación, "
17
- "renderiza plantillas Jinja2 y devuelve HTML o PDF."
18
- ),
19
- )
20
-
21
-
22
- class CompileRequest(BaseModel):
23
- doc: Dict[str, Any] = Field(
24
- ...,
25
- description="JSON de documentación generado por la IA (incluyendo metadata.script_type).",
26
- )
27
- job_id: Optional[str] = Field(
28
- None,
29
- description="Identificador opcional para el archivo (por ejemplo, nombre del script o job).",
30
- )
31
- output: Literal["html", "pdf"] = Field(
32
- "pdf",
33
- description="Tipo de salida deseada. En estos endpoints se usa como referencia.",
34
- )
35
-
36
-
37
- @app.get("/")
38
- def root():
39
- """Endpoint raíz que redirige automáticamente a la documentación."""
40
- return RedirectResponse(url="/docs")
41
-
42
-
43
- @app.get("/health")
44
- def health_check():
45
- """
46
- Endpoint simple de healthcheck para monitoreo.
47
- """
48
- return {"status": "ok"}
49
-
50
-
51
- @app.post("/compile/html")
52
- def compile_html(req: CompileRequest):
53
- """
54
- Recibe JSON y devuelve el HTML renderizado (útil para depuración o previsualización).
55
- """
56
- if not req.doc:
57
- raise HTTPException(status_code=400, detail="Campo 'doc' es obligatorio")
58
-
59
- try:
60
- html = render_html(req.doc)
61
- except Exception as exc:
62
- raise HTTPException(status_code=500, detail=f"Error al renderizar HTML: {exc}")
63
-
64
- return HTMLResponse(content=html)
65
-
66
-
67
- @app.post("/compile/pdf")
68
- def compile_pdf(req: CompileRequest):
69
- """
70
- Recibe JSON y devuelve el PDF compilado usando wkhtmltopdf.
71
- """
72
- if not req.doc:
73
- raise HTTPException(status_code=400, detail="Campo 'doc' es obligatorio")
74
-
75
- job_id = req.job_id or "document"
76
-
77
- try:
78
- pdf_bytes = render_pdf_bytes(req.doc)
79
- except RuntimeError as exc:
80
- raise HTTPException(status_code=500, detail=str(exc))
81
- except Exception as exc:
82
- raise HTTPException(status_code=500, detail=f"Error al generar PDF: {exc}")
83
-
84
- filename = f"{job_id}.pdf"
85
-
86
- return StreamingResponse(
87
- io.BytesIO(pdf_bytes),
88
- media_type="application/pdf",
89
- headers={"Content-Disposition": f'attachment; filename="{filename}"'},
90
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/{__init__.py/config.py → config.py} RENAMED
File without changes
app/{__init__.py/renderer.py → renderer.py} RENAMED
File without changes