Implement db.event.put

This commit is contained in:
D. Berge
2020-08-22 20:24:55 +02:00
parent 81e0c40790
commit 517291d5c9

View File

@@ -0,0 +1,142 @@
const { setSurvey, transaction } = require('../connection');
async function updateTimedEvent (event, client) {
const text = `
UPDATE events_timed
SET
remarks = COALESCE($2, remarks),
tstamp = COALESCE($3, tstamp)
WHERE id = $1;
`
return await client.query(text, [event.id, event.remarks, event.tstamp]);
}
async function updateSeqEvent (event, client) {
const text = `
UPDATE events_seq
SET
remarks = COALESCE($2, remarks),
sequence = COALESCE($3, sequence),
point = COALESCE($4, point)
WHERE id = $1;
`
return await client.query(text, [event.id, event.remarks, event.sequence, event.point]);
}
async function updateTimedEventLabels (event, client) {
if (!event.labels) {
return
}
await client.query("DELETE FROM events_timed_labels WHERE id = $1;", [event.id]);
const text = `
INSERT INTO events_timed_labels (id, label)
SELECT $1, label FROM unnest($2::text[]) t (label);
`;
return client.query(text, [event.id, event.labels]);
}
async function updateSeqEventLabels (event, client) {
if (!event.labels) {
return
}
await client.query("DELETE FROM events_seq_labels WHERE id = $1;", [event.id]);
const text = `
INSERT INTO events_seq_labels (id, label)
SELECT $1, label FROM unnest($2::text[]) t (label);
`;
return client.query(text, [event.id, event.labels]);
}
/**
* Updates events in the database.
*
* Events may have the following forms:
*
* Event associated with a time:
*
* {
* type: "timed",
* id: 0,
* remarks: "…",
* tstamp: "…",
* labels: [ "…", "…", … ]
* }
*
* Events associated with a sequence / shotpoint:
*
* {
* type: "seq"
* remarks: "…",
* point: 0000,
* sequence: 000,
* labels: [ "…", "…", … ]
* }
*
* In both cases, either remarks or labels may be omitted.
*
* Labels associated with a sequence / shotpoint (without event):
*
* {
* type: "shot_labels",
* point: 0000,
* sequence: 000,
* labels: [ "…", "…", … ] // Sets these labels
* }
*
* {
* type: "shot_labels",
* point: 0000,
* sequence: 000,
* labels: {
* add: […], // Adds these labels
* remove: […] // Removes these labels
* }
* }
*
*/
async function put (projectId, payload, opts = {}) {
// console.log("put event", projectId, payload);
const client = await setSurvey(projectId);
await transaction.begin(client);
try {
if (!Array.isArray(payload)) {
payload = [payload];
}
for (const event of payload) {
// console.log("Event", event);
switch (event.type) {
case "timed":
await updateTimedEvent(event, client);
await updateTimedEventLabels(event, client)
break;
case "sequence":
await updateSeqEvent(event, client);
await updateSeqEventLabels(event, client);
break;
default:
// Error?
}
}
transaction.commit(client);
} catch (err) {
transaction.rollback(client)
} finally {
client.release();
}
}
module.exports = put;