dyomedea/src/db/trkseg.ts

82 lines
2.0 KiB
TypeScript
Raw Normal View History

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';
import { getFamily, put } from './lib';
import { putNewTrk } from './trk';
2022-12-13 19:59:39 +00:00
import { emptyWpt } from './wpt';
const emptyTrkseg: Trkseg = {
trkpt: undefined,
extensions: undefined,
};
export const putNewTrkseg = async (id?: IdTrk | IdGpx | IdTrkseg) => {
let finalId = { ...id };
if (!('trkseg' in finalId)) {
const trkId = await putNewTrk(id);
finalId = { ...trkId, trkseg: 0 };
}
const uri = getUri('trkseg', finalId);
await put(
uri,
'trkseg',
(trkseg) => {
return trkseg;
},
emptyTrkseg
);
return finalId as IdTrkseg;
};
export const getTrkseg = async (params: any) => {
const { id } = params;
const docs = await getFamily(id, { include_docs: true });
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) {
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-01-07 17:46:14 +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
});
return trkseg;
};
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;
};