/** * UpdateMethod * * Copyright (C) TENDIGI, LLC - All Rights Reserved * Unauthorized copying of this file, via any medium is strictly prohibited * Proprietary and confidential * Written by Nick Lee , June 2015 * */ import _ = require('lodash'); import Joi = require('joi'); import Boom = require('boom'); import Constants = require('../../config/constants'); import ResourceMethod = require('./resource_method'); import Resource = require('../resource'); import MethodDescriptor = require('../method_descriptor'); import Model = require('../../db/model'); import Request = require('../request'); import Response = require('../responses/response'); import ErrorResponse = require('../responses/error_response'); class UpdateMethod extends ResourceMethod { // Private members private static endpointValidator = Joi.object({ record: Joi.object({ id: Joi.any().forbidden() }).min(1).unknown().required(), criteria: Joi.object().min(1).unknown().required() }); // Initialization constructor(resource: Resource, descriptor: MethodDescriptor, model: Model) { super(resource, descriptor, model, Constants.HTTPVerb.PATCH); } // Validation validators(): Array { let relationshipValidator = Joi.object({ record: this.relationshipValidations }); return super.validators().concat([UpdateMethod.endpointValidator, relationshipValidator]); } // Route Handler handle(request: Request, callback: (response: Response) => void) { let self = this; let record = request.params['record']; let criteria = request.params['criteria']; this.model.update(criteria, record).then(function(records) { if (_.isEmpty(records)) { let errorMessage = 'No records were found matching your criteria'; let notFound = Boom.notFound(errorMessage); let errorResponse = new ErrorResponse(notFound); callback(errorResponse); } else { let response = new Response(self.resource.name, records); callback(response); } }).catch(function(error) { let errorResponse = new ErrorResponse(error); callback(errorResponse); }); } } export = UpdateMethod;