mirror of
https://gitlab.com/wgp/dougal/software.git
synced 2025-12-06 08:07:08 +00:00
Refactor db.event.post
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user