Skip to content

Commit 5ba0a5e

Browse files
committed
Seperated endpoints
1 parent d48135e commit 5ba0a5e

File tree

4 files changed

+119
-101
lines changed

4 files changed

+119
-101
lines changed

api/api.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from fastapi import APIRouter
2+
from api.endpoints import reports, templates
3+
4+
api_router = APIRouter()
5+
api_router.include_router(reports.router, tags=["Report"])
6+
api_router.include_router(templates.router, prefix="/templates", tags=["Template"])

api/endpoints/reports.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from fastapi import APIRouter
2+
from fastapi.responses import FileResponse
3+
import csv, time
4+
from models.Request import ReportCreateRequest
5+
from helpers.render import RenderClass
6+
from helpers.docx2pdf import Converter
7+
8+
router = APIRouter()
9+
10+
# Crete PDF Report
11+
@router.post("/pdf",summary="Creates a pdf report.", tags=["Report"])
12+
def CreatePDFReport(body: ReportCreateRequest):
13+
timestamp = time.time()
14+
RenderClass.render(body, timestamp)
15+
return FileResponse(Converter.docx2pdf(timestamp))
16+
17+
# Crete CSV Report
18+
@router.post("/csv",summary="Creates a csv report.", tags=["Report"])
19+
def CreateCSVReport(body: ReportCreateRequest):
20+
filename = time.time()
21+
with open("./reports/%d.csv" % filename, 'w', encoding='UTF8', newline='') as f:
22+
writer = csv.writer(f, delimiter=body.Seperator)
23+
row = ["sep=" + body.Seperator]
24+
25+
writer.writerow(row)
26+
writer.writerow([body.Header])
27+
writer.writerow(body.ReadableColumns)
28+
for data in body.Data:
29+
row = []
30+
for column in body.Columns:
31+
row.append(data[column])
32+
writer.writerow(row)
33+
34+
return FileResponse("./reports/%d.csv" % filename)

api/endpoints/templates.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
from fastapi import UploadFile, File, APIRouter
2+
from helpers.docx2pdf import Converter
3+
import os, base64
4+
from pdf2image import convert_from_path
5+
6+
router = APIRouter()
7+
8+
# Lists all templates
9+
@router.get("/",summary="Lists all templates.", tags=["Template"])
10+
def ListTemplates():
11+
base_path = os.getcwd() + "/templates/"
12+
result = []
13+
14+
for file in [f for f in os.listdir(base_path)]:
15+
res = dict()
16+
file_stats = os.stat(base_path+ file)
17+
if os.path.splitext(file)[1] == ".docx":
18+
res["name"] = file
19+
res["size"] = file_stats.st_size
20+
result.append(res)
21+
22+
return result
23+
24+
# Get single template
25+
@router.get("/{name}",summary="Get single template.", tags=["Template"])
26+
def GetTemplate(name: str):
27+
base_path = os.getcwd() + "/templates/" + name
28+
file_stats = os.stat(base_path)
29+
res = dict()
30+
res["name"] = name
31+
res["size"] = file_stats.st_size
32+
33+
return res
34+
35+
# Get template's preview
36+
@router.get("/preview/{name}",summary="Get template's preview.", tags=["Template"])
37+
def PreviewTemplate(name: str):
38+
base_path = os.getcwd() + "/templates/" + name
39+
pdf_path = Converter.docx2preview(base_path)
40+
pdf_path = pdf_path.replace("docx", "pdf")
41+
42+
pages = convert_from_path(pdf_path)
43+
name = name.replace(".docx", ".png")
44+
pages[0].save(name, 'png')
45+
with open(name, "rb") as image_file:
46+
encoded_string = base64.b64encode(image_file.read())
47+
response = dict()
48+
response["encoded"] = encoded_string
49+
return response
50+
51+
# Delete template
52+
@router.delete("/{name}",summary="Deletes a template.", tags=["Template"])
53+
def DeleteTemplate(name: str):
54+
os.remove(os.getcwd() + "/templates/" + name)
55+
return "Item deleted successfully."
56+
57+
# Upload new template
58+
@router.post("/", summary="Uploads new template.", tags=["Template"])
59+
def SaveTemplate(file: UploadFile = File(...)):
60+
try:
61+
contents = file.file.read()
62+
name = file.filename.replace(" ", "_")
63+
name = file.filename.replace("-", "_")
64+
65+
with open(name, 'wb') as f:
66+
f.write(contents)
67+
except Exception:
68+
return {"message": "There was an error uploading the file"}
69+
finally:
70+
file.file.close()
71+
os.rename(name, "./templates/" + name)
72+
73+
return {"message": f"Successfully uploaded {name}"}

