2023-02-08 19:44:28 +00:00
|
|
|
import { debounce, memoize, property, wrap } from 'lodash';
|
|
|
|
import { delay } from '../lib/delay';
|
2022-11-26 18:36:55 +00:00
|
|
|
import getUri from '../lib/ids';
|
2022-12-09 16:31:56 +00:00
|
|
|
import { appendToArray, putNewGpx } from './gpx';
|
|
|
|
import { getFamily, put } from './lib';
|
2022-11-26 18:36:55 +00:00
|
|
|
|
|
|
|
export const emptyRte: Rte = {
|
|
|
|
name: undefined,
|
|
|
|
cmt: undefined,
|
|
|
|
desc: undefined,
|
|
|
|
src: undefined,
|
|
|
|
link: undefined,
|
|
|
|
number: 0,
|
|
|
|
type: undefined,
|
|
|
|
extensions: undefined,
|
|
|
|
rtept: undefined,
|
|
|
|
};
|
|
|
|
|
|
|
|
export const putNewRte = async (id?: IdRte | IdGpx) => {
|
|
|
|
let finalId = { ...id };
|
|
|
|
if (!('rte' in finalId)) {
|
|
|
|
const gpxId = await putNewGpx(id);
|
|
|
|
finalId = { ...gpxId, rte: 0 };
|
|
|
|
}
|
|
|
|
const uri = getUri('rte', finalId);
|
|
|
|
await put(
|
|
|
|
uri,
|
|
|
|
'rte',
|
|
|
|
(rte) => {
|
|
|
|
return rte;
|
|
|
|
},
|
|
|
|
emptyRte
|
|
|
|
);
|
|
|
|
return finalId as IdRte;
|
|
|
|
};
|
2022-12-09 16:31:56 +00:00
|
|
|
|
2023-02-08 19:44:28 +00:00
|
|
|
// See https://stackoverflow.com/questions/28787436/debounce-a-function-with-argument
|
|
|
|
const debounceByParam = (
|
|
|
|
targetFunc: (params: any) => any,
|
|
|
|
resolver: (params: any) => any,
|
|
|
|
...debounceParams: any
|
|
|
|
) =>
|
|
|
|
wrap(
|
|
|
|
memoize(() => debounce(targetFunc, ...debounceParams), resolver),
|
|
|
|
(getMemoizedFunc, ...params) => getMemoizedFunc(...params)(...params)
|
|
|
|
);
|
|
|
|
|
|
|
|
const compactRteOrTrkseg = (params: any) => {
|
|
|
|
const { getDocs } = params;
|
|
|
|
getDocs(params).then(({ docs }) => {
|
|
|
|
if (docs.rows.length > 1) {
|
|
|
|
const compactedDocs = docs.rows.map((row: any) => {
|
|
|
|
if (['rte', 'trkseg'].includes(row.doc.type)) {
|
|
|
|
return row.doc;
|
|
|
|
}
|
|
|
|
return { ...row.doc, doc: undefined, _deleted: true };
|
|
|
|
});
|
|
|
|
db.bulkDocs(compactedDocs);
|
|
|
|
}
|
|
|
|
console.log({ caller: 'compactRteOrTrkseg', params, compactedDocs });
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
export const compactRteOrTrksegDebounced = debounceByParam(
|
|
|
|
compactRteOrTrkseg,
|
|
|
|
property('id'),
|
|
|
|
3600000 * (1 + Math.random())
|
|
|
|
);
|
|
|
|
|
|
|
|
const getRteDocs = async (params: any) => {
|
2022-12-09 16:31:56 +00:00
|
|
|
const { id } = params;
|
|
|
|
const docs = await getFamily(id, { include_docs: true });
|
2023-02-08 19:44:28 +00:00
|
|
|
// console.log({ caller: 'getRte', id, docs });
|
2022-12-09 16:31:56 +00:00
|
|
|
let target: any[];
|
|
|
|
let rte: Rte | undefined = undefined;
|
2023-02-02 21:19:31 +00:00
|
|
|
docs.rows.every((row: any) => {
|
2022-12-09 16:31:56 +00:00
|
|
|
// level 0
|
|
|
|
if (row.doc.type === 'rte') {
|
2023-02-02 21:19:31 +00:00
|
|
|
if (!!rte) {
|
2023-02-03 10:59:40 +00:00
|
|
|
console.error({
|
|
|
|
caller: 'getRte',
|
|
|
|
id,
|
|
|
|
row,
|
|
|
|
target,
|
|
|
|
rte,
|
|
|
|
});
|
2023-02-02 21:19:31 +00:00
|
|
|
return false; // Hack to stop if getFamily fails
|
|
|
|
}
|
2022-12-09 16:31:56 +00:00
|
|
|
target = [row.doc.doc];
|
|
|
|
rte = row.doc.doc;
|
|
|
|
}
|
|
|
|
//level 1
|
|
|
|
if (row.doc.type === 'rtept') {
|
|
|
|
target.splice(1);
|
2023-02-08 19:44:28 +00:00
|
|
|
// row.doc.doc.id = row.doc._id;
|
2022-12-09 16:31:56 +00:00
|
|
|
appendToArray(target.at(-1), row.doc.type, row.doc.doc);
|
|
|
|
target.push(row.doc.doc);
|
|
|
|
}
|
2023-02-02 21:19:31 +00:00
|
|
|
return true;
|
2022-12-09 16:31:56 +00:00
|
|
|
});
|
2023-02-08 19:44:28 +00:00
|
|
|
return { docs, rte };
|
|
|
|
};
|
|
|
|
|
|
|
|
export const getRte = async (params: any) => {
|
|
|
|
const { id } = params;
|
|
|
|
const { docs, rte } = await getRteDocs(params);
|
|
|
|
if (docs.rows.length > 1) {
|
|
|
|
compactRteOrTrksegDebounced({ id, getDocs: getRteDocs });
|
|
|
|
}
|
2022-12-09 16:31:56 +00:00
|
|
|
return rte;
|
|
|
|
};
|
2023-01-05 17:27:20 +00:00
|
|
|
|
|
|
|
export const putRte = async (params: any) => {
|
|
|
|
const { id, rte } = params;
|
|
|
|
rte.rtept = undefined;
|
|
|
|
await put(id, 'rte', (doc) => rte, rte);
|
|
|
|
return rte;
|
|
|
|
};
|
2023-02-03 13:57:40 +00:00
|
|
|
|
|
|
|
export const deleteRte = async (params: any) => {
|
|
|
|
const { id } = params;
|
|
|
|
const docs = await getFamily(id, { include_docs: false });
|
|
|
|
console.log({ caller: 'deleteRte' }, id, docs);
|
|
|
|
const deletedDocs = docs.rows.reverse().map((doc: any) => ({
|
|
|
|
_deleted: true,
|
|
|
|
_id: doc.id,
|
|
|
|
_rev: doc.value.rev,
|
|
|
|
}));
|
|
|
|
console.log({ caller: 'deleteRte' }, id, docs, deletedDocs);
|
|
|
|
await db.bulkDocs(deletedDocs);
|
|
|
|
return id;
|
|
|
|
};
|