import getUri, { intToTrkptId } from '../lib/ids'; import { appendToArray } from './gpx'; import { getFamily, put } from './lib'; import { putNewTrk } from './trk'; 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 }); let target: any[]; let trkseg: Trkseg | undefined = undefined; docs.rows.every((row: any) => { // level 0 if (row.doc.type === 'trkseg') { if (!!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; }; 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; };