From 5130e2e7f0cc81db09ef238e7058dee522b72e10 Mon Sep 17 00:00:00 2001 From: Bislon Zulu Date: Mon, 9 Nov 2020 09:47:16 +0200 Subject: [PATCH 1/2] initial commit --- index.js | 17 +++++++++++++ package.json | 5 ++-- src/controllers/SearchController.js | 18 +++++++++++++ src/models/countries.js | 7 +++++- src/utilities/elasticsearchUtils/addDoc.js | 25 +++++++++++++++++++ .../createElasticsearchIndex.js | 11 ++++++++ .../deleteElasticsearchIndex.js | 3 +++ .../elasticsearchConnection.js | 7 ++++++ 8 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 index.js create mode 100644 src/controllers/SearchController.js create mode 100644 src/utilities/elasticsearchUtils/addDoc.js create mode 100644 src/utilities/elasticsearchUtils/createElasticsearchIndex.js create mode 100644 src/utilities/elasticsearchUtils/deleteElasticsearchIndex.js create mode 100644 src/utilities/elasticsearchUtils/elasticsearchConnection.js diff --git a/index.js b/index.js new file mode 100644 index 00000000..e5f84b77 --- /dev/null +++ b/index.js @@ -0,0 +1,17 @@ +const db = require("./src/models/index"); + +const countriesAttributes = [ + "id", + "nameOfCountry", + "gallery", + "capital", + "population", + "officialLanguage", + "region", + "currency", +]; +const countries = db.Countries.findAll({ + include: [{ model: db.TouristCenters, as: "touristCenters" }, { model: db.States, as: "states" }] +}); + +console.log(countries); diff --git a/package.json b/package.json index 4d3e2d82..a3eb8ef6 100644 --- a/package.json +++ b/package.json @@ -5,14 +5,15 @@ "main": "src/app.js", "dependencies": { "@sendgrid/mail": "^7.2.6", + "async": "^3.2.0", "bcrypt": "^5.0.0", + "bcrypt-nodejs": "0.0.3", "body-parser": "^1.19.0", "cors": "^2.8.5", - "async": "^3.2.0", - "bcrypt-nodejs": "0.0.3", "cross-env": "^7.0.2", "crypto": "^1.0.1", "dotenv": "^8.2.0", + "elasticsearch": "^16.7.1", "express": "^4.17.1", "joi": "^17.2.1", "jsonwebtoken": "^8.5.1", diff --git a/src/controllers/SearchController.js b/src/controllers/SearchController.js new file mode 100644 index 00000000..023f04a8 --- /dev/null +++ b/src/controllers/SearchController.js @@ -0,0 +1,18 @@ +const client = require("../utilities/elasticsearchUtils/elasticsearchConnection"); + +client.ping({ + requestTimeout: 3, +}, error => { + if (error) { + console.log("Cannot connect to Elasticsearch."); + console.error(error); + } else { + console.log("connected to Elasticsearch was successful!"); + } +}); + +client.cluster.health({}, (err, resp, status) => { + console.log("-- Client Health", resp); +}); + +client.indices.delete({ index: "country" }, (err, resp, status) => { console.log("delete", resp); }); diff --git a/src/models/countries.js b/src/models/countries.js index 8ddc2b3b..0b3ea679 100644 --- a/src/models/countries.js +++ b/src/models/countries.js @@ -29,7 +29,12 @@ module.exports = (sequelize, DataTypes) => { allowNull: false, }, }); - + model.getSearchOptions = () => { + return { + type: "countries", + keys: ["nameOfCountry", "gallery", "capital", "population", "officialLanguage", "region", ] + } +}; Country.associate = (models) => { Country.hasMany(models.Cultures, { as: "cultureCountry", diff --git a/src/utilities/elasticsearchUtils/addDoc.js b/src/utilities/elasticsearchUtils/addDoc.js new file mode 100644 index 00000000..a9cf7c87 --- /dev/null +++ b/src/utilities/elasticsearchUtils/addDoc.js @@ -0,0 +1,25 @@ +/* eslint-disable require-jsdoc */ +import db from "../../models/index"; + +const client = require("./elasticsearchConnection"); + +const countriesAttributes = [ + "id", + "nameOfCountry", + "gallery", + "capital", + "population", + "officialLanguage", + "region", + "currency", +]; + +export default class Check { + static checkSome() { + const countries = db.Countries.findAll({ + include: [{ model: db.TouristCenters, as: "touristCenters" }, { model: db.States, as: "states" }] + }); + + console.log(countries); + } +} diff --git a/src/utilities/elasticsearchUtils/createElasticsearchIndex.js b/src/utilities/elasticsearchUtils/createElasticsearchIndex.js new file mode 100644 index 00000000..d4c3c68f --- /dev/null +++ b/src/utilities/elasticsearchUtils/createElasticsearchIndex.js @@ -0,0 +1,11 @@ +const client = require("./elasticsearchConnection"); + +client.indices.create({ + index: "country" +}, (err, resp, status) => { + if (err) { + console.log(err); + } else { + console.log("create", resp); + } +}); diff --git a/src/utilities/elasticsearchUtils/deleteElasticsearchIndex.js b/src/utilities/elasticsearchUtils/deleteElasticsearchIndex.js new file mode 100644 index 00000000..63628e8f --- /dev/null +++ b/src/utilities/elasticsearchUtils/deleteElasticsearchIndex.js @@ -0,0 +1,3 @@ +const client = require("./elasticsearchConnection"); + +client.indices.delete({ index: "country" }, (err, resp, status) => { console.log("delete", resp); }); diff --git a/src/utilities/elasticsearchUtils/elasticsearchConnection.js b/src/utilities/elasticsearchUtils/elasticsearchConnection.js new file mode 100644 index 00000000..50cba4ff --- /dev/null +++ b/src/utilities/elasticsearchUtils/elasticsearchConnection.js @@ -0,0 +1,7 @@ +const elasticsearch = require("elasticsearch"); + +const client = new elasticsearch.Client({ + host: ["http://localhost:9200"] +}); + +module.exports = client; From e40719983a312ba0b395fddac35757b32d983231 Mon Sep 17 00:00:00 2001 From: Bislon Zulu Date: Tue, 10 Nov 2020 12:35:23 +0200 Subject: [PATCH 2/2] feature(setup):add search feature - user should be able to search for a country and any of its details [finishes #175557230] --- index.js | 32 +++++++++++++++++++--- search.js | 13 +++++++++ src/utilities/elasticsearchUtils/addDoc.js | 23 ++++++---------- 3 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 search.js diff --git a/index.js b/index.js index e5f84b77..b128ac28 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,5 @@ const db = require("./src/models/index"); +const client = require("./src/utilities/elasticsearchUtils/elasticsearchConnection"); const countriesAttributes = [ "id", @@ -10,8 +11,31 @@ const countriesAttributes = [ "region", "currency", ]; -const countries = db.Countries.findAll({ - include: [{ model: db.TouristCenters, as: "touristCenters" }, { model: db.States, as: "states" }] -}); +let countryDetails; +db.Countries.findAll({ + attributes: countriesAttributes, + include: [{ model: db.TouristCenters, as: "touristCenters" }, { model: db.States, as: "states" }, { model: db.EthnicGroups, as: "ethnicGroups" }, { model: db.Music, as: "music" }, { model: db.Foods, as: "Food" }] +}) + .then(country => { + countryDetails = country.map(count => count.dataValues); + client.index({ + index: "country", + id: countryDetails[0].id, + type: "country", + body: { ...countryDetails[0] }, + }, (err, resp, status) => { + console.log(resp); + }); + }); -console.log(countries); +client.ping({ + requestTimeout: 3000, +}, error => { + if (error) { + console.log("cannot connect to elasticsearch."); + console.error(error); + } +}); +client.cluster.health({}, (err, resp, status) => { + console.log(resp); +}); diff --git a/search.js b/search.js new file mode 100644 index 00000000..ce6f6180 --- /dev/null +++ b/search.js @@ -0,0 +1,13 @@ +const db = require("./src/models/index"); +const client = require("./src/utilities/elasticsearchUtils/elasticsearchConnection"); + +client.indices.search({ + index: "country", + type: "country", +}, (error, response) => { + if (error) { + console.log(error.message); + } else { + console.log("Mapping:\n", response.country.mappings.country.properties); + } +}); diff --git a/src/utilities/elasticsearchUtils/addDoc.js b/src/utilities/elasticsearchUtils/addDoc.js index a9cf7c87..7b4a5eac 100644 --- a/src/utilities/elasticsearchUtils/addDoc.js +++ b/src/utilities/elasticsearchUtils/addDoc.js @@ -1,7 +1,4 @@ -/* eslint-disable require-jsdoc */ -import db from "../../models/index"; - -const client = require("./elasticsearchConnection"); +const db = require("../../models/index"); const countriesAttributes = [ "id", @@ -13,13 +10,11 @@ const countriesAttributes = [ "region", "currency", ]; - -export default class Check { - static checkSome() { - const countries = db.Countries.findAll({ - include: [{ model: db.TouristCenters, as: "touristCenters" }, { model: db.States, as: "states" }] - }); - - console.log(countries); - } -} +db.Countries.findAll({ + attributes: countriesAttributes, + include: [{ model: db.TouristCenters, as: "touristCenters" }, { model: db.States, as: "states" }, { model: db.EthnicGroups, as: "ethnicGroups" }, { model: db.Music, as: "music" }, { model: db.Foods, as: "Food" }] +}) + .then(country => { + const countryDetails = country.map(count => count.dataValues); + console.log(countryDetails); + });