Source: college.js

const jsdom = require('jsdom');
const request = require('request');

const colleges = require('../data/colleges');

/** @module college */

const { JSDOM } = jsdom;

/**
 * Returns a matched college data in the DB.
 * @param {string} name
 * @returns {?College}
 */
const find = name => colleges.find(college => college.name === name) || null;

/**
 * Returns all college data from DB.
 * @returns {Array.<College>}
 */
const getAll = () => colleges;

/**
 * Returns the college information.
 * @async
 * @param {College} college
 * @returns {Promise.<Informaion>}
 */
const getInformation = college => new Promise((resolve, reject) => {
  const { name, pageId, url } = college;
  request(`http://www.inha.ac.kr/mbshome/mbs/kr/subview.do?id=${pageId}`, (err, httpResponse, body) => {
    if (err) {
      reject(err);
    } else {
      const { document } = new JSDOM(body).window;
      const metadata = document.querySelectorAll('.list_03 li');
      if (metadata.length === 3) {
        const [telephone, fax, location] = metadata;
        resolve({
          name,
          description: document.querySelector('.college_h3_text').textContent,
          telephone: telephone.textContent.replace('TEL : ', '').replace(/(\s|\\n|\\t)+/g, ' '),
          fax: fax.textContent.replace('FAX : ', ''),
          location: location.textContent.replace('위치 : ', '').replace(/(\s|\\n|\\t)+/g, ' ').trim(),
          url,
        });
      } else if (metadata.length === 2) {
        const [telephone, location] = metadata;
        resolve({
          name,
          description: document.querySelector('.college_h3_text').textContent,
          telephone: telephone.textContent.replace('TEL : ', '').replace(/(\s|\\n|\\t)+/g, ' '),
          fax: null,
          location: location.textContent.replace('위치 : ', '').replace(/(\s|\\n|\\t)+/g, ' ').trim(),
          url,
        });
      } else {
        reject(new Error('Invalid metadata format'));
      }
    }
  });
});

module.exports = {
  find,
  getAll,
  getInformation,
};