UNPKG

festivals

Version:
258 lines (210 loc) 7.93 kB
'use strict'; var options = require('config'); var logger = require('../logger/logger').logger; var assert = require('assert-plus'); var extend = require('util')._extend; var myRestifyApi = require('my-restify-api'); var BadRequestError = myRestifyApi.error.BadRequestError; var ForbiddenError = myRestifyApi.error.ForbiddenError; var festivalBuilders = require('../domain/builder/festivalBuilders'); var festivals = require('../festivals'); var keen = require('../keen'); var merger = require('../merger'); var cache = require('../cache'); var festivalsModel = require('festivals-model'); var FestivalsCollectionResponseBuilder = festivalsModel.model.festivalsCollectionResponse.FestivalsCollectionResponseBuilder; var SearchFestivalsRequestBuilder = festivalsModel.model.searchFestivalsRequest.SearchFestivalsRequestBuilder; var FestivalNotFoundError = festivalsModel.error.FestivalNotFoundError; var createFestivalV1 = function createFestivalV1(req, res, next) { var festival = null; try { assert.object(req.params, 'params'); festival = festivalBuilders.buildFestivalDomain(req.params, true, req.authorization.bearer.userId); } catch (e) { logger.warn("assert error: ", e); return next(new BadRequestError(e.message)); } festivals.createFestival(festival, {}, function (err/*, result*/) { if (err) { keen.errorFestival('create', req.authorization.bearer, req.params, err); } next.ifError(err); res.send(201, festivalBuilders.buildFestivalResponse(festival)); next(); return cache.purge(req.authorization.credentials, '/api/festivals'); }); }; var updateFestivalV1 = function updateFestivalV1(req, res, next) { try { assert.object(req.params, 'params'); assert.string(req.params.id, 'id'); } catch (e) { logger.warn("assert error: ", e); return next(new BadRequestError(e.message)); } var id = req.params.id; festivals.getFestival(id, options, function (err, festival) { if (err) { keen.errorFestival('update', req.authorization.bearer, req.params, err); } next.ifError(err); if (!festival) { return next(new FestivalNotFoundError('Festival not found')); } if (req.authorization.bearer.userId !== festival.userId) { return next(new ForbiddenError('Unable to update selected festival', 'Brak uprawnień do edycji wybranego festiwalu')); } merger.merge(festival, req.params); if (req.params) { if (req.params.tags !== undefined) { //override tags from input if exists festival.tags = req.params.tags; } } var newFestival = festivalBuilders.buildFestivalDomain(festival, false, req.authorization.bearer.userId); festivals.updateFestival(id, newFestival, {}, function (errFestival/*, result*/) { if (errFestival) { keen.errorFestival('update', req.authorization.bearer, req.params, errFestival); } next.ifError(errFestival); res.send(200, festivalBuilders.buildFestivalResponse(extend(festival, newFestival))); next(); return cache.purge(req.authorization.credentials, '/api/festivals'); }); }); }; var getFestivalsV1 = function getFestivalsV1(req, res, next) { try { assert.optionalString(req.params.name, 'name'); assert.optionalString(req.params.description, 'description'); assert.optionalString(req.params.type, 'type'); assert.optionalString(req.params.status, 'status'); assert.optionalString(req.params.dateFrom, 'dateFrom'); assert.optionalString(req.params.dateTo, 'dateTo'); assert.optionalString(req.params['location.country'], 'location.country'); assert.optionalString(req.params['location.name'], 'location.name'); assert.optionalString(req.params['location.city'], 'location.city'); assert.optionalString(req.params['location.state'], 'location.state'); assert.optionalString(req.params.updatedAt, 'updatedAt'); assert.optionalString(req.params.limit, 'limit'); assert.optionalString(req.params.offset, 'offset'); assert.optionalString(req.params.sort, 'sort'); } catch (e) { logger.warn("assert error: ", e); return next(new BadRequestError(e.message)); } var name = req.params.name; var description = req.params.description; var type = req.params.type; var status = req.params.status; var dateFrom = req.params.dateFrom; var dateTo = req.params.dateTo; var locationCountry = req.params['location.country']; var locationName = req.params['location.name']; var locationCity = req.params['location.city']; var locationState = req.params['location.state']; var updatedAt = req.params.updatedAt; var limit = ~~req.params.limit || 100; var offset = ~~req.params.offset || 0; var sort = req.params.sort; if (type) { type = type.toLowerCase(); } var searchFestivalsRequest = new SearchFestivalsRequestBuilder() .withName(name) .withDescription(description) .withType(type) //.withStatus(status) .withDateFrom(dateFrom) .withDateTo(dateTo) .withLocationCountry(locationCountry) .withLocationName(locationName) .withLocationCity(locationCity) .withLocationState(locationState) .withUpdatedAt(updatedAt) .withLimit(limit) .withOffset(offset) .withSort(sort) .build(); festivals.getFestivals(searchFestivalsRequest, options, function (err, data) { if (err) { keen.errorFestival('search', req.authorization.bearer, req.params, err); } next.ifError(err); var collection = data.festivals .filter(function (festival) { return !status || status=== festival.status; }) .map(function (festival) { return festivalBuilders.buildFestivalResponse(festival); }); var response = new FestivalsCollectionResponseBuilder() .withTotal(data.total) .withFestivals(collection) .build(); res.send(200, response); next(); return keen.festivalsSearch(req.authorization.bearer, req.params); }); }; var getFestivalV1 = function getFestivalV1(req, res, next) { try { assert.object(req.params, 'params'); assert.string(req.params.id, 'id'); } catch (e) { logger.warn("assert error: ", e); return next(new BadRequestError(e.message)); } var id = req.params.id; festivals.getFestival(id, options, function (err, festival) { if (err) { keen.errorFestival('get', req.authorization.bearer, req.params, err); } next.ifError(err); if (!festival) { return next(new FestivalNotFoundError('Festival not found')); } res.send(200, festivalBuilders.buildFestivalResponse(festival)); return next(); }); }; var deleteFestivalV1 = function deleteFestivalV1(req, res, next) { try { assert.object(req.params, 'params'); assert.string(req.params.id, 'id'); } catch (e) { logger.warn("assert error: ", e); return next(new BadRequestError(e.message)); } var id = req.params.id; festivals.getFestival(id, options, function (err, festival) { next.ifError(err); if (!festival) { return next(new FestivalNotFoundError('Festival not found')); } if (req.authorization.bearer.userId !== festival.userId) { return next(new ForbiddenError('Unable to update selected festival', 'Brak uprawnień do usunięcia wybranego festiwalu')); } festivals.deleteFestival(id, options, function (errFestival/*, result*/) { if (errFestival) { keen.errorFestival('delete', req.authorization.bearer, req.params, errFestival); } next.ifError(errFestival); res.send(204, ''); next(); return cache.purge(req.authorization.credentials, '/api/festivals'); }); }); }; module.exports = { createFestivalV1: createFestivalV1, updateFestivalV1: updateFestivalV1, getFestivalsV1: getFestivalsV1, getFestivalV1: getFestivalV1, deleteFestivalV1: deleteFestivalV1 };