API: Add event querying endpoint.

Events may be filtered by sequence(s):
   …/event?sequence=1
   …/event?sequence=1;3;7

Events may be filtered by date:
   …/event?date0=1970-01-01

Events may be filtered by a date interval:
   …/event?date0=1970-01-01&date1=1980-01-01

Events may also be paginated.
This commit is contained in:
D. Berge
2020-08-12 11:35:57 +02:00
parent 9871aebde6
commit d52f8f8bc2
10 changed files with 64 additions and 4 deletions

View File

@@ -82,10 +82,10 @@ app.map({
// patch: [ mw.sequence.patch ],
// },
//
// '/project/:project/event/': {
// get: [ mw.event.list ],
'/project/:project/event/': {
get: [ mw.event.list ],
// post: [ mw.event.post ],
// },
},
// '/project/:project/event/:event': {
// get: [ mw.event.get ],
// put: [ mw.event.put ],

View File

@@ -0,0 +1,8 @@
module.exports = {
list: require('./list'),
get: require('./get'),
post: require('./post'),
put: require('./put'),
delete: require('./delete')
}

View File

@@ -0,0 +1,9 @@
const { event } = require('../../../lib/db');
module.exports = async function (req, res, next) {
res.status(200).send(await event.list(req.params.project, req.query));
next();
};

View File

View File

View File

@@ -0,0 +1,8 @@
module.exports = {
list: require('./list'),
get: require('./get'),
post: require('./post'),
put: require('./put'),
delete: require('./delete')
}

View File

@@ -0,0 +1,34 @@
const { pool } = require('../connection');
async function list (projectId, opts = {}) {
await pool.query("CALL set_survey($1);", [projectId]);
const sortFields = [ "sequence", "shot_number", "ts0", "ts1", "label", "remarks" ];
const sortKey = opts.sortBy && sortFields.includes(opts.sortBy) && opts.sortBy || "ts0";
const sortDir = (opts.sortDesc == "true" || !opts.sortDesc) ? "DESC" : "ASC";
const offset = Math.abs((opts.page-1)*opts.itemsPerPage) || 0;
const limit = Math.abs(Number(opts.itemsPerPage)) || null;
const filter = opts.sequence
? opts.sequence.includes(";")
? [ "sequence = ANY ( $1 )", [ opts.sequence.split(";") ] ]
: [ "sequence = $1", [ opts.sequence ] ]
: opts.date0
? opts.date1
? [ "date(ts0) BETWEEN SYMMETRIC $1 AND $2", [ opts.date0, opts.date1 ] ]
: [ "date(ts0) = $1", [ opts.date0 ] ]
: [ "true = true", [] ];
const text = `
SELECT *
FROM events
WHERE
${filter[0]}
ORDER BY ${sortKey} ${sortDir};
`;
const res = await pool.query(text, filter[1]);
return res.rows;
}
module.exports = list;

View File

View File

View File

@@ -3,5 +3,6 @@ module.exports = {
project: require('./project'),
line: require('./line'),
sequence: require('./sequence'),
gis: require('./gis')
event: require('./event'),
gis: require('./gis'),
};