resource-watch/vocabulary-tag

View on GitHub
app/src/validators/collection.validator.js

Summary

Maintainability
C
7 hrs
Test Coverage
B
85%
const logger = require('logger');
const ErrorSerializer = require('serializers/error.serializer');
const CollectionModel = require('models/collection.model');
const { RESOURCES } = require('app.constants');

class CollectionValidator {

    static async validate(ctx) {
        logger.info('Validating Collection Creation');

        ctx.checkBody('name').notEmpty();
        ctx.checkBody('application').optional().toLow();
        ctx.checkBody('resources').optional().check((data) => {

            logger.debug('entering validation', data);
            if (data) {
                for (let i = 0; i < data.length; i++) {
                    if (
                        !data[i].type
                        || !data[i].id
                        || !RESOURCES.includes(data[i].type)
                    ) { return false; }
                }
            }
            return true;
        });

        if (ctx.errors) {
            logger.debug('errors ', ctx.errors);
            ctx.body = ErrorSerializer.serializeValidationBodyErrors(ctx.errors);
            ctx.status = 400;
            return;
        }

        // App validation
        if (ctx.request.body.application) {
            if (ctx.request.body.loggedUser.extraUserData.apps.indexOf(ctx.request.body.application) <= -1) {
                ctx.throw(403, 'Forbidden');
            }
        } else {
            ctx.request.body.application = 'rw';
        }

        const data = await CollectionModel.findOne({
            name: ctx.request.body.name,
            application: ctx.request.body.application,
            ownerId: ctx.request.body.loggedUser.id,
        });
        if (data) {
            ctx.throw(400, 'Collection duplicated!');
        }
    }

}

module.exports = CollectionValidator;