#
require("app-module-path").addPath(__dirname);
const thunks = require("thunks")();
const _ = require("lodash");
const { Client } = require("@elastic/elasticsearch");
const conf = require("config");
const ascii = require("server/utils/asciifold");
const countryMapping = require("assets/mapping/country.json");
const githubCountryJson = require("assets/github/countries.json");
const ctripJson = require("assets/github/cityList2.json");
const { instance } = conf.elastic;
const client = new Client(instance);
const ctripGroupedByCountry = _.groupBy(ctripJson, "CountryID");
delete ctripGroupedByCountry["684367"];
const manual_alters = {
"Democratic People's Republic of Korea": "North Korea",
Vatican: "Vatican City State (Holy See)",
"Côte d'Ivoire": "Cote D'Ivoire (Ivory Coast)",
Eswatini: "Swaziland",
"North Macedonia": "Macedonia",
Palestine: "Palestinian Territory Occupied",
"Caribbean Netherlands": "Netherlands",
"Brunei Darussalam": "Brunei",
"Republic of the Congo": "Congo",
"Saint Helena、Ascension and Tristan da Cunha": "Saint Helena",
"U.S. Virgin Islands": "Virgin Islands (US)",
"Wallis and Futuna": "Wallis And Futuna Islands",
"French Saint Martin": "Saint-Martin (French part)",
"Saint Barthelemy": "Saint-Barthelemy",
};
const data = _.map(Object.keys(ctripGroupedByCountry), (country_id) => {
const cities = ctripGroupedByCountry[country_id];
const first = _.head(cities);
const country_en = _.get(first, "CountryEnName");
let country_obj = {};
if (manual_alters[country_en]) {
country_obj = _.find(
githubCountryJson,
(item) => item.name === manual_alters[country_en]
);
} else {
country_obj = _.find(
githubCountryJson,
(item) =>
_.toLower(country_en) == _.toLower(ascii.foldReplacing(item.name)) ||
_.toLower(country_en) == _.toLower(item.native)
);
}
if (_.isEmpty(country_obj)) {
console.log("COUNTRY MATCH FAILED: ", country_en);
return;
}
const country = {
..._.pick(country_obj, ["region", "subregion", "native", "iso2"]),
id: country_id,
name: country_obj.translations.cn,
name_en: country_obj.name,
phone: country_obj.phone_code,
iso: country_obj.iso3,
flag: country_obj.emoji,
emoji: _.split(country_obj.emojiU, " ")[0],
currency: {
code: country_obj.currency,
name: country_obj.currency_name,
symbol: country_obj.currency_symbol,
},
intl: {
es: country_obj.translations.es,
fr: country_obj.translations.fr,
},
geo: `${country_obj.latitude},${country_obj.longitude}`,
};
return country;
});
const china = _.find(githubCountryJson, (item) => item.name === "China");
data.push({
..._.pick(china, ["region", "subregion", "native", "iso2"]),
id: "100000",
name: china.translations.cn,
name_en: china.name,
phone: china.phone_code,
iso: china.iso3,
flag: china.emoji,
emoji: _.split(china.emojiU, " ")[0],
currency: {
code: china.currency,
name: china.currency_name,
symbol: china.currency_symbol,
},
intl: {
es: china.translations.es,
fr: china.translations.fr,
},
geo: `${china.latitude},${china.longitude}`,
});
thunks(async () => {
async function run() {
const idxResponse = await client.indices.create(
{
index: "countries",
body: countryMapping,
},
{ ignore: [400] }
);
const body = data.flatMap((doc) => [
{ index: { _index: "countries", _id: parseInt(doc.id) } },
doc,
]);
const { body: bulkResponse } = await client.bulk({ refresh: true, body });
if (bulkResponse.errors) {
const erroredDocuments = [];
bulkResponse.items.forEach((action, i) => {
const operation = Object.keys(action)[0];
const obj = action[operation];
if (obj.error) {
erroredDocuments.push({
status: obj.status,
error: obj.error,
operation: body[i * 2],
document: body[i * 2 + 1],
});
}
});
console.log(erroredDocuments);
}
const countResponse = await client.count({ index: "countries" });
console.log("final ", countResponse.body.count);
}
await run().catch(console.log);
console.warn("over...");
process.exit(0);
})(console.info);