2022-12-13 19:59:39 +00:00
|
|
|
import getUri, { intToTrkptId } from '../lib/ids';
|
2022-11-27 15:18:50 +00:00
|
|
|
import { appendToArray } from './gpx';
|
2022-11-26 18:36:55 +00:00
|
|
|
import { getFamily, put } from './lib';
|
2023-02-08 19:44:28 +00:00
|
|
|
import { compactRteOrTrksegDebounced } from './rte';
|
2022-11-26 18:36:55 +00:00
|
|
|
import { putNewTrk } from './trk';
|
2022-12-13 19:59:39 +00:00
|
|
|
import { emptyWpt } from './wpt';
|
2022-11-26 18:36:55 +00:00
|
|
|
|
|
|
|
const emptyTrkseg: Trkseg = {
|
|
|
|
trkpt: undefined,
|
|
|
|
extensions: undefined,
|
|
|
|
};
|
|
|
|
|
2023-02-08 19:44:28 +00:00
|
|
|
const getTrksegDocs = async (params: any) => {
|
2022-11-26 18:36:55 +00:00
|
|
|
const { id } = params;
|
|
|
|
const docs = await getFamily(id, { include_docs: true });
|
2023-02-08 19:44:28 +00:00
|
|
|
console.log({ caller: 'getTrksegDocs', id, docs });
|
2022-11-27 15:18:50 +00:00
|
|
|
let target: any[];
|
|
|
|
let trkseg: Trkseg | undefined = undefined;
|
2023-02-02 21:19:31 +00:00
|
|
|
docs.rows.every((row: any) => {
|
2022-11-27 15:18:50 +00:00
|
|
|
// level 0
|
|
|
|
if (row.doc.type === 'trkseg') {
|
2023-02-02 21:19:31 +00:00
|
|
|
if (!!trkseg) {
|
2023-02-03 10:59:40 +00:00
|
|
|
console.error({
|
2023-02-08 19:44:28 +00:00
|
|
|
caller: 'getTrksegDocs',
|
2023-02-03 10:59:40 +00:00
|
|
|
id,
|
|
|
|
row,
|
|
|
|
target,
|
|
|
|
trkseg,
|
|
|
|
});
|
2023-02-02 21:19:31 +00:00
|
|
|
return false; // Hack to stop if getFamily fails
|
|
|
|
}
|
2022-11-27 15:18:50 +00:00
|
|
|
target = [row.doc.doc];
|
|
|
|
trkseg = row.doc.doc;
|
|
|
|
}
|
|
|
|
//level 1
|
|
|
|
if (row.doc.type === 'trkpt') {
|
|
|
|
target.splice(1);
|
2023-02-08 19:44:28 +00:00
|
|
|
// row.doc.doc.id = row.doc._id;
|
2022-11-27 16:12:25 +00:00
|
|
|
appendToArray(target.at(-1), row.doc.type, row.doc.doc);
|
2022-11-27 15:18:50 +00:00
|
|
|
target.push(row.doc.doc);
|
|
|
|
}
|
2023-02-02 21:19:31 +00:00
|
|
|
return true;
|
2022-11-27 15:18:50 +00:00
|
|
|
});
|
2023-02-08 19:44:28 +00:00
|
|
|
return { trkseg, docs };
|
|
|
|
};
|
|
|
|
|
|
|
|
export const getTrkseg = async (params: any) => {
|
|
|
|
const { id } = params;
|
|
|
|
const { docs, trkseg } = await getTrksegDocs(params);
|
|
|
|
if (docs.rows.length > 1) {
|
|
|
|
compactRteOrTrksegDebounced({ id, getDocs: getTrksegDocs });
|
|
|
|
}
|
2022-11-27 15:18:50 +00:00
|
|
|
return trkseg;
|
2022-11-26 18:36:55 +00:00
|
|
|
};
|
2022-12-13 19:59:39 +00:00
|
|
|
|
|
|
|
export const putTrkseg = async (trkSegId: string, trkSeg = emptyTrkseg) => {
|
|
|
|
await put(
|
|
|
|
trkSegId,
|
|
|
|
'trkseg',
|
|
|
|
(doc) => {
|
|
|
|
return trkSeg;
|
|
|
|
},
|
|
|
|
emptyTrkseg
|
|
|
|
);
|
|
|
|
return trkSegId;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const appendTrkpt = async (params: any) => {
|
|
|
|
const { trksegIdObj, trkpt } = params;
|
|
|
|
const idTrkseg = getUri('trkseg', trksegIdObj);
|
|
|
|
try {
|
|
|
|
await db.get(idTrkseg);
|
|
|
|
} catch {
|
|
|
|
await put(idTrkseg, 'trkseg', (doc) => doc, emptyTrkseg);
|
|
|
|
}
|
|
|
|
const trkptIdPart = intToTrkptId(new Date(trkpt.time as string).valueOf());
|
|
|
|
const trkptIdObj = { ...trksegIdObj, trkpt: trkptIdPart };
|
|
|
|
const trkptId = getUri('trkpt', trkptIdObj);
|
|
|
|
await put(trkptId, 'trkpt', (doc) => trkpt, emptyWpt);
|
|
|
|
return trkptId;
|
|
|
|
};
|