docs

a slatepencil documentail site

View on GitHub

#

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);