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;