gadael/gadael

View on GitHub
schema/User_Manager.js

Summary

Maintainability
A
3 hrs
Test Coverage
'use strict';

/**
 * A user, department manager
 * can manage vacation requests for the departments users accounts
 */
exports = module.exports = function(params) {

    var mongoose = params.mongoose;

    var managerSchema = new mongoose.Schema({
        user: {
          id: { type: mongoose.Schema.Types.ObjectId, ref: 'User', index: true, unique: true },
          name: { type: String, default: '' }
        },
        department: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Department' }],
        timeCreated: { type: Date, default: Date.now }
    });

    managerSchema.set('autoIndex', params.autoIndex);



    /**
     * Get list of managed departments
     * @returns {Promise}   promised array
     */
    managerSchema.methods.getManagedDepartments = function() {

        var deferred = {};
        deferred.promise = new Promise(function(resolve, reject) {
            deferred.resolve = resolve;
            deferred.reject = reject;
        });

        this.populate('department', function(err, manager) {
            if (err) {
                return deferred.reject(err);
            }

            var mainDep, subDepPromises = [], departments = [];

            // for each department, get the sub-departments list
            for(var i =0; i<manager.department.length; i++) {
                mainDep = manager.department[i];

                if (!mainDep) {
                    continue;
                }

                departments.push(mainDep);
                subDepPromises.push(mainDep.getSubDepartments());
            }

            Promise.all(subDepPromises).then(function(list) {
                list.map(function(arr) {
                    Array.prototype.push.apply(departments, arr);
                });

                deferred.resolve(departments);

            }, deferred.reject);


        });

        return deferred.promise;
    };

    params.db.model('Manager', managerSchema);
};