Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | 1x 1x 1x 1x 1x 1x | 'use strict';
const logger = require('../../services/logger');
function filterWithMinCount(suggestions, minCount) {
return suggestions.reduce((validated, suggestion) => {
let value = suggestion.Value;
if (!value) return validated;
if (validated.includes(value)) return validated;
const resourceId = suggestion.ResourceId;
const count = suggestions.reduce((count, tr) => {
if (tr.Value === value && tr.ResourceId !== resourceId) return count + 1;
return count;
}, 0);
return count > minCount ? [...validated, value] : validated;
}, []);
}
module.exports = function(Education) {
Education.educationSuggestions = async (type, language) => {
// Language code should be 2 characters long. Anything longer
// is a invalid parameter and possibly a SQL injection.
if (language.length !== 2) {
let error = new Error(`Invalid language parameter ${language}`);
error.status = 400;
throw error;
}
if (type !== 'school' && type !== 'certificate' && type !== 'course') {
let error = new Error(`Invalid type parameter ${type}`);
error.status = 400;
throw error;
}
const educationItems = await Education.app.models.education.find({
include: {
relation: 'educationTranslations',
scope: {
where: {LanguageId: language}
}
},
where: {Type: type}
});
const validEducationItems = educationItems.filter(education => {
const educationJSON = education.toJSON();
return educationJSON.educationTranslations.length > 0;
});
const organizers = validEducationItems.map(education => {
const educationJSON = education.toJSON();
const translation = educationJSON.educationTranslations[0];
return {
ResourceId: education.ResourceId,
Value: translation.Organizer
};
});
const achievements = validEducationItems.map(education => {
const educationJSON = education.toJSON();
const translation = educationJSON.educationTranslations[0];
return {
ResourceId: education.ResourceId,
Value: translation.Achievement
};
});
return {
organizers: filterWithMinCount(organizers, 2),
achievements: filterWithMinCount(achievements, 2)
};
};
Education.remoteMethod('educationSuggestions', {
http: {verb: 'get'},
accepts: [
{
arg: 'type',
type: 'string',
required: true
},
{
arg: 'language',
type: 'string',
required: true
}
],
returns: {
arg: 'suggestions',
type: 'object'
}
});
Education.getEducation = function(resourceId, cb) {
Education.find(
{
include: 'educationTranslations',
where: {
ResourceId: resourceId
}
},
function(err, education) {
if (err) return cb(err);
return cb(null, education);
}
);
};
Education.remoteMethod('getEducation', {
http: {verb: 'get'},
accepts: [
{
arg: 'resourceId',
type: 'number'
}
],
returns: {
arg: 'result',
type: 'object'
}
});
};
|