74 lines
2.3 KiB
JavaScript
74 lines
2.3 KiB
JavaScript
|
"use strict";
|
||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
|
};
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.Geocode = void 0;
|
||
|
require("dotenv/config");
|
||
|
const url_1 = require("url");
|
||
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
||
|
const log_1 = require("../log");
|
||
|
const env_1 = require("../env");
|
||
|
const db_1 = require("../db");
|
||
|
class Geocode {
|
||
|
constructor() {
|
||
|
this.log = (0, log_1.createLog)('geocode');
|
||
|
this.baseUrl = 'https://geocode.maps.co/search';
|
||
|
this.apiKey = (0, env_1.envString)('GEOCODE_API_KEY', null);
|
||
|
this.db = new db_1.DB();
|
||
|
}
|
||
|
async query(location) {
|
||
|
let res = await this.db.getLocation(location);
|
||
|
if (res === null) {
|
||
|
res = await this.api(location);
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
toLatLng(obj) {
|
||
|
return {
|
||
|
latitude: parseFloat(obj.lat),
|
||
|
longitude: parseFloat(obj.lon)
|
||
|
};
|
||
|
}
|
||
|
//https://geocode.maps.co/search?q=&api_key=675738aa38619885468998kehbf6458
|
||
|
async api(location) {
|
||
|
const url = new url_1.URL(this.baseUrl);
|
||
|
let response;
|
||
|
let json;
|
||
|
let res = null;
|
||
|
url.searchParams.append('q', location);
|
||
|
this.log.info(`Querying API: ${url.href}`);
|
||
|
url.searchParams.append('api_key', this.apiKey);
|
||
|
await this.delay(1000); //rate limit to 1/sec
|
||
|
try {
|
||
|
response = await (0, node_fetch_1.default)(url.href);
|
||
|
}
|
||
|
catch (err) {
|
||
|
this.log.error('Error getting response', err);
|
||
|
return null;
|
||
|
}
|
||
|
try {
|
||
|
json = await response.json();
|
||
|
}
|
||
|
catch (err) {
|
||
|
this.log.error('Error parsing json', err);
|
||
|
return null;
|
||
|
}
|
||
|
if (json.length < 1) {
|
||
|
return null;
|
||
|
}
|
||
|
res = this.toLatLng(json[0]);
|
||
|
await this.db.cacheLocation(location, res);
|
||
|
return res;
|
||
|
}
|
||
|
async delay(ms) {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
return setTimeout(resolve, ms);
|
||
|
});
|
||
|
}
|
||
|
cache(location, latitude, longitude) {
|
||
|
}
|
||
|
}
|
||
|
exports.Geocode = Geocode;
|
||
|
module.exports = { Geocode };
|
||
|
//# sourceMappingURL=index.js.map
|