Compare commits
1 Commits
master
...
cef1cd01f4
Author | SHA1 | Date | |
---|---|---|---|
cef1cd01f4 |
@ -20,8 +20,8 @@
|
||||
"dependencies": {
|
||||
"@fastify/leveldb": "^6.0.0",
|
||||
"@fastify/static": "^8.0.0",
|
||||
"@fastify/view": "^11.0.0",
|
||||
"@types/node": "^24.0.0",
|
||||
"@fastify/view": "^10.0.0",
|
||||
"@types/node": "^22.13.5",
|
||||
"esbuild": "^0.25.0",
|
||||
"fastify": "^5.2.1",
|
||||
"jsdom": "^26.0.0",
|
||||
|
@ -41,20 +41,15 @@ export const load = (id: string) =>
|
||||
return res;
|
||||
});
|
||||
|
||||
var version_add = 1
|
||||
export const save = async (id: string, v: journey) => {
|
||||
let body = JSON.parse(JSON.stringify(v))
|
||||
body.version +=version_add;
|
||||
return fetch("/api/" + id, { method: "post", body: JSON.stringify(body) })
|
||||
export const save = (id: string, v: journey) =>
|
||||
fetch("/api/" + id, { method: "post", body: JSON.stringify(v) })
|
||||
.then((res) => {
|
||||
if (!res.ok) throw new Error("Error " + res.statusText);
|
||||
return res.json();
|
||||
})
|
||||
.then((_res) => {
|
||||
version_add+=1;
|
||||
console.log("Saved...");
|
||||
});
|
||||
}
|
||||
|
||||
export const query_nominatim = (
|
||||
q: string,
|
||||
|
@ -1,96 +1,61 @@
|
||||
|
||||
import { getGeoLine } from "../types/geom";
|
||||
import * as api from "../api";
|
||||
|
||||
const filter_existing = function (
|
||||
tpe: "nominatim" | "travel",
|
||||
leg: leg,
|
||||
r: geoloc[]
|
||||
) {
|
||||
const filter_existing = function (tpe: "nominatim" | "travel", leg: leg, r: geoloc[]) {
|
||||
switch (tpe) {
|
||||
case "nominatim":
|
||||
return r.filter((e) => {
|
||||
case 'nominatim':
|
||||
return r.filter(e => {
|
||||
if (leg.hotel && leg.hotel.osm_id == e.osm_id) return false;
|
||||
if (leg.places.restaurants.find((i) => i.osm_id == e.osm_id))
|
||||
return false;
|
||||
if (leg.places.activities.find((i) => i.osm_id == e.osm_id))
|
||||
return false;
|
||||
return true;
|
||||
});
|
||||
case "travel":
|
||||
console.log(r);
|
||||
return r.filter((e) => {
|
||||
if (
|
||||
leg.travel.find(
|
||||
(i) =>
|
||||
`${(e as any).from}->${(e as any).to}` ==
|
||||
`${(i as any).from}->${(i as any).to}`
|
||||
)
|
||||
)
|
||||
return false;
|
||||
return true;
|
||||
});
|
||||
if (leg.places.restaurants.find(i => i.osm_id == e.osm_id)) return false;
|
||||
if (leg.places.activities.find(i => i.osm_id == e.osm_id)) return false;
|
||||
return true
|
||||
})
|
||||
case 'travel':
|
||||
console.log(r)
|
||||
return r.filter(e => {
|
||||
if (leg.travel.find(i => `${(e as any).from}->${(e as any).to}` == `${(i as any).from}->${(i as any).to}`)) return false;
|
||||
return true
|
||||
})
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
const process_results = function (tpe: "nominatim" | "travel", r: geoloc[]) {
|
||||
switch (tpe) {
|
||||
case "nominatim":
|
||||
case 'nominatim':
|
||||
return r.map((rr) => {
|
||||
rr.latlon = [
|
||||
parseFloat((rr as any).lat),
|
||||
parseFloat((rr as any).lon),
|
||||
];
|
||||
rr.latlon = [parseFloat((rr as any).lat), parseFloat((rr as any).lon)];
|
||||
rr.title = (rr as any).display_name.split(",")[0];
|
||||
return rr;
|
||||
});
|
||||
case "travel":
|
||||
console.log(r);
|
||||
return r.map((el) => {
|
||||
case 'travel':
|
||||
console.log(r)
|
||||
return r.map(el => {
|
||||
(el as any).path = getGeoLine(
|
||||
{
|
||||
lat: (el as any).from_geo.lat,
|
||||
lng: (el as any).from_geo.lon,
|
||||
},
|
||||
{
|
||||
lat: (el as any).to_geo.lat,
|
||||
lng: (el as any).to_geo.lon,
|
||||
},
|
||||
{ dist: 2_500_000 }
|
||||
).map((v) => [v.lat, v.lng]);
|
||||
{ lat: (el as any).from_geo.lat, lng: (el as any).from_geo.lon },
|
||||
{ lat: (el as any).to_geo.lat, lng: (el as any).to_geo.lon }, { dist: 2_500_000 }).map(v => [v.lat, v.lng]);
|
||||
(el as any).type = "flight";
|
||||
return el;
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var _search_set_results: (...arg: any[]) => any;
|
||||
export const set_search_set_results = function (f: (...arg: any[]) => any) {
|
||||
_search_set_results = f;
|
||||
};
|
||||
}
|
||||
export const search_nominatim = api.throttle(
|
||||
(
|
||||
f: string,
|
||||
q: string,
|
||||
bb: [[number, number], [number, number]],
|
||||
leg: leg
|
||||
) =>
|
||||
api
|
||||
.query_nominatim(q, bb, api.get_filter(f))
|
||||
.catch((_err) => console.log(_err))
|
||||
.then((r) => {
|
||||
r = process_results("nominatim", r);
|
||||
r = filter_existing("nominatim", leg, r);
|
||||
_search_set_results(r);
|
||||
}),
|
||||
1000
|
||||
);
|
||||
(f: string, q: string, bb: [[number, number], [number, number]], leg: leg) =>
|
||||
api.query_nominatim(q, bb, api.get_filter(f)).catch((_err) => console.log(_err)).then((r) => {
|
||||
r = process_results('nominatim', r)
|
||||
r = filter_existing('nominatim', leg, r)
|
||||
_search_set_results(r)
|
||||
}), 1000);
|
||||
|
||||
export const search_flight = api.throttle(
|
||||
(f: string, q: string, leg: leg) =>
|
||||
api.query_flight(q).then((r) => {
|
||||
r = process_results("travel", r);
|
||||
r = filter_existing("travel", leg, r);
|
||||
_search_set_results(r);
|
||||
}),
|
||||
3000
|
||||
);
|
||||
r = process_results('travel', r)
|
||||
r = filter_existing('travel', leg, r)
|
||||
_search_set_results(r)
|
||||
}), 2000)
|
@ -141,12 +141,11 @@ const app = new Vue({
|
||||
},
|
||||
|
||||
drawer_click_item: function (item) {
|
||||
const tpe = this.query.type
|
||||
this.search_set_clear(item ? true : false);
|
||||
this.drawer_hover_item();
|
||||
if (item) {
|
||||
item.step = -1;
|
||||
journey_add_place(this.journey, tpe, item)
|
||||
journey_add_place(this.journey, this.query.type, item)
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -35,7 +35,6 @@ declare global {
|
||||
|
||||
interface journey {
|
||||
fmt_ver: number
|
||||
version: number
|
||||
title: string
|
||||
main: leg[]
|
||||
}
|
||||
@ -53,7 +52,6 @@ const leg_template: leg = {
|
||||
}
|
||||
const journey_template: journey = {
|
||||
fmt_ver: 1,
|
||||
version: 0,
|
||||
title: "New Journey",
|
||||
main: [leg_template],
|
||||
}
|
||||
|
@ -10,7 +10,6 @@ function migrate_A_to_0(e: journey): journey {
|
||||
v.travel = v.travel || [];
|
||||
v.day_title = typeof (v.day_title) == "string" ? [v.day_title] : []
|
||||
})
|
||||
e.version = e.version || 0;
|
||||
console.log(e)
|
||||
return e;
|
||||
}
|
||||
|
@ -60,27 +60,31 @@ export default function (server, opts, done) {
|
||||
if (req.params.id == undefined)
|
||||
return reply.code(400).send({ error: "No ID query parameter" });
|
||||
|
||||
return server.level.db.get(req.params.id)
|
||||
.then(r=> reply.send(JSON.parse(r)))
|
||||
.catch(err=>{
|
||||
server.level.db.get(req.params.id, (err, val) => {
|
||||
if (err) {
|
||||
console.warn(err);
|
||||
return reply.code(500).send({error: "Error with DB"});
|
||||
})
|
||||
reply.code(500).send();
|
||||
} else {
|
||||
reply.send(JSON.parse(val));
|
||||
}
|
||||
});
|
||||
return reply;
|
||||
});
|
||||
|
||||
server.post("/:id", async (req, reply) => {
|
||||
if (req.params.id == undefined)
|
||||
return reply.code(400).send({ error: "No ID query parameter" });
|
||||
|
||||
return server.level.db.get(req.params.id).then(r=>JSON.parse(r)).then(r=>r.version||-1).catch(_=>-1).then(db_version=>{
|
||||
if(db_version+1 == req.body.version || db_version == -1)
|
||||
return server.level.db.put(req.params.id, req.body)
|
||||
.then(_=>reply.send({ content: "ok" }))
|
||||
.catch(_=>reply.code(500).send({ error: "Error with DB" }))
|
||||
|
||||
return reply.code(409).send({error:"Too old version, please refresh."});
|
||||
})
|
||||
})
|
||||
server.level.db.put(req.params.id, req.body, (err) => {
|
||||
if (err) {
|
||||
console.warn(err);
|
||||
reply.code(500).send({ error: "Error with DB" });
|
||||
} else {
|
||||
reply.send({ content: "ok" });
|
||||
}
|
||||
});
|
||||
return reply;
|
||||
});
|
||||
|
||||
done();
|
||||
};
|
||||
|
Reference in New Issue
Block a user