diff --git a/index.js b/index.js index b218ca1..ae1ef6b 100644 --- a/index.js +++ b/index.js @@ -208,8 +208,14 @@ class Pass { _validateType(passBuffer) { try { let passFile = JSON.parse(passBuffer.toString("utf8")); + let index = this.passTypes.findIndex(passType => passFile.hasOwnProperty(passType)); - return this.passTypes.some(passType => passFile.hasOwnProperty(passType)); + if (index == -1) { + return false; + } + + let type = this.passTypes[index]; + return schema.isValid(passFile[type], schema.constants[(type === "boardingPass" ? "boarding" : "basic") + "Structure"]); } catch (e) { return false; } diff --git a/schema.js b/schema.js index 6a05a09..5063f5e 100644 --- a/schema.js +++ b/schema.js @@ -28,26 +28,36 @@ let field = Joi.object().keys({ textAlignment: Joi.string().regex(/(PKTextAlignmentLeft|PKTextAlignmentCenter|PKTextAlignmentRight|PKTextAlignmentNatural)/, "graphic-alignment"), key: Joi.string().required(), value: Joi.string().required() -}) +}); -let structure = Joi.object().keys({ +let struct = { auxiliaryFields: Joi.array().items(field), backFields: Joi.array().items(field), headerFields: Joi.array().items(field), primaryFields: Joi.array().items(field), - secondaryFields: Joi.array().items(field), - transitType: Joi.string().regex(/(PKTransitTypeAir|PKTransitTypeBoat|PKTransitTypeBus|PKTransitTypeGeneric|PKTransitTypeTrain)/) -}); + secondaryFields: Joi.array().items(field) +}; + +let basicStructure = Joi.object().keys(struct); +let boardingStructure = Joi.object().keys(Object.assign({ + transitType: Joi.string().regex(/(PKTransitTypeAir|PKTransitTypeBoat|PKTransitTypeBus|PKTransitTypeGeneric|PKTransitTypeTrain)/).required() +}, struct)); module.exports = { constants: { instance, barcode, field, - structure + basicStructure, + boardingStructure }, - isValid: (opts, schemaName) => { + isValid: (opts, schemaName, debug = false) => { let validation = Joi.validate(opts, schemaName); + + if (debug) { + console.log(validation) + } + return !validation.error; } };