main.py

Lines changed: 6 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,11 @@
1-
from fastapi import FastAPI, UploadFile, File
2-
from fastapi.responses import FileResponse
3-
from models.Request import ReportCreateRequest
4-
from helpers.render import RenderClass
5-
from helpers.docx2pdf import Converter
1+
from fastapi import FastAPI
62
import uvicorn
7-
import os, base64
8-
import csv, time
9-
from pdf2image import convert_from_path
3+
from api import api
104

11-
12-
app = FastAPI()
13-
14-
@app.post("/pdf",summary="Creates a pdf report.", tags=["Report"])
15-
def CreatePDFReport(body: ReportCreateRequest):
16-
timestamp = time.time()
17-
RenderClass.render(body, timestamp)
18-
return FileResponse(Converter.docx2pdf(timestamp))
19-
20-
@app.post("/csv",summary="Creates a csv report.", tags=["Report"])
21-
def CreatePDFReport(body: ReportCreateRequest):
22-
filename = time.time()
23-
with open("./reports/%d.csv" % filename, 'w', encoding='UTF8', newline='') as f:
24-
writer = csv.writer(f, delimiter=body.Seperator)
25-
row = ["sep=" + body.Seperator]
26-
27-
writer.writerow(row)
28-
writer.writerow([body.Header])
29-
writer.writerow(body.ReadableColumns)
30-
for data in body.Data:
31-
row = []
32-
for column in body.Columns:
33-
row.append(data[column])
34-
writer.writerow(row)
35-
36-
return FileResponse("./reports/%d.csv" % filename)
37-
38-
# Lists all templates
39-
@app.get("/templates",summary="Lists all templates.", tags=["Template"])
40-
def ListTemplates():
41-
base_path = os.getcwd() + "/templates/"
42-
result = []
43-
44-
for file in [f for f in os.listdir(base_path)]:
45-
res = dict()
46-
file_stats = os.stat(base_path+ file)
47-
if os.path.splitext(file)[1] == ".docx":
48-
res["name"] = file
49-
res["size"] = file_stats.st_size
50-
result.append(res)
51-
52-
return result
53-
54-
# Get single template
55-
@app.get("/templates/{name}",summary="Get single template.", tags=["Template"])
56-
def ListTemplates(name: str):
57-
base_path = os.getcwd() + "/templates/" + name
58-
file_stats = os.stat(base_path)
59-
res = dict()
60-
res["name"] = name
61-
res["size"] = file_stats.st_size
62-
63-
return res
64-
65-
# Get template's preview
66-
@app.get("/templates/preview/{name}",summary="Get template's preview.", tags=["Template"])
67-
def TemplatePreview(name: str):
68-
base_path = os.getcwd() + "/templates/" + name
69-
pdf_path = Converter.docx2preview(base_path)
70-
pdf_path = pdf_path.replace("docx", "pdf")
71-
72-
pages = convert_from_path(pdf_path)
73-
name = name.replace(".docx", ".png")
74-
pages[0].save(name, 'png')
75-
with open(name, "rb") as image_file:
76-
encoded_string = base64.b64encode(image_file.read())
77-
response = dict()
78-
response["encoded"] = encoded_string
79-
return response
80-
81-
# Delete template
82-
@app.delete("/templates/{name}",summary="Deletes a template.", tags=["Template"])
83-
def ListTemplates(name: str):
84-
os.remove(os.getcwd() + "/templates/" + name)
85-
return "Item deleted successfully."
86-
87-
# Upload new template
88-
@app.post("/templates", summary="Uploads new template.", tags=["Template"])
89-
def SaveTemplate(file: UploadFile = File(...)):
90-
try:
91-
contents = file.file.read()
92-
name = file.filename.replace(" ", "_")
93-
name = file.filename.replace("-", "_")
94-
95-
with open(name, 'wb') as f:
96-
f.write(contents)
97-
except Exception:
98-
return {"message": "There was an error uploading the file"}
99-
finally:
100-
file.file.close()
101-
os.rename(name, "./templates/" + name)
102-
103-
return {"message": f"Successfully uploaded {name}"}
5+
app = FastAPI(
6+
title="Report Engine"
7+
)
8+
app.include_router(api.api_router)
1049

10510
def serve():
10611
"""Serve the web application."""

0 commit comments

Comments
 (0)