arrest
Version:
OpenAPI v3 compliant REST framework for Node.js, with support for MongoDB and JSON-Schema
87 lines • 2.91 kB
JavaScript
import _ from 'lodash';
import { ObjectId } from 'mongodb';
import { API } from '../../api.js';
import { addConstraint, escapeMongoObject } from '../util.js';
import { MongoOperation } from './base.js';
export class UpdateMongoOperation extends MongoOperation {
constructor(resource, path, method, id = 'update') {
super(resource, path, method, id);
}
getCustomInfo() {
return {
summary: `Update a ${this.resource.info.name}`,
parameters: [
{
$ref: '#/components/parameters/id',
},
],
requestBody: {
description: `The updated ${this.resource.info.name}, minus the unique identifier and the metatadata`,
content: {
'application/json': {
schema: this.requestSchema,
},
},
required: true,
},
responses: {
'200': {
description: `${this.resource.info.name} successfully updated`,
content: {
'application/json': {
schema: this.responseSchema,
},
},
},
'404': {
$ref: '#/components/responses/notFound',
},
},
};
}
async prepareQuery(job) {
job = await super.prepareQuery(job);
job.query = addConstraint(job.query, this.getItemQuery(job.req.params.id));
return job;
}
async prepareDoc(job) {
let out = _.cloneDeep(job.req.body);
if (this.resource.info.id !== '_id') {
delete out._id;
}
delete out._metadata;
if (job.req.ability) {
out = this.checkAbility(job.req.ability, out);
}
out['' + this.resource.info.id] = this.resource.info.idIsObjectId ? new ObjectId(job.req.params.id) : job.req.params.id;
if (this.resource.info.escapeProperties) {
out = escapeMongoObject(out);
}
job.doc = {
$set: out,
};
return job;
}
async prepareOpts(job) {
job.opts = { returnDocument: 'after' };
return job;
}
async runOperation(job) {
let result = await job.coll.findOneAndUpdate(job.query, job.doc, job.opts);
if (!result.ok || !result.value) {
job.req.logger.error('update failed', result);
API.fireError(404, 'not_found');
}
job.data = result.value;
return job;
}
async redactResult(job) {
job = await super.redactResult(job);
if (this.resource.info.id !== '_id') {
delete job.data['_id'];
}
delete job.data._metadata;
return job;
}
}
//# sourceMappingURL=update.js.map