linagora/hublin

View on GitHub
backend/webserver/controllers/conferences.js

Summary

Maintainability
D
2 days
Test Coverage
'use strict';

var conference = require('../../core/conference');
var AUTHORIZED_FIELDS = ['displayName'];
var Report = require('../../core/report');

module.exports = function(dependencies) {
  var logger = dependencies('logger');
  var errors = require('../errors')(dependencies);
  const denormalizer = require('../denormalizers/conference')(dependencies);

  function inviteMembers(conf, user, members, baseUrl, callback) {
    var newMembers = [];

    if (!Array.isArray(members)) {
      throw new errors.BadRequestError('Members must be an array');
    }

    members.forEach(function(member) {
      var sanitizedMember = denormalizer.sanitizeAndValidateMember(member);
      if (sanitizedMember) {
        newMembers.push(sanitizedMember);
      }
    });

    if (!newMembers) {
      throw new errors.BadRequestError('Invited members missing');
    }

    conference.invite(conf, user, newMembers, baseUrl, callback);
  }

  function addMembers(req, res) {
    inviteMembers(req.conference, req.user, req.body, req.openpaas.getBaseURL(), function(err) {
      if (err) {
        throw new errors.ServerError(err);
      }
      res.status(202).end();
    });
  }

  function finalizeCreation(req, res) {
    const conference = req.conference ? req.conference.toObject() : {};

    if (!req.body.members || req.body.members.length === 0) {
      return denormalizer.denormalize(conference)
        .then(denormalized => res.status(req.created ? 201 : 200).json(denormalized))
        .catch(err => {
          logger.error(err);
          res.status(500).send('Failed to denormalize conference');
        });
    }

    inviteMembers(req.conference, req.user, req.body.members, req.openpaas.getBaseURL(), function(err) {
      if (err) {
        throw new errors.ServerError(err);
      }

      denormalizer.denormalize(req.conference.toObject())
        .then(conference => res.status(202).json(conference))
        .catch(err => {
          logger.error(err);
          res.status(500).send('Failed to denormalize conference');
        });
    });
  }

  function getMembers(req, res) {
    var conf = req.conference;
    if (!conf) {
      throw new errors.BadRequestError('Conference is missing');
    }
    var sanitizedMembers = conf.members ? denormalizer.sanitizeMembers(conf.toObject().members) : [];
    res.status(200).json(sanitizedMembers);
  }

  function updateMemberField(req, res) {
    var conf = req.conference;

    var data = req.body;
    if (!data || !data.value) {
      throw new errors.BadRequestError('Data is missing');
    }

    var field = req.params.field;
    if (AUTHORIZED_FIELDS.indexOf(field) < 0) {
      throw new errors.BadRequestError('Can not update ' + field);
    }

    var memberId = req.params.mid;
    var member = conf.members.filter(function(member) {
      return member._id.toString() === memberId;
    });

    if (!member.length) {
      throw new errors.NotFoundError('Member not found in conference');
    }

    conference.updateMemberField(conf, member[0], field, data.value, function(err) {
      if (err) {
        logger.error('Can not update member', err);
        throw new errors.ServerError('Can not update member');
      }
      var returnedMember = member[0].toObject();
      returnedMember[field] = data.value;
      var user = req.user;
      user[field] = data.value;
      req.user = user;
      res.status(200).json(denormalizer.sanitizeMember(returnedMember));
    });
  }

  function get(req, res) {
    if (!req.conference) {
      throw new errors.NotFoundError('No such conference');
    }

    denormalizer.denormalize(req.conference.toObject())
      .then(denormalized => res.status(200).json(denormalized))
      .catch(err => {
        logger.error(err);
        res.status(500).send('Failed to denormalize conference');
      });
  }

  function persistReport(req, callback) {
    var reportToSave = {
      timestamp: {created: new Date()},
      reporter: req.user,
      description: req.body.description,
      conference: req.conference
    };

    reportToSave.members = [];
    var mapMembers = {};

    for (var i = 0; i < req.conference.members.length; i++) {
      mapMembers[req.conference.members[i]._id.toString()] = req.conference.members[i];
    }
    reportToSave.reported = mapMembers[req.body.reported];
    req.body.members.forEach(function(memberId) {
      reportToSave.members.push(mapMembers[memberId]);
    });

    return Report.create(reportToSave, callback);
  }

  function createReport(req, res) {
    if (!req.body.reported) {
      throw new errors.BadRequestError('Attendee to report is required');
    }

    if (!req.body.description) {
      throw new errors.BadRequestError('Description is required');
    }

    if (!req.body.members) {
      throw new errors.BadRequestError('Members of the conference are required');
    }

    persistReport(req, function(err, created) {
      if (err) {
        logger.error('Error while creating report', err);
        throw new errors.ServerError(err);
      }

      res.status(201).json({ id: created._id });
    });
  }

  return {
    get: get,
    finalizeCreation: finalizeCreation,
    addMembers: addMembers,
    getMembers: getMembers,
    updateMemberField: updateMemberField,
    createReport: createReport
  };
};