|
| 1 | +const axios = require('axios') |
| 2 | +const config = require('config') |
| 3 | +const querystring = require('querystring') |
| 4 | +const NodeCache = require('node-cache') |
| 5 | +const joi = require('@hapi/joi') |
| 6 | +const orgSkillsProviderService = require('../organizationSkillsProvider/service') |
| 7 | +const esHelper = require('../../common/es-helper') |
| 8 | + |
| 9 | +// cache the emsi token |
| 10 | +const tokenCache = new NodeCache() |
| 11 | + |
| 12 | +/** |
| 13 | + * Format EMSI skills like the ones returned by the ES query |
| 14 | + * @param {Array} emsiSkills Array of skills |
| 15 | + */ |
| 16 | +function formatEmsiSkills (emsiSkills) { |
| 17 | + return emsiSkills.skills.slice(0, 10).map(skill => ({ |
| 18 | + name: skill.name, |
| 19 | + skillId: skill.id, |
| 20 | + skillProviderId: config.EMSI_SKILLPROVIDER_ID |
| 21 | + })) |
| 22 | +} |
| 23 | + |
| 24 | +/** |
| 25 | + * Get emsi token |
| 26 | + * @returns {string} the emsi token |
| 27 | + */ |
| 28 | +async function getEmsiToken () { |
| 29 | + let token = tokenCache.get('emsi_token') |
| 30 | + if (!token) { |
| 31 | + const res = await axios.post(config.EMSI.AUTH_URL, querystring.stringify({ |
| 32 | + client_id: config.EMSI.CLIENT_ID, |
| 33 | + client_secret: config.EMSI.CLIENT_SECRET, |
| 34 | + grant_type: config.EMSI.GRANT_TYPE, |
| 35 | + scope: config.EMSI.SCOPE |
| 36 | + })) |
| 37 | + token = res.data.access_token |
| 38 | + tokenCache.set('emsi_token', token, res.data.expires_in) |
| 39 | + } |
| 40 | + return token |
| 41 | +} |
| 42 | + |
| 43 | +/** |
| 44 | + * Get data from emsi |
| 45 | + * @param {String} path the emsi endpoint path |
| 46 | + * @param {String} params get params |
| 47 | + * @returns {Object} response data |
| 48 | + */ |
| 49 | +async function getEmsiObject (path, params) { |
| 50 | + const token = await getEmsiToken() |
| 51 | + const res = await axios.get(`${config.EMSI.BASE_URL}${path}`, { params, headers: { authorization: `Bearer ${token}` } }) |
| 52 | + return res.data |
| 53 | +} |
| 54 | + |
| 55 | +/** |
| 56 | + * Get skills by query. |
| 57 | +// !Proxies request to EMSI if org uses it as its skill provider |
| 58 | + * @param {String} query the query |
| 59 | + * @param {Object} auth the auth object |
| 60 | + * @returns {Object} the Object with skills |
| 61 | + */ |
| 62 | +async function getSkills (query, auth) { |
| 63 | + let result |
| 64 | + const skillProviderIds = await orgSkillsProviderService.search({ organizationId: query.organizationId }, auth) |
| 65 | + |
| 66 | + if (skillProviderIds.result.length === 1 && skillProviderIds.result[0].skillProviderId === config.EMSI_SKILLPROVIDER_ID) { |
| 67 | + result = await getEmsiObject('/skills', { q: query.keyword }) |
| 68 | + return { result: formatEmsiSkills(result) } |
| 69 | + } |
| 70 | + |
| 71 | + result = await esHelper.searchSkillsInOrganization(query) |
| 72 | + |
| 73 | + return result |
| 74 | +} |
| 75 | + |
| 76 | +getSkills.schema = { |
| 77 | + query: joi.object().keys({ |
| 78 | + organizationId: joi.string().required(), |
| 79 | + keyword: joi.string().required() |
| 80 | + }), |
| 81 | + auth: joi.object() |
| 82 | +} |
| 83 | + |
| 84 | +module.exports = { getSkills } |
0 commit comments