1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-21 09:38:01 +02:00

Desktop: Fixed getting geolocation for new notes

This commit is contained in:
Laurent Cozic 2022-04-26 13:22:43 +01:00
parent 8abdbfe2bd
commit 86179bd74c
6 changed files with 95 additions and 28 deletions

View File

@ -1102,6 +1102,9 @@ packages/lib/fs-driver-node.js.map
packages/lib/fsDriver.test.d.ts
packages/lib/fsDriver.test.js
packages/lib/fsDriver.test.js.map
packages/lib/geolocation-node.d.ts
packages/lib/geolocation-node.js
packages/lib/geolocation-node.js.map
packages/lib/hooks/useAsyncEffect.d.ts
packages/lib/hooks/useAsyncEffect.js
packages/lib/hooks/useAsyncEffect.js.map

3
.gitignore vendored
View File

@ -1092,6 +1092,9 @@ packages/lib/fs-driver-node.js.map
packages/lib/fsDriver.test.d.ts
packages/lib/fsDriver.test.js
packages/lib/fsDriver.test.js.map
packages/lib/geolocation-node.d.ts
packages/lib/geolocation-node.js
packages/lib/geolocation-node.js.map
packages/lib/hooks/useAsyncEffect.d.ts
packages/lib/hooks/useAsyncEffect.js
packages/lib/hooks/useAsyncEffect.js.map

View File

@ -1,25 +0,0 @@
const shim = require('./shim').default;
class GeolocationNode {
static async currentPosition(options = null) {
if (!options) options = {};
let response = await shim.fetch('https://freegeoip.app/json/');
if (!response.ok) throw new Error(`Could not get geolocation: ${await response.text()}`);
response = await response.json();
if (!('latitude' in response) || !('longitude' in response)) throw new Error(`Invalid geolocation response: ${response ? JSON.stringify(response) : '<null>'}`);
return {
timestamp: new Date().getTime(),
coords: {
longitude: response.longitude,
altitude: 0,
latitude: response.latitude,
},
};
}
}
module.exports = { GeolocationNode };

View File

@ -0,0 +1,76 @@
import Logger from './Logger';
import shim from './shim';
const logger = Logger.create('geolocation-node');
interface CurrentPositionResponseCoordinates {
longitude: number;
latitude: number;
altitude: number;
}
interface CurrentPositionResponse {
timestamp: number;
coords: CurrentPositionResponseCoordinates;
}
interface CurrentPositionOptions {}
type GeoipService = ()=> Promise<CurrentPositionResponse>;
const fetchJson = async (url: string): Promise<any> => {
let r = await shim.fetch(url);
if (!r.ok) throw new Error(`Could not get geolocation: ${await r.text()}`);
r = await r.json();
return r;
};
const geoipServices: Record<string, GeoipService> = {
ipwhois: async (): Promise<CurrentPositionResponse> => {
const r = await fetchJson('https://ipwho.is/');
if (!('latitude' in r) || !('longitude' in r)) throw new Error(`Invalid geolocation response: ${r ? JSON.stringify(r) : '<null>'}`);
return {
timestamp: Date.now(),
coords: {
longitude: r.longitude,
altitude: 0,
latitude: r.latitude,
},
};
},
geoplugin: async (): Promise<CurrentPositionResponse> => {
const r = await fetchJson('http://www.geoplugin.net/json.gp');
if (!('geoplugin_latitude' in r) || !('geoplugin_longitude' in r)) throw new Error(`Invalid geolocation response: ${r ? JSON.stringify(r) : '<null>'}`);
return {
timestamp: Date.now(),
coords: {
longitude: Number(r.geoplugin_longitude),
altitude: 0,
latitude: Number(r.geoplugin_latitude),
},
};
},
};
export default class {
static async currentPosition(options: CurrentPositionOptions = null) {
if (!options) options = {};
for (const [serviceName, handler] of Object.entries(geoipServices)) {
try {
const response = await handler();
return response;
} catch (error) {
logger.warn(`Could not get geolocation from service "${serviceName}"`);
logger.warn(error);
}
}
throw new Error('Could not get geolocation from any of the services');
}
}

View File

@ -63,7 +63,12 @@ describe('models/BaseItem', function() {
expect(unserialized.longitude).toEqual('0.00000000');
expect(unserialized.altitude).toEqual('0.0000');
await Note.updateGeolocation(note.id);
await Note.save({
id: note.id,
longitude: -3.459,
altitude: 0,
latitude: 48.732,
});
note = await Note.load(note.id);
serialized = await Note.serialize(note);
@ -77,7 +82,12 @@ describe('models/BaseItem', function() {
it('should serialize and unserialize notes', (async () => {
const folder = await Folder.save({ title: 'folder' });
const note = await Note.save({ title: 'note', parent_id: folder.id });
await Note.updateGeolocation(note.id);
await Note.save({
id: note.id,
longitude: -3.459,
altitude: 0,
latitude: 48.732,
});
const noteBefore = await Note.load(note.id);
const serialized = await Note.serialize(noteBefore);

View File

@ -2,7 +2,7 @@
const fs = require('fs-extra');
const shim = require('./shim').default;
const { GeolocationNode } = require('./geolocation-node.js');
const GeolocationNode = require('./geolocation-node').default;
const { FileApiDriverLocal } = require('./file-api-driver-local.js');
const { setLocale, defaultLocale, closestSupportedLocale } = require('./locale');
const FsDriverNode = require('./fs-driver-node').default;