resource-watch/vocabulary-tag

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

Summary

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

class FavouriteValidator {

    static async validate(ctx) {
        logger.info('Validating Favourite Creation');
        ctx.checkBody('resourceType').notEmpty().in(RESOURCES);
        ctx.checkBody('application').optional().toLow();
        ctx.checkBody('resourceId').notEmpty();
        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 FavouriteModel.findOne({
            resourceType: ctx.request.body.resourceType,
            resourceId: ctx.request.body.resourceId,
            userId: ctx.request.body.loggedUser.id,
            application: ctx.request.body.application
        });
        if (data) {
            ctx.throw(400, 'Favourite duplicated');
        }
    }

}

module.exports = FavouriteValidator;