Source: helpers/congress-helper.js

var mysql = require('mysql');
var Q = require('q');
var _ = require('underscore');

var db = require('../utils/db-connector');
var MemberHelper = require('./member-helper');

/**
 * Helper class for converting and retrieving congress to/from the database
 * @constructor
 * @requires api/helpers/MemberHelper
 * @requires api/utils/DBConnector
 */
function CongressHelper() {}

/**
 * Retrieve a list of congresses either by id or all
 * @param { ?number } congress - congress number, if none provided then
 * information on all congresses are returned
 * @returns { Promise } a promise that will resolve with a list of congresses
 */
CongressHelper.prototype.getCongress = function(congress) {
  congress = congress || null;
  var call;
  if (congress) {
    call = 'CALL getCongressById(' + congress + ');';
  } else {
    call = 'CALL getCongressById(NULL);';
  }
  var deferred = Q.defer();
  db.pool.query(call, function(err, rows) {
    if (err) { deferred.reject(err); }
    else if (rows[0].length === 0) {
      err = new Error('Cannot find congress #' + congress);
      err.status = 404;
      deferred.reject(err);
    } else { deferred.resolve(rows[0]); } // no conversion needed, just pick out results
  });
  return deferred.promise;
};

/**
 * Retrieve members that belong/attended a given congress
 * @param { number } congress - congress number to lookup members for
 * @returns { Promise } a promise that will resolve with a list of members
 */
CongressHelper.prototype.getCongressMembers = function(congress) {
  var query = 'SELECT congress_id FROM congresses WHERE congress_id = ' + congress;
  var call = 'CALL getCongressMembers(' + congress + ')';
  var deferred = Q.defer();
  db.getConnection().then(function (connection) {
    connection.query(query, function(err, rows) {
      if (err) {
        connection.release();
        deferred.reject(err);
      } else if (!rows || rows.length === 0) {
        connection.release();
        err = new Error('Cannot find congress #' + congress);
        err.status = 404;
        deferred.reject(err);
      } else {
        connection.query(call, function(err, res) {
          if (err) { deferred.reject(err); }
          else {
            // res[0] -> result rows, res[1] -> status
            deferred.resolve(MemberHelper.transformMembers(res[0]));
          }
          connection.release();
        });
      }
    });
  }).catch(deferred.reject);
  return deferred.promise;
};

/**
 * A singleton instance of CongressHelper that uses a database connection to
 * lookup and retrieve information about congresses.
 * @module api/helpers/CongressHelper
 * @see CongressHelper
 */
module.exports = new CongressHelper();