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