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