Refactor db.event.post

This commit is contained in:
D. Berge
2020-08-22 20:24:10 +02:00
parent 9e1f93d43e
commit 81e0c40790

View File

@@ -1,46 +1,66 @@
const { setSurvey, transaction } = require('../connection'); const { setSurvey, transaction } = require('../connection');
async function insertSeqRemarks(remarks, shotNumber, sequence, client) { async function insertSequenceEvent(event, client) {
const text = ` const text = `
INSERT INTO events_seq (remarks, shot_number, sequence) INSERT INTO events_seq (remarks, point, sequence)
VALUES ($1, $2, $3) VALUES ($1, $2, $3)
RETURNING id; RETURNING id;
`; `;
console.log("insertSeqRemarks", text, remarks, shotNumber, sequence); const res = await client.query(text, [event.remarks, event.point, event.sequence]);
return (await client.query(text, [remarks, shotNumber, sequence]))[0].id; event.type = "sequence";
event.id = res.rows[0].id;
return event;
} }
async function insertSeqLabel(label, eventId, client) { async function insertSequenceEventLabels(event, client) {
if (event.type && event.type != "sequence") {
return;
}
const text = ` const text = `
INSERT INTO events_seq_labels (label, id) INSERT INTO events_seq_labels (id, label)
VALUES ($1, $2); SELECT $1, name
FROM unnest($2::text[]) l (name)
INNER JOIN labels USING (name)
WHERE (data->'model'->'user')::boolean IS true
`; `;
console.log("insertSeqLabel", text, label, eventId); // console.log("insertSequenceEventLabels", text, event);
return await client.query(text, [label, eventId]); return await client.query(text, [event.id, event.labels]);
} }
async function insertShotLabel(label, shotNumber, sequence, client) { async function insertTimedEvent(event, client) {
const text = ` const text = `
INSERT INTO events_seq_shots_labels (label, shot_number, sequence) INSERT INTO events_timed (remarks, tstamp)
VALUES ($1, $2, $3); VALUES ($1, $2)
RETURNING id;
`; `;
console.log("insertShotLabel", text, label, shotNumber, sequence); const res = await client.query(text, [event.remarks, event.tstamp]);
return await client.query(text, [label, shotNumber, sequence]); event.type = "timed";
event.id = res.rows[0].id;
return event;
} }
async function insertTimedEventLabel(label, eventId, client) { async function insertTimedEventLabels(event, client) {
if (event.type && event.type != "timed") {
return;
}
const text = ` const text = `
INSERT INTO events_timed_labels (label, id) INSERT INTO events_timed_labels (id, label)
VALUES ($1, $2); SELECT $1, name
FROM unnest($2::text[]) l (name)
INNER JOIN labels USING (name)
WHERE (data->'model'->'user')::boolean IS true
`; `;
console.log("insertTimedEventLabel", text, label, eventId); // console.log("insertTimedEventLabels", text, event);
return await client.query(text, [label, eventId]); return await client.query(text, [event.id, event.labels]);
} }
/** /**
* Inserts events into the database. * Inserts events into the database.
* *
@@ -50,8 +70,7 @@ async function insertTimedEventLabel(label, eventId, client) {
* *
* { * {
* remarks: "…", * remarks: "…",
* ts0: "…", * tstamp: "…",
* ts1: "…",
* labels: [ "…", "…", … ] * labels: [ "…", "…", … ]
* } * }
* *
@@ -67,7 +86,7 @@ async function insertTimedEventLabel(label, eventId, client) {
* In both cases, either remarks or labels may be omitted. * In both cases, either remarks or labels may be omitted.
*/ */
async function post (projectId, payload, opts = {}) { async function post (projectId, payload, opts = {}) {
console.log("post event", projectId, payload); // console.log("post event", projectId, payload);
const client = await setSurvey(projectId); const client = await setSurvey(projectId);
await transaction.begin(client); await transaction.begin(client);
@@ -75,39 +94,21 @@ async function post (projectId, payload, opts = {}) {
if (!Array.isArray(payload)) { if (!Array.isArray(payload)) {
payload = [payload]; payload = [payload];
} }
// console.log("Payload", payload);
for (const event of payload) { for (const event of payload) {
console.log("Event", event); // console.log("Event", event);
if (event.sequence && event.shotNumber) { if (event.sequence && event.point) {
// A shot event // A shot event
console.log("Shot event"); // console.log("Shot event");
if (event.remarks) { await insertSequenceEvent(event, client);
const eventId = await insertSeqRemarks(event.remarks, event.shotNumber, event.sequence, client); await insertSequenceEventLabels(event, client);
console.log("eventId", eventId); } else if (event.tstamp) {
if (event.labels) {
for (const label of event.labels) {
await insertSeqLabel(label, eventId, client);
}
}
} else if (event.labels) {
// A label event
for (const label of event.labels) {
await insertShotLabel(label, event.shotNumber, event.sequence, client);
}
}
} else if (event.ts0) {
// A timed event // A timed event
// Called even if remarks is blank, as timed labels are always associated // console.log("Timed event");
// with an event id from events_timed. await insertTimedEvent(event, client);
const eventId = await insertTimedEvent(event.remarks, event.ts0, event.ts1, client); await insertTimedEventLabels(event, client);
if (event.labels) {
for (const label of event.labels) {
await insertTimedEventLabel(label, eventId, client);
}
}
} }
} }