300 lines
12 KiB
JavaScript
300 lines
12 KiB
JavaScript
const axios = require('axios').default;
|
|
const url = require('url');
|
|
const request = require('../config/request');
|
|
const RegionModels = require('../models/RegionModels');
|
|
|
|
const DEFAULT_COUNTRY_ID = 1;
|
|
|
|
class LibCurl {
|
|
|
|
static reverseGeo(lat, lng) {
|
|
return new Promise(async (resolve, reject) => {
|
|
let respReverseGeo = null;
|
|
try {
|
|
let params = new url.URLSearchParams({
|
|
lat,
|
|
lon: lng,
|
|
format: 'geojson',
|
|
});
|
|
const axInstance = axios.create();
|
|
axios.defaults.timeout = 3000;
|
|
axios.defaults.crossDomain = true;
|
|
// respReverseGeo = await axios({
|
|
// url: request.osm_reverse_geo.urlFull,
|
|
// method: request.osm_reverse_geo.method,
|
|
// params: params,
|
|
// responseType: 'json',
|
|
// });
|
|
respReverseGeo = await axInstance.get(request.osm_reverse_geo.urlFull + '?' + params.toString(), {
|
|
timeout: 3000,
|
|
});
|
|
let respData = respReverseGeo.data || {};
|
|
if (respReverseGeo.status == 200) {
|
|
if (respData.features.length < 1) {
|
|
resolve({type: 'no_available', respData});
|
|
} else {
|
|
let respAddr = respData.features[0].properties.address;
|
|
let addrData = {
|
|
lat,
|
|
lng,
|
|
country_id: DEFAULT_COUNTRY_ID,
|
|
country_code: respAddr.country_code,
|
|
country_text: (respAddr.country) ? respAddr.country.toUpperCase() : respAddr.country || null,
|
|
postcode: respAddr.postcode,
|
|
fulladdress: encodeURIComponent(respData.features[0].properties.display_name),
|
|
log_reverse_geo: (respData.features[0].properties) ? JSON.stringify(respData.features[0].properties) : null,
|
|
};
|
|
// if (respAddr.state || respAddr.city) {
|
|
addrData.state_id = null;
|
|
addrData.state_text = respAddr.region || respAddr.state || respAddr.state_district || respAddr.county || respAddr.city || '';
|
|
addrData.state_text = (addrData.state_text) ? addrData.state_text.toUpperCase() : addrData.state_text || null;
|
|
addrData.state_text = addrData.state_text || null;
|
|
// }
|
|
// if (respAddr.city_district || respAddr.city) {
|
|
addrData.city_id = null;
|
|
addrData.city_text = respAddr.city_district || respAddr.city || '';
|
|
addrData.city_text = (addrData.city_text) ? addrData.city_text.toUpperCase() : addrData.city_text || null;
|
|
addrData.city_text = addrData.city_text || null;
|
|
// }
|
|
// if (respAddr.suburb || respAddr.subdistrict) {
|
|
addrData.district_id = null;
|
|
addrData.district_text = respAddr.suburb || respAddr.subdistrict || respAddr.subdivision || '';
|
|
addrData.district_text = (addrData.district_text) ? addrData.district_text.toUpperCase() : addrData.district_text || null;
|
|
addrData.district_text = addrData.district_text || null;
|
|
// }
|
|
// if (respAddr.village || respAddr.neighbourhood) {
|
|
addrData.village_id = null;
|
|
addrData.village_text = respAddr.village || respAddr.neighbourhood || '';
|
|
addrData.village_text = (addrData.village_text) ? addrData.village_text.toUpperCase() : addrData.village_text || null;
|
|
addrData.village_text = addrData.village_text || null;
|
|
// }
|
|
// if (respAddr.amenity || respAddr.road || respAddr.city_block) {
|
|
addrData.streets = '';
|
|
addrData.streets += (respAddr.amenity) ? respAddr.amenity + ', ' : '';
|
|
addrData.streets += (respAddr.road) ? respAddr.road + ', ' : '';
|
|
addrData.streets += (respAddr.house_number) ? respAddr.house_number + ', ' : '';
|
|
addrData.streets += (respAddr.house_name) ? respAddr.house_name + ', ' : '';
|
|
addrData.streets += (respAddr.city_block) ? respAddr.city_block + ', ' : '';
|
|
addrData.streets += addrData.streets || null;
|
|
if (addrData.streets) {
|
|
addrData.streets = encodeURIComponent(addrData.streets.slice(0, -2));
|
|
}
|
|
// }
|
|
|
|
let byAll = await RegionModels.whereLike({
|
|
nmProvinsiKel: addrData.state_text,
|
|
nmKotamadyaKel: addrData.city_text,
|
|
nmKecamatanKel: addrData.district_text,
|
|
nmKelurahan: addrData.village_text,
|
|
});
|
|
if (byAll.length > 1) {
|
|
addrData.state_id = byAll[0].kodeProv;
|
|
addrData.city_id = byAll[0].kodeKab;
|
|
addrData.district_id = byAll[0].kodeKec;
|
|
addrData.village_id = byAll[0].kodeKel;
|
|
}
|
|
|
|
let byKel = await RegionModels.whereLike({
|
|
nmKelurahan: addrData.village_text,
|
|
});
|
|
if (byAll.length < 1 && byKel.length > 0) {
|
|
addrData.state_id = byKel[0].kodeProv;
|
|
addrData.city_id = byKel[0].kodeKab;
|
|
addrData.district_id = byKel[0].kodeKec;
|
|
addrData.village_id = byKel[0].kodeKel;
|
|
}
|
|
|
|
if (addrData.state_id === null) {
|
|
let byPr = await RegionModels.whereLike({ nmProvinsiKel: addrData.state_text });
|
|
if (byPr.length > 0) { addrData.state_id = byPr[0].kodeProv; }
|
|
}
|
|
|
|
if (addrData.state_id !== null && addrData.city_id === null) {
|
|
let byKt = await RegionModels.whereLike({ nmKotamadyaKel: addrData.city_text });
|
|
if (byKt.length > 0) { addrData.city_id = byKt[0].kodeKab; }
|
|
}
|
|
|
|
if (addrData.state_id !== null && addrData.city_id !== null && addrData.district_id === null) {
|
|
let byKc = await RegionModels.whereLike({ nmKecamatanKel: addrData.district_text });
|
|
if (byKc.length > 0) { addrData.district_id = byKc[0].kodeKec; }
|
|
}
|
|
|
|
if (addrData.state_id !== null && addrData.city_id !== null && addrData.district_id !== null && addrData.village_id === null) {
|
|
let byKl = await RegionModels.whereLike({ nmKelurahan: addrData.village_text });
|
|
if (byKl.length > 0) { addrData.village_id = byKl[0].kodeKel; }
|
|
}
|
|
|
|
resolve({type: 'sc', respData, addrData});
|
|
}
|
|
} else {
|
|
resolve({type: 'fail', respData});
|
|
}
|
|
} catch (e) {
|
|
let respData = {}
|
|
if (respReverseGeo) {
|
|
if (respReverseGeo.status != 200) {
|
|
respData.data = respReverseGeo.data;
|
|
} else {
|
|
respData.msg = e.message;
|
|
}
|
|
} else if (typeof e.response != 'undefined') {
|
|
respData.data = e.response;
|
|
} else {
|
|
respData.msg = e.message;
|
|
}
|
|
resolve({type: 'error', respData});
|
|
}
|
|
});
|
|
}
|
|
|
|
// https://github.com/sooluh/kodepos
|
|
// https://kodepos.vercel.app/search?q=16418&json=true
|
|
static getRegionId(postcode) {
|
|
return new Promise(async (resolve, reject) => {
|
|
let respRegion = null;
|
|
try {
|
|
let params = new url.URLSearchParams({
|
|
q: postcode,
|
|
json: 'true',
|
|
});
|
|
const axInstance = axios.create();
|
|
axios.defaults.timeout = 3000;
|
|
axios.defaults.crossDomain = true;
|
|
// respRegion = await axios({
|
|
// url: request.kodepos_region.urlFull,
|
|
// method: request.kodepos_region.method,
|
|
// params: params,
|
|
// responseType: 'json',
|
|
// });
|
|
respRegion = await axInstance.get(request.kodepos_region.urlFull + '?' + params.toString(), {
|
|
timeout: 3000,
|
|
});
|
|
let respData = respRegion.data || {};
|
|
if (respData.status !== true || respRegion.status == 200) {
|
|
if (typeof respData.data === undefied || respData.data.length < 1) {
|
|
resolve({type: 'no_available', respData});
|
|
} else {
|
|
let respAddr = respData.data[0];
|
|
let addrData = {
|
|
state_id: null,
|
|
state_text: respAddr.province || null,
|
|
city_id: null,
|
|
city_text: respAddr.city || null,
|
|
district_id: null,
|
|
district_text: respAddr.subdistrict || null,
|
|
village_id: null,
|
|
village_text: respAddr.urban || null,
|
|
};
|
|
|
|
let byAll = await RegionModels.whereLike({
|
|
nmProvinsiKel: addrData.state_text,
|
|
nmKotamadyaKel: addrData.city_text,
|
|
nmKecamatanKel: addrData.district_text,
|
|
nmKelurahan: addrData.village_text,
|
|
});
|
|
if (byAll.length > 1) {
|
|
addrData.state_id = byAll[0].kodeProv;
|
|
addrData.city_id = byAll[0].kodeKab;
|
|
addrData.district_id = byAll[0].kodeKec;
|
|
addrData.village_id = byAll[0].kodeKel;
|
|
}
|
|
|
|
let byKel = await RegionModels.whereLike({
|
|
nmKelurahan: addrData.village_text,
|
|
});
|
|
if (byAll.length < 1 && byKel.length > 0) {
|
|
addrData.state_id = byKel[0].kodeProv;
|
|
addrData.city_id = byKel[0].kodeKab;
|
|
addrData.district_id = byKel[0].kodeKec;
|
|
addrData.village_id = byKel[0].kodeKel;
|
|
}
|
|
|
|
if (addrData.state_id === null) {
|
|
let byPr = await RegionModels.whereLike({ nmProvinsiKel: addrData.state_text });
|
|
if (byPr.length > 0) { addrData.state_id = byPr[0].kodeProv; }
|
|
}
|
|
|
|
if (addrData.state_id !== null && addrData.city_id === null) {
|
|
let byKt = await RegionModels.whereLike({ nmKotamadyaKel: addrData.city_text });
|
|
if (byKt.length > 0) { addrData.city_id = byKt[0].kodeKab; }
|
|
}
|
|
|
|
if (addrData.state_id !== null && addrData.city_id !== null && addrData.district_id === null) {
|
|
let byKc = await RegionModels.whereLike({ nmKecamatanKel: addrData.district_text });
|
|
if (byKc.length > 0) { addrData.district_id = byKc[0].kodeKec; }
|
|
}
|
|
|
|
if (addrData.state_id !== null && addrData.city_id !== null && addrData.district_id !== null && addrData.village_id === null) {
|
|
let byKl = await RegionModels.whereLike({ nmKelurahan: addrData.village_text });
|
|
if (byKl.length > 0) { addrData.village_id = byKl[0].kodeKel; }
|
|
}
|
|
|
|
resolve({type: 'sc', respData, addrData});
|
|
}
|
|
} else {
|
|
resolve({type: 'fail', respData});
|
|
}
|
|
} catch (e) {
|
|
let respData = {}
|
|
if (respRegion) {
|
|
if (respRegion.status != 200) {
|
|
respData.data = respRegion.data;
|
|
} else {
|
|
respData.msg = e.message;
|
|
}
|
|
} else if (typeof e.response != 'undefined') {
|
|
respData.data = e.response;
|
|
} else {
|
|
respData.msg = e.message;
|
|
}
|
|
resolve({type: 'error', respData});
|
|
}
|
|
});
|
|
}
|
|
|
|
static formurlencoded(apiUrl, data) {
|
|
return new Promise(async (resolve, reject) => {
|
|
let respApi = null;
|
|
try {
|
|
let params = new url.URLSearchParams();
|
|
for (let row of data.names || []) {
|
|
params.append('names[]', row);
|
|
}
|
|
for (let row of data.photos || []) {
|
|
params.append('photos[]', row);
|
|
}
|
|
const axInstance = axios.create();
|
|
axios.defaults.timeout = 3000;
|
|
axios.defaults.crossDomain = true;
|
|
respApi = await axInstance.post(apiUrl, params, {
|
|
headers: {
|
|
'content-type': 'application/x-www-form-urlencoded'
|
|
},
|
|
});
|
|
let respData = respApi.data || {};
|
|
if (respData.meta.code == 200) {
|
|
resolve({type: 'sc', respData});
|
|
} else {
|
|
resolve({type: 'fail', respData});
|
|
}
|
|
} catch (e) {
|
|
let respData = {}
|
|
if (respApi) {
|
|
if (respApi.status != 200) {
|
|
respData.data = respApi.data;
|
|
} else {
|
|
respData.msg = e.message;
|
|
}
|
|
} else if (typeof e.response != 'undefined') {
|
|
respData.data = e.response;
|
|
} else {
|
|
respData.msg = e.message;
|
|
}
|
|
resolve({type: 'error', respData});
|
|
}
|
|
});
|
|
}
|
|
|
|
};
|
|
|
|
module.exports = LibCurl; |