maestro-server/audit-app

View on GitHub
app/audit/applications/persistenceAudit.js

Summary

Maintainability
D
2 days
Test Coverage
A
100%
'use strict';

const _ = require('lodash');

const DPersistenceServices = require('core/services/PersistenceServices');
const validNotFound = require('core/applications/validator/validNotFound');
const {transfID} = require('core/applications/transforms/mapRelationToObjectID');

const hateaosTransform = require('core/applications/transforms/hateoasTransform');

const AuditTrack = require('audit/services/auditTrack');


const ApplicationAudit = (EntityStorage) => (Entity, PersistenceServices = DPersistenceServices) => {

    const AuditTrackCharged = AuditTrack(PersistenceServices(Entity));
    const dUser = "MaestroServer";

    return {
        find(req, res, next) {

            let {query, params} = req;

            params = transfID(params, 'id');
            const {id:entity_id, entity} =  params;

            query = _.defaults(query, {entity, entity_id}, {limit: 20000}, {page: 1});

            const {limit, page} = query;

            PersistenceServices(Entity)
                .find(query)
                .then((e) => validNotFound(e, e[1], limit, page))
                .then((e) => hateaosTransform(Entity).collectionTransform(e[0], e[1], limit, page))
                .then(e => res.json(e))
                .catch(next);
        },

        create(req, res, next) {
            let {body, params} = req;

            params = transfID(params, 'id');
            const {id:entity_id, entity, user} = _.defaults(params, {user: dUser});

            let tmp = _.assign({body}, {entity, entity_id});

            Promise.all([
                    PersistenceServices(EntityStorage).create(tmp),
                    AuditTrackCharged({entity, entity_id, user}).update({}, body)
                ])
                .then(e => res.status(201).json(e))
                .catch(next);
        },

        update(req, res, next) {
            let {body, params} = req;

            params = transfID(params, 'id');
            const {id:entity_id, entity, user} = _.defaults(params, {user: dUser});

            PersistenceServices(EntityStorage)
                .findOne({entity_id})
                .then(base => {
                    let tmp = _.assign({body}, {entity, entity_id});

                    return Promise.all([
                        PersistenceServices(EntityStorage).update(entity_id, tmp),
                        AuditTrackCharged({entity, entity_id, user}).update(_.get(base, 'body', {}), body)
                    ]);
                })
                .then(e => res.status(204).json(e))
                .catch(next);
        },

        patch(req, res, next) {
            let {body, params} = req;

            params = transfID(params, 'id');
            const {id:entity_id, entity, user} = _.defaults(params, {user: dUser});

            PersistenceServices(EntityStorage)
                .findOne({entity_id})
                .then(base => {
                    let tmp = _.assign({body}, {entity, entity_id});

                    return Promise.all([
                        PersistenceServices(EntityStorage).patch(entity_id, tmp),
                        AuditTrackCharged({entity, entity_id, user}).patch(_.get(base, 'body', {}), body)
                    ]);
                })
                .then(e => res.status(201).json(e))
                .catch(next);
        },

        remove(req, res, next) {
            let {params} = req;

            params = transfID(params, 'id');
            const {id:entity_id, entity, user} = _.defaults(params, {user: dUser});

            AuditTrackCharged({entity, entity_id, user})
                .remove()
                .then(e => res.status(201).json(e))
                .catch(next);
        }
    };
};

module.exports = _.curry(ApplicationAudit);