maestro-server/server-app

View on GitHub
app/core/applications/wrapperPersistenceApplication.js

Summary

Maintainability
A
1 hr
Test Coverage
A
96%
'use strict';

const Access = require('core/entities/accessRole');

const DFactoryPesistenceApp = require('core/applications/persistenceApplication');
const PersistenceServices = require('core/services/PersistenceServices');

const validAccessEmpty = require('core/applications/validator/validAccessEmpty');
const changerUser = require('./transforms/swapUser');


const WrapperPersistenceApp = (Entity) => (ACEntity) => (FactoryPesistenceApp = DFactoryPesistenceApp) => (apply) => {

    const PesistenceApp = FactoryPesistenceApp(Entity);

    const factoryWrapper = function(method, access) {
        return (req, res, next) => {
          const {user, params} = req;

          PersistenceServices(ACEntity)
              .findOne(params.id, user, access)
              .then(validAccessEmpty)
              .then((e) => {
                  const newReq = changerUser(req, e, params, ACEntity);
                  PesistenceApp[method](newReq, res, next);
              })
              .catch(next);
        };
    };

    return {
        find (req, res, next) {
            const mtd = apply || 'find';
            factoryWrapper(mtd, Access.ROLE_READ)(req, res, next);
        },

        count (req, res, next) {
            const mtd = apply || 'count';
            factoryWrapper(mtd, Access.ROLE_READ)(req, res, next);
        },

        findOne (req, res, next) {
            const mtd = apply || 'findOne';
            factoryWrapper(mtd, Access.ROLE_READ)(req, res, next);
        },

        update (req, res, next) {
            const mtd = apply || 'update';
            factoryWrapper(mtd, Access.ROLE_WRITER)(req, res, next);
        },

        updateSingle (req, res, next) {
            factoryWrapper('updateSingle', Access.ROLE_WRITER)(req, res, next);
        },

        updateMany (req, res, next) {
            factoryWrapper('updateMany', Access.ROLE_WRITER)(req, res, next);
        },

        patch (req, res, next) {
            const mtd = apply || 'patch';
            factoryWrapper(mtd, Access.ROLE_WRITER)(req, res, next);
        },

        create (req, res, next) {
            const mtd = apply || 'create';
            factoryWrapper(mtd, Access.ROLE_WRITER)(req, res, next);
        },

        remove (req, res, next) {
            factoryWrapper('remove', Access.ROLE_ADMIN)(req, res, next);
        }
    };

};


module.exports = WrapperPersistenceApp;