Skip to content

Commit

Permalink
Updated joi models to represent custom _id types.
Browse files Browse the repository at this point in the history
  • Loading branch information
Justin Headley committed Jan 12, 2018
1 parent 608f838 commit 890fc63
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 21 deletions.
24 changes: 20 additions & 4 deletions utilities/joi-mongoose-helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,28 @@ internals.generateJoiReadModel = function (model, Log) {

var associationModel = Joi.object();

var idModel = {};

try {
idModel = internals.generateJoiModelFromFieldType(mongoose.model(association.model).schema.tree._id, Log);
}
catch (error) {
// EXPL: this simplifies testing
if (error.name === 'MissingSchemaError') {
idModel = internals.joiObjectId();
}
else {
throw error;
}
}

if (association.type === "MANY_MANY") {
if (association.linkingModel) {
associationModel = internals.generateJoiReadModel(association.include.through, Log);
}
var associationBase = {};
associationBase[association.model] = Joi.object();
associationBase._id = internals.joiObjectId();
associationBase._id = idModel;
//EXPL: remove the key for the current model
if (associationModel._inner.children) {
associationModel._inner.children = associationModel._inner.children.filter(function(key) {
Expand All @@ -78,7 +92,7 @@ internals.generateJoiReadModel = function (model, Log) {
associationModel = Joi.alternatives().try(associationModel, Joi.object());
}
else if (association.type === "_MANY") {
associationModel = Joi.alternatives().try(internals.joiObjectId(), Joi.object());
associationModel = Joi.alternatives().try(idModel, Joi.object());
}

associationModel = associationModel.label(model.modelName + "_" + associationName + "Model");
Expand Down Expand Up @@ -211,6 +225,8 @@ internals.generateJoiListQueryModel = function (model, Log) {

var sortableFields = queryHelper.getSortableFields(model, Log);

var idModel = internals.generateJoiModelFromFieldType(model.schema.tree._id, Log);

if (queryableFields && readableFields) {
queryModel.$select = Joi.alternatives().try(Joi.array().items(Joi.string().valid(readableFields))
.description('A list of basic fields to be included in each resource. Valid values include: ' + readableFields.toString().replace(/,/g,', ')), Joi.string().valid(readableFields));
Expand All @@ -227,8 +243,8 @@ internals.generateJoiListQueryModel = function (model, Log) {
.description('A set of fields to sort by. Including field name indicates it should be sorted ascending, while prepending ' +
'\'-\' indicates descending. The default sort direction is \'ascending\' (lowest value to highest value). Listing multiple' +
'fields prioritizes the sort starting with the first field listed. Valid values include: ' + sortableFields.toString().replace(/,/g,', ')), Joi.string().valid(sortableFields));
queryModel.$exclude = Joi.alternatives().try(Joi.array().items(internals.joiObjectId())
.description('A list of objectIds to exclude in the result.'), internals.joiObjectId());
queryModel.$exclude = Joi.alternatives().try(Joi.array().items(idModel)
.description('A list of ids to exclude in the result.'), idModel);
queryModel.$count = Joi.boolean()
.description('If set to true, only a count of the query results will be returned.');
if (config.enableWhereQueries) {
Expand Down
55 changes: 38 additions & 17 deletions utilities/rest-helper-factory.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
'use strict';

var Joi = require('joi');
Joi.objectId = require('joi-objectid')(Joi);
var _ = require('lodash');
var assert = require('assert');
var joiMongooseHelper = require('./joi-mongoose-helper');
Expand Down Expand Up @@ -242,6 +241,8 @@ module.exports = function (logger, mongoose, server) {

var readModel = model.readModel || joiMongooseHelper.generateJoiReadModel(model, Log);

var idModel = joiMongooseHelper.generateJoiModelFromFieldType(model.schema.tree._id, Log);

if (!config.enableResponseValidation) {
var label = readModel._flags.label;
readModel = Joi.alternatives().try(readModel, Joi.any()).label(label);
Expand Down Expand Up @@ -292,7 +293,7 @@ module.exports = function (logger, mongoose, server) {
validate: {
query: queryModel,
params: {
_id: Joi.objectId().required()
_id: idModel.required()
},
headers: headersValidation
},
Expand Down Expand Up @@ -511,6 +512,8 @@ module.exports = function (logger, mongoose, server) {
}
}

var idModel = joiMongooseHelper.generateJoiModelFromFieldType(model.schema.tree._id, Log);

var auth = false;

if (config.authStrategy && model.routeOptions.deleteAuth !== false) {
Expand Down Expand Up @@ -562,7 +565,7 @@ module.exports = function (logger, mongoose, server) {
tags: ['api', collectionName],
validate: {
params: {
_id: Joi.objectId().required()
_id: idModel.required()
},
payload: payloadModel,
headers: headersValidation
Expand Down Expand Up @@ -623,12 +626,14 @@ module.exports = function (logger, mongoose, server) {

var handler = HandlerHelper.generateDeleteHandler(model, options, Log);

var idModel = joiMongooseHelper.generateJoiModelFromFieldType(model.schema.tree._id, Log);

var payloadModel = null;
if (config.enableSoftDelete) {
payloadModel = Joi.alternatives().try(Joi.array().items(Joi.object({ _id: Joi.objectId(), hardDelete: Joi.bool().default(false) })), Joi.array().items(Joi.objectId()));
payloadModel = Joi.alternatives().try(Joi.array().items(Joi.object({ _id: idModel, hardDelete: Joi.bool().default(false) })), Joi.array().items(idModel));
}
else {
payloadModel = Joi.array().items(Joi.objectId());
payloadModel = Joi.array().items(idModel);
}

if (!config.enablePayloadValidation) {
Expand Down Expand Up @@ -758,6 +763,8 @@ module.exports = function (logger, mongoose, server) {
readModel = Joi.alternatives().try(readModel, Joi.any()).label(label);
}

var idModel = joiMongooseHelper.generateJoiModelFromFieldType(model.schema.tree._id, Log);

var auth = false;

if (config.authStrategy && model.routeOptions.updateAuth !== false) {
Expand Down Expand Up @@ -816,7 +823,7 @@ module.exports = function (logger, mongoose, server) {
tags: ['api', collectionName],
validate: {
params: {
_id: Joi.objectId().required()
_id: idModel.required()
},
payload: updateModel,
headers: headersValidation
Expand Down Expand Up @@ -893,6 +900,9 @@ module.exports = function (logger, mongoose, server) {
}
}

var ownerIdModel = joiMongooseHelper.generateJoiModelFromFieldType(ownerModel.schema.tree._id, Log);
var childIdModel = joiMongooseHelper.generateJoiModelFromFieldType(childModel.schema.tree._id, Log);

var auth = false;

if (config.authStrategy && ownerModel.routeOptions.associateAuth !== false) {
Expand Down Expand Up @@ -942,8 +952,8 @@ module.exports = function (logger, mongoose, server) {
tags: ['api', associationName, ownerModelName],
validate: {
params: {
ownerId: Joi.objectId().required(),
childId: Joi.objectId().required()
ownerId: ownerIdModel.required(),
childId: childIdModel.required()
},
payload: payloadValidation,
headers: headersValidation
Expand Down Expand Up @@ -1008,6 +1018,9 @@ module.exports = function (logger, mongoose, server) {

var auth = false;

var ownerIdModel = joiMongooseHelper.generateJoiModelFromFieldType(ownerModel.schema.tree._id, Log);
var childIdModel = joiMongooseHelper.generateJoiModelFromFieldType(childModel.schema.tree._id, Log);

if (config.authStrategy && ownerModel.routeOptions.associateAuth !== false) {
auth = {
strategy: config.authStrategy
Expand Down Expand Up @@ -1055,8 +1068,8 @@ module.exports = function (logger, mongoose, server) {
tags: ['api', associationName, ownerModelName],
validate: {
params: {
ownerId: Joi.objectId().required(),
childId: Joi.objectId().required()
ownerId: ownerIdModel.required(),
childId: childIdModel.required()
},
headers: headersValidation
},
Expand Down Expand Up @@ -1114,6 +1127,9 @@ module.exports = function (logger, mongoose, server) {

var handler = HandlerHelper.generateAssociationAddManyHandler(ownerModel, association, options, Log);

var ownerIdModel = joiMongooseHelper.generateJoiModelFromFieldType(ownerModel.schema.tree._id, Log);
var childIdModel = joiMongooseHelper.generateJoiModelFromFieldType(childModel.schema.tree._id, Log);

var payloadValidation;
var label = "";

Expand All @@ -1124,15 +1140,15 @@ module.exports = function (logger, mongoose, server) {
});
label = payloadValidation._flags.label + "_many";
payloadValidation = payloadValidation.keys({
childId: Joi.objectId().description("the " + childModelName + "'s _id")
childId: childIdModel.description("the " + childModelName + "'s _id")
});
payloadValidation = Joi.array().items(payloadValidation);

payloadValidation = Joi.alternatives().try(payloadValidation,
Joi.array().items(Joi.objectId())).label(label || "blank").required();
Joi.array().items(childIdModel)).label(label || "blank").required();
}
else {
payloadValidation = Joi.array().items(Joi.objectId()).required();
payloadValidation = Joi.array().items(childIdModel).required();
}

if (!config.enablePayloadValidation) {
Expand Down Expand Up @@ -1189,7 +1205,7 @@ module.exports = function (logger, mongoose, server) {
tags: ['api', associationName, ownerModelName],
validate: {
params: {
ownerId: Joi.objectId().required()
ownerId: ownerIdModel.required()
},
payload: payloadValidation,
headers: headersValidation
Expand Down Expand Up @@ -1248,7 +1264,10 @@ module.exports = function (logger, mongoose, server) {

var handler = HandlerHelper.generateAssociationRemoveManyHandler(ownerModel, association, options, Log);

var payloadValidation = Joi.array().items(Joi.objectId()).required();
var ownerIdModel = joiMongooseHelper.generateJoiModelFromFieldType(ownerModel.schema.tree._id, Log);
var childIdModel = joiMongooseHelper.generateJoiModelFromFieldType(childModel.schema.tree._id, Log);

var payloadValidation = Joi.array().items(childIdModel).required();

payloadValidation = config.enablePayloadValidation ? payloadValidation : Joi.any();
payloadValidation = payloadValidation.description("An array of _ids to remove.")
Expand Down Expand Up @@ -1302,7 +1321,7 @@ module.exports = function (logger, mongoose, server) {
tags: ['api', associationName, ownerModelName],
validate: {
params: {
ownerId: Joi.objectId().required()
ownerId: ownerIdModel.required()
},
payload: payloadValidation,
headers: headersValidation
Expand Down Expand Up @@ -1373,6 +1392,8 @@ module.exports = function (logger, mongoose, server) {

readModel = readModel.label(ownerModelName + "_" + associationName + "ReadModel");

var ownerIdModel = joiMongooseHelper.generateJoiModelFromFieldType(ownerModel.schema.tree._id, Log);

if (!config.enableResponseValidation) {
var label = readModel._flags.label;
readModel = Joi.alternatives().try(readModel, Joi.any()).label(label);
Expand Down Expand Up @@ -1424,7 +1445,7 @@ module.exports = function (logger, mongoose, server) {
validate: {
query: queryModel,
params: {
ownerId: Joi.objectId().required()
ownerId: ownerIdModel.required()
},
headers: headersValidation
},
Expand Down

0 comments on commit 890fc63

Please sign in to comment.