Guiusepe pushed to branch main at Root / DMARC Report

Commits:

2 changed files:

Changes:

  • README.md
    ... ... @@ -3,10 +3,12 @@
    3 3
     [x] Renomear a rota /details?serial=:serial para /reports/details/:serial.
    
    4 4
     [x] ip e ip6 tão vindo em número/bytes, dá pra vir como uma string formatada de IP.
    
    5 5
     [x] Criar uma rota pra baixar o XML, algo tipo /reports/:id.xml
    
    6
    -[ ] Adicionar um /reports/extended/ que vem com cada linha "expandida", ou seja, já vem tipo um details em cada linha.
    
    6
    +[x] Converter as datas para padrão BR
    
    7
    +[x] Mudar padrão de argumentos pela URL para usar query
    
    8
    +[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.
    
    7 9
     
    
    8 10
     [ ] Adicionar paginação, ?page, ?offset, algo tipo 50 resultados por página ou escolhe via ?per_page.
    
    9
    -[ ] Adicionar ordenação, tipo um ?sort ou ?order, daí a ordenação padrão poderia ser ?order=-maxdate, ou seja data máxima descendente.
    
    11
    +[ ] Adicionar um /reports/extended/ que vem com cada linha "expandida", ou seja, já vem tipo um details em cada linha.
    
    10 12
     [ ]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.
    
    11 13
     
    
    12 14
     ### Filtros
    

  • backend.js
    ... ... @@ -5,10 +5,22 @@ const ip = require('ip') ;
    5 5
     const { createServer } = require('node:http') ;
    
    6 6
     const express = require('express') ;
    
    7 7
     const app = express() ;
    
    8
    -
    
    8
    +const { DateTime } = require('luxon') ;
    
    9 9
     // Postgres client
    
    10 10
     const { Client } = require('pg') ;
    
    11 11
     
    
    12
    +
    
    13
    +// Auxiliar functions
    
    14
    +function convertDate(date) {
    
    15
    +    return DateTime
    
    16
    +        .fromJSDate(date, { zone: 'utc' })
    
    17
    +        .setZone('America/Sao_Paulo')
    
    18
    +        .toFormat('dd/MM/yyyy HH:mm:ss') ;
    
    19
    +}
    
    20
    +//##############################################################################
    
    21
    +
    
    22
    +
    
    23
    +
    
    12 24
     // Postgres queries ############################################################
    
    13 25
     const xml_query = `
    
    14 26
         SELECT
    
    ... ... @@ -102,6 +114,8 @@ const reports_query = `
    102 114
     		AS rptrecord
    
    103 115
     	ON
    
    104 116
     		report.serial = rptrecord.serial
    
    117
    +    ORDER BY
    
    118
    +        @@@@
    
    105 119
     ` ;
    
    106 120
     
    
    107 121
     const details_query = `
    
    ... ... @@ -146,10 +160,32 @@ app.get('/', (req, res) => {
    146 160
     
    
    147 161
     // Reports list
    
    148 162
     app.get('/reports', (req, res) => {
    
    149
    -    pgClient.query(reports_query, (err, result) => {
    
    163
    +    const { sort } = req.query ;
    
    164
    +    
    
    165
    +    var sortStr = "" ;
    
    166
    +    switch (sort) {
    
    167
    +        case "maxdate":
    
    168
    +            sortStr = "maxdate ASC" ;
    
    169
    +            break ;
    
    170
    +        case "mindate":
    
    171
    +            sortStr = "mindate ASC" ;
    
    172
    +            break ;
    
    173
    +        case "-mindate":
    
    174
    +            sortStr = "mindate DESC" ;
    
    175
    +            break ;
    
    176
    +        default:
    
    177
    +            sortStr = "maxdate DESC" ;
    
    178
    +    }
    
    179
    +
    
    180
    +    pgClient.query(reports_query.replace("@@@@", sortStr), (err, result) => {
    
    150 181
             if (err) {
    
    151 182
                 console.log("ERROR: Unable to run query") ;
    
    152 183
             } else {
    
    184
    +        // Converting results
    
    185
    +            result["rows"].forEach((row, index) => {
    
    186
    +                row["maxdate"] = convertDate(row["maxdate"]) ;
    
    187
    +                row["mindate"] = convertDate(row["mindate"]) ;
    
    188
    +            }) ;
    
    153 189
                 res.send(result["rows"]) ;
    
    154 190
             }
    
    155 191
         }) ;
    
    ... ... @@ -157,8 +193,13 @@ app.get('/reports', (req, res) => {
    157 193
     //##############################################################################
    
    158 194
     
    
    159 195
     // Individual report details
    
    160
    -app.get('/reports/details/:serial', (req, res) => {
    
    161
    -    pgClient.query(details_query, [req.params.serial], (err, result) => {
    
    196
    +app.get('/reports/details', (req, res) => {
    
    197
    +    const { serial } = req.query ;
    
    198
    +    if (! serial) {
    
    199
    +        res.send("No serial specified...") ;
    
    200
    +        return
    
    201
    +    } 
    
    202
    +    pgClient.query(details_query, [serial], (err, result) => {
    
    162 203
             if (err) {
    
    163 204
                 console.log("ERROR: Unable to run query") ;
    
    164 205
                 console.log(err) ;
    
    ... ... @@ -202,9 +243,8 @@ app.get('/reports/:serial.xml', (req, res) => {
    202 243
     //##############################################################################
    
    203 244
     
    
    204 245
     app.get('/test', (req, res) => {
    
    205
    -    pgClient.query("SELECT * FROM report WHERE serial = 100000000", (err, result) => {
    
    206
    -        res.send(result) ;
    
    207
    -    }) ;
    
    246
    +    const { var1, var2, var3 } = req.query
    
    247
    +    res.send(`${var1} ${var2} ${var3}`) ; 
    
    208 248
     }) ;
    
    209 249
     
    
    210 250
     app.listen(3001, () => {