-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.ts
135 lines (124 loc) · 3.54 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import Bun from "bun";
import puppeteer from "puppeteer";
type HandlerParams = { request: Request; url: URL };
type Handler = ({ request, url }: HandlerParams) => Promise<Response>;
const listagemProdutosUrl = "http://localhost:3000/relatorio/listagem/produtos";
async function redirecionarParaRelatorioPdf() {
return new Response("", {
status: 303,
headers: {
Location: "/relatorio/listagem/produtos/pdf",
},
});
}
async function relatorioListagemProdutos({
request,
url,
}: HandlerParams): Promise<Response> {
console.info(Date.now(), "[RELATORIO] ListagemProdutos");
const htmlContent = `
<html>
<head>
<title>Relatório de Produtos</title>
</head>
<body>
<!-- <h1>Relatório de Produtos</h1> -->
<table border="1" cellpadding="5" cellspacing="0.5" width="100%">
<thead>
<tr>
${`
<th>ID</th>
<th>Nome</th>
<th>Preço</th>
`.repeat(4)}
</tr>
</thead>
<tbody>
${`
<tr>
${`
<td>1</td>
<td>Produto A</td>
<td>R$ 10,00</td>
`.repeat(4)}
</tr>
<tr>
${`
<td>2</td>
<td>Produto B</td>
<td>R$ 20,00</td>
`.repeat(4)}
</tr>`.repeat(100)}
</tbody>
</table>
</body>
</html>
`;
return new Response(htmlContent, {
headers: { "content-type": "text/html;charset=utf-8" },
});
}
async function relatorioListagemProdutosPDF({
request,
url,
}: HandlerParams): Promise<Response> {
const inicio = Date.now();
console.info(inicio, "[RELATORIO] listagemProdutosPDF #begin");
try {
const response = await fetch(listagemProdutosUrl);
const htmlContent = await response.text();
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.setContent(htmlContent, { waitUntil: "networkidle0" });
const pdf = await page.pdf({
format: "A4",
margin: { top: "64px", left: "15px", bottom: "32px", right: "15px" },
displayHeaderFooter: true,
headerTemplate: `
<div style="display:flex;align-items: baseline;justify-content: space-between;width:100%">
<div>
<span style="margin-left:32px;font-size:24px"> Listagem de Produtos </span>
</div>
<div style="margin-right:32px;font-size:12px">
<span class="date"></span> - Página <span class="pageNumber"></span> de <span class="totalPages"></span>
</div>
</div>`,
footerTemplate: `
<div style="font-size:10px; text-align: center; width: 100%;">
<span class="title"></span>
</div>`,
});
await browser.close();
return new Response(pdf, {
headers: {
"Content-Type": "application/pdf",
},
});
} catch (error) {
console.error(error);
return new Response("Erro ao gerar o PDF", { status: 500 });
} finally {
const fim = Date.now();
console.info(
fim,
"[RELATORIO] listagemProdutosPDF #end -",
fim - inicio,
"ms",
);
}
}
const app = Bun.serve({
async fetch(request) {
const url = new URL(request.url);
const handler: Handler | undefined = {
"/": redirecionarParaRelatorioPdf,
"/relatorio/listagem/produtos": relatorioListagemProdutos,
"/relatorio/listagem/produtos/pdf": relatorioListagemProdutosPDF,
}[url.pathname];
if (!handler) {
return new Response("nao encontrado", { status: 404 });
}
return await handler({ request, url });
},
});
console.info(`ouvindo requisicoes em http://${app.hostname}:${app.port}`);