[Git][root/dmarc-report][main] [ci skip] [ADD] /reports/extended, adicionado paginação, comentários, metas novas

Guiusepe pushed to branch main at Root / DMARC Report Commits: d2a7bb35 by godp21 at 2025-08-08T14:01:37-03:00 [ci skip] [ADD] /reports/extended, adicionado paginação, comentários, metas novas - - - - - 2 changed files: - README.md - backend.js Changes: ===================================== README.md ===================================== @@ -1,18 +1,33 @@ # TODO [x] Renomear /data pra /reports/. + [x] Renomear a rota /details?serial=:serial para /reports/details/:serial. + [x] ip e ip6 tão vindo em número/bytes, dá pra vir como uma string formatada de IP. + [x] Criar uma rota pra baixar o XML, algo tipo /reports/:id.xml + [x] Converter as datas para padrão BR + [x] Mudar padrão de argumentos pela URL para usar query + [x] Adicionar ordenação, tipo um ?sort ou ?order, daí a ordenação padrão poderia ser ?order=-maxdate, ou seja data máxima descendente. -[ ] Adicionar paginação, ?page, ?offset, algo tipo 50 resultados por página ou escolhe via ?per_page. -[ ] Adicionar um /reports/extended/ que vem com cada linha "expandida", ou seja, já vem tipo um details em cada linha. +[x] Adicionar paginação, ?page, ?offset, algo tipo 50 resultados por página ou escolhe via ?per_page. + +[x] Adicionar um /reports/extended/ que vem com cada linha "expandida", ou seja, já vem tipo um details em cada linha. + +[ ] Mudar respostas de erros para http500 + +[ ] Remover duplicação de código + [ ]O dmarc_result_max é igual ao dmarc_result_min no details, dá pra só mudar pra dmarc_result, esse é tipo um "score" do que passou. ### Filtros [ ] ?maxdate__gte=2025-07-24T03:00:00Z (depois ou igual a data) + [ ] ?maxdate__lt=2025-07-24T05:00:00Z (antes de data) + [ ] ?domain= (domínio exato) + [ ] ?dmarc_result_min__lte (score de DMARC menor ou igual) ===================================== backend.js ===================================== @@ -116,6 +116,10 @@ const reports_query = ` report.serial = rptrecord.serial ORDER BY @@@@ + LIMIT + $1 + OFFSET + $2 ` ; const details_query = ` @@ -162,6 +166,7 @@ app.get('/', (req, res) => { app.get('/reports', (req, res) => { const { sort } = req.query ; + // Inject string in query to sort results var sortStr = "" ; switch (sort) { case "maxdate": @@ -177,7 +182,12 @@ app.get('/reports', (req, res) => { sortStr = "maxdate DESC" ; } - pgClient.query(reports_query.replace("@@@@", sortStr), (err, result) => { + // Arguments for paging + var { page, perPage } = req.query ; + if(!page) page=1 ; if(!perPage) perPage=50; + + // replaces the sorting column, adds arguments + pgClient.query(reports_query.replace("@@@@", sortStr), [perPage, ((page-1) * perPage)], (err, result) => { if (err) { console.log("ERROR: Unable to run query") ; } else { @@ -194,11 +204,13 @@ app.get('/reports', (req, res) => { // Individual report details app.get('/reports/details', (req, res) => { + // Serial required in URL const { serial } = req.query ; if (! serial) { res.send("No serial specified...") ; return } + pgClient.query(details_query, [serial], (err, result) => { if (err) { console.log("ERROR: Unable to run query") ; @@ -220,6 +232,63 @@ app.get('/reports/details', (req, res) => { //############################################################################## + +// Reports extended +app.get('/reports/extended', async (req, res) => { + let { page, perPage, sort } = req.query; + if (!page) page = 1; + if (!perPage) perPage = 50; + + // Validate and format sort string + let sortStr; + switch (sort) { + case 'maxdate': + sortStr = 'maxdate ASC'; + break; + case 'mindate': + sortStr = 'mindate ASC'; + break; + case '-mindate': + sortStr = 'mindate DESC'; + break; + default: + sortStr = 'maxdate DESC'; + } + + try { + // Equivalent to route /reports + const resultO = await pgClient.query(reports_query.replace('@@@@', sortStr), [perPage, (page - 1) * perPage]); + + const rows = resultO.rows; + + // Async gets the /details for each serial in the /reports query + await Promise.all( + rows.map(async (row) => { + const detailResult = await pgClient.query(details_query, [row.serial]); + detailResult.rows.forEach((row, index) => { + // Conversion for /details data + row["ip"] = ip.fromLong(row["ip"]) ; + if (row["ip6"] != null) { + row["ip6"] = ip.fromLong(row["ip6"]) ; + } + }) ; + // Conversion for /reports data + row.details = detailResult.rows; + row.maxdate = convertDate(row.maxdate) ; + row.mindate = convertDate(row.mindate) ; + }) + ); + res.send(rows); + + } catch (err) { + console.error(err); + res.status(500).send('Error fetching data'); + } +}); +//############################################################################## + + + // Download xml app.get('/reports/:serial.xml', (req, res) => { pgClient.query(xml_query, [req.params.serial], (err, result) => { View it on GitLab: https://gitlab.c3sl.ufpr.br/root/dmarc-report/-/commit/d2a7bb35735fa3d9a38f0... -- View it on GitLab: https://gitlab.c3sl.ufpr.br/root/dmarc-report/-/commit/d2a7bb35735fa3d9a38f0... You're receiving this email because of your account on gitlab.c3sl.ufpr.br.
participantes (1)
-
Guiusepe (@godp21)