import getUri, { intToTrkptId } from '../lib/ids'; import { appendToArray } from './gpx'; import { getFamily, put } from './lib'; import { compactRteOrTrksegDebounced } from './rte'; import { putNewTrk } from './trk'; import { emptyWpt } from './wpt'; const emptyTrkseg: Trkseg = { trkpt: undefined, extensions: undefined, }; const getTrksegDocs = async (params: any) => { const { id } = params; const docs = await getFamily(id, { include_docs: true }); console.log({ caller: 'getTrksegDocs', id, docs }); let target: any[]; let trkseg: Trkseg | undefined = undefined; docs.rows.every((row: any) => { // level 0 if (row.doc.type === 'trkseg') { if (!!trkseg) { console.error({ caller: 'getTrksegDocs', id, row, target, trkseg, }); return false; // Hack to stop if getFamily fails } target = [row.doc.doc]; trkseg = row.doc.doc; } //level 1 if (row.doc.type === 'trkpt') { target.splice(1); // row.doc.doc.id = row.doc._id; appendToArray(target.at(-1), row.doc.type, row.doc.doc); target.push(row.doc.doc); } return true; }); 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 }); } return trkseg; }; 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; };