RackHD/on-http

View on GitHub
lib/api/2.0/ibms.js

Summary

Maintainability
D
2 days
Test Coverage
// Copyright 2016, EMC, Inc.

'use strict';

var injector = require('../../../index.js').injector;
var controller = injector.get('Http.Services.Swagger').controller;
var schemaApiService = injector.get('Http.Api.Services.Schema');
var nameSpace = '/api/2.0/ibms/definitions/';
var waterline = injector.get('Services.Waterline');
var eventsProtocol = injector.get('Protocol.Events');
var Errors = injector.get('Errors');
var _ = injector.get('_'); // jshint ignore:line


// GET /api/2.0/ibms
var ibmsGet = controller(function(req) {
    return waterline.ibms.find(req.query);
});

// PUT /api/2.0/ibms
var ibmsPut = controller({success: 201}, function(req) {
    var nodeId = req.swagger.params.body.value.nodeId;
    delete req.swagger.params.body.value.nodeId;
    return waterline.ibms.upsertByNode(nodeId, req.swagger.params.body.value);
});

// GET /api/2.0/ibms/identifier
var ibmsGetById = controller(function(req) {
    return waterline.ibms.needByIdentifier(req.swagger.params.identifier.value);
});

// PATCH /api/2.0/ibms/identifier
var ibmsPatchById = controller( function(req) {
    var ibmId = req.swagger.params.identifier.value;
    var values = req.swagger.params.body.value;
    return waterline.ibms.needByIdentifier(ibmId)
        .then(function(oldIbm) {
            /* Get nodes that need to publish events */
            if (oldIbm.node && !values.nodeId) {
                return Promise.all([waterline.nodes.getNodeById(oldIbm.node)]);
            } else if (!oldIbm.node && values.nodeId) {
                return Promise.all([waterline.nodes.getNodeById(values.node)]);
            } else if (oldIbm.node && values.nodeId && oldIbm.node === values.nodeId) {
                return Promise.all([waterline.nodes.getNodeById(oldIbm.node)]);
            } else if (oldIbm.node && values.nodeId && oldIbm.node !== values.nodeId) {
                return Promise.all([waterline.nodes.getNodeById(oldIbm.node),
                        waterline.nodes.getNodeById(values.nodeId)]);
            }
        })
        .then(function(oldNodes) {
            return waterline.ibms.updateByIdentifier(ibmId, values)
            .tap(function() {
                /* Publish events of nodes got beofre update */
                _.forEach(oldNodes, function(oldNode) {
                    if (oldNode) {
                        /* asynchronous, don't wait promise return for performance*/
                        return waterline.nodes.getNodeById(oldNode.id)
                        .then(function(newNode) {
                            return eventsProtocol.publishNodeAttrEvent(oldNode, newNode, 'ibms');
                        })
                        .catch(function (error) {
                            throw new Errors.BaseError('Error Occured', error.message);
                        });
                    }
                });
            });
        });
});

// DELETE /api/2.0/ibms/identifier
var ibmsDeleteById = controller({success: 204}, function(req) {
    var ibmId = req.swagger.params.identifier.value;
    return waterline.ibms.needByIdentifier(ibmId)
        .then(function (ibm) {
            return waterline.nodes.getNodeById(ibm.node);
        })
        .then(function (oldNode) {
            return waterline.ibms.destroyByIdentifier(ibmId)
            .tap(function () {
                if (oldNode) {
                    /* asynchronous, don't wait promise return for performance*/
                    waterline.nodes.getNodeById(oldNode.id)
                    .then(function (newNode) {
                        return eventsProtocol.publishNodeAttrEvent(oldNode, newNode, 'ibms');
                    })
                    .catch(function (error) {
                        throw new Errors.BaseError('Error Occured', error.message);
                    });
                }
            });
        });

});

// GET /ibms/definitions
var ibmsDefinitionsGetAll = controller(function() {
    return schemaApiService.getNamespace(nameSpace);
});

// GET /ibms/definitions/{name}
var ibmsDefinitionsGetByName = controller(function(req) {
    var schemaUid = nameSpace + req.swagger.params.name.value;
    var schema = schemaApiService.getSchema(schemaUid);
    if (schema) {
        return schema;
    }
    throw new Errors.NotFoundError(schemaUid + ' Not Found');
});

module.exports = {
    ibmsGet: ibmsGet,
    ibmsPut: ibmsPut,
    ibmsGetById: ibmsGetById,
    ibmsPatchById: ibmsPatchById,
    ibmsDeleteById: ibmsDeleteById,     
    ibmsDefinitionsGetAll: ibmsDefinitionsGetAll,
    ibmsDefinitionsGetByName: ibmsDefinitionsGetByName
};