Added support to semantics keys to fields in schema

This commit is contained in:
Alexander Cerutti
2019-04-01 23:20:36 +02:00
parent ba0322d98c
commit 40f72ac434

View File

@@ -1,7 +1,7 @@
const Joi = require("joi"); const Joi = require("joi");
const debug = require("debug")("Schema"); const debug = require("debug")("Schema");
let instance = Joi.object().keys({ const instance = Joi.object().keys({
model: Joi.string().required(), model: Joi.string().required(),
certificates: Joi.object().keys({ certificates: Joi.object().keys({
wwdr: Joi.string().required(), wwdr: Joi.string().required(),
@@ -15,7 +15,7 @@ let instance = Joi.object().keys({
shouldOverwrite: Joi.boolean() shouldOverwrite: Joi.boolean()
}); });
let supportedOptions = Joi.object().keys({ const supportedOptions = Joi.object().keys({
serialNumber: Joi.string(), serialNumber: Joi.string(),
description: Joi.string(), description: Joi.string(),
userInfo: Joi.alternatives(Joi.object().unknown(), Joi.array()), userInfo: Joi.alternatives(Joi.object().unknown(), Joi.array()),
@@ -30,14 +30,14 @@ let supportedOptions = Joi.object().keys({
suppressStripShine: Joi.boolean() suppressStripShine: Joi.boolean()
}).with("webServiceURL", "authenticationToken"); }).with("webServiceURL", "authenticationToken");
let barcode = Joi.object().keys({ const barcode = Joi.object().keys({
altText: Joi.string(), altText: Joi.string(),
messageEncoding: Joi.string().default("iso-8859-1"), messageEncoding: Joi.string().default("iso-8859-1"),
format: Joi.string().required().regex(/(PKBarcodeFormatQR|PKBarcodeFormatPDF417|PKBarcodeFormatAztec|PKBarcodeFormatCode128)/, "barcodeType"), format: Joi.string().required().regex(/(PKBarcodeFormatQR|PKBarcodeFormatPDF417|PKBarcodeFormatAztec|PKBarcodeFormatCode128)/, "barcodeType"),
message: Joi.string().required() message: Joi.string().required()
}); });
let field = Joi.object().keys({ const field = Joi.object().keys({
attributedValue: Joi.alternatives(Joi.string().allow(""), Joi.number(), Joi.date().iso()), attributedValue: Joi.alternatives(Joi.string().allow(""), Joi.number(), Joi.date().iso()),
changeMessage: Joi.string(), changeMessage: Joi.string(),
dataDetectorType: Joi.array().items(Joi.string().regex(/(PKDataDetectorTypePhoneNumber|PKDataDetectorTypeLink|PKDataDetectorTypeAddress|PKDataDetectorTypeCalendarEvent)/, "dataDetectorType")), dataDetectorType: Joi.array().items(Joi.string().regex(/(PKDataDetectorTypePhoneNumber|PKDataDetectorTypeLink|PKDataDetectorTypeAddress|PKDataDetectorTypeCalendarEvent)/, "dataDetectorType")),
@@ -45,6 +45,7 @@ let field = Joi.object().keys({
textAlignment: Joi.string().regex(/(PKTextAlignmentLeft|PKTextAlignmentCenter|PKTextAlignmentRight|PKTextAlignmentNatural)/, "graphic-alignment"), textAlignment: Joi.string().regex(/(PKTextAlignmentLeft|PKTextAlignmentCenter|PKTextAlignmentRight|PKTextAlignmentNatural)/, "graphic-alignment"),
key: Joi.string().required(), key: Joi.string().required(),
value: Joi.alternatives(Joi.string().allow(""), Joi.number(), Joi.date().iso()).required(), value: Joi.alternatives(Joi.string().allow(""), Joi.number(), Joi.date().iso()).required(),
semantics,
// date fields formatters, all optionals // date fields formatters, all optionals
dateStyle: Joi.string().regex(/(PKDateStyleNone|PKDateStyleShort|PKDateStyleMedium|PKDateStyleLong|PKDateStyleFull)/, "date style"), dateStyle: Joi.string().regex(/(PKDateStyleNone|PKDateStyleShort|PKDateStyleMedium|PKDateStyleLong|PKDateStyleFull)/, "date style"),
ignoreTimeZone: Joi.boolean(), ignoreTimeZone: Joi.boolean(),
@@ -64,21 +65,21 @@ let field = Joi.object().keys({
}), }),
}); });
let beaconsDict = Joi.object().keys({ const beaconsDict = Joi.object().keys({
major: Joi.number().integer().positive().max(65535).greater(Joi.ref("minor")), major: Joi.number().integer().positive().max(65535).greater(Joi.ref("minor")),
minor: Joi.number().integer().positive().max(65535).less(Joi.ref("major")), minor: Joi.number().integer().positive().max(65535).less(Joi.ref("major")),
proximityUUID: Joi.string().required(), proximityUUID: Joi.string().required(),
relevantText: Joi.string() relevantText: Joi.string()
}); });
let locationsDict = Joi.object().keys({ const locationsDict = Joi.object().keys({
altitude: Joi.number(), altitude: Joi.number(),
latitude: Joi.number().required(), latitude: Joi.number().required(),
longitude: Joi.number().required(), longitude: Joi.number().required(),
relevantText: Joi.string() relevantText: Joi.string()
}); });
let passDict = Joi.object().keys({ const passDict = Joi.object().keys({
auxiliaryFields: Joi.array().items(field), auxiliaryFields: Joi.array().items(field),
backFields: Joi.array().items(field), backFields: Joi.array().items(field),
headerFields: Joi.array().items(field), headerFields: Joi.array().items(field),
@@ -86,14 +87,113 @@ let passDict = Joi.object().keys({
secondaryFields: Joi.array().items(field) secondaryFields: Joi.array().items(field)
}); });
let transitType = Joi.string().regex(/(PKTransitTypeAir|PKTransitTypeBoat|PKTransitTypeBus|PKTransitTypeGeneric|PKTransitTypeTrain)/); const transitType = Joi.string().regex(/(PKTransitTypeAir|PKTransitTypeBoat|PKTransitTypeBus|PKTransitTypeGeneric|PKTransitTypeTrain)/);
let nfcDict = Joi.object().keys({ const nfcDict = Joi.object().keys({
message: Joi.string().required().max(64), message: Joi.string().required().max(64),
encryptionPublicKey: Joi.string() encryptionPublicKey: Joi.string()
}); });
let schemas = { /* For a correct usage of semantics, please refer to https://apple.co/2I66Phk */
const semantics = Joi.object().keys({
// All
totalPrice: currencyAmount,
// boarding Passes and Events
duration: Joi.number(),
seats: Joi.array().items(seat),
silenceRequested: Joi.boolean(),
// all boarding passes
departureLocation: location,
destinationLocation: location,
destinationLocationDescription: location,
transitProvider: Joi.string(),
vehicleName: Joi.string(),
vehicleType: Joi.string(),
originalDepartureDate: Joi.string(),
currentDepartureDate: Joi.string(),
originalArrivalDate: Joi.string(),
currentArrivalDate: Joi.string(),
originalBoardingDate: Joi.string(),
currentBoardingDate: Joi.string(),
boardingGroup: Joi.string(),
boardingSequenceNumber: Joi.string(),
confirmationNumber: Joi.string(),
transitStatus: Joi.string(),
transitStatuReason: Joi.string(),
passengetName: personNameComponents,
membershipProgramName: Joi.string(),
membershipProgramNumber: Joi.string(),
priorityStatus: Joi.string(),
securityScreening: Joi.string(),
// Airline Boarding Passes
flightCode: Joi.string(),
airlineCode: Joi.string(),
flightNumber: Joi.number(),
departureAirportCode: Joi.string(),
departureAirportName: Joi.string(),
destinationTerminal: Joi.string(),
destinationGate: Joi.string(),
// Train and Other Rail Boarding Passes
departurePlatform: Joi.string(),
departureStationName: Joi.string(),
destinationPlatform: Joi.string(),
destinationStationName: Joi.string(),
carNumber: Joi.string(),
// All Event Tickets
eventName: Joi.string(),
venueName: Joi.string(),
venueLocation: location,
venueEntrance: Joi.string(),
venuePhoneNumber: Joi.string(),
venueRoom: Joi.string(),
eventType: Joi.string().regex(/(PKEventTypeGeneric|PKEventTypeLivePerformance|PKEventTypeMovie|PKEventTypeSports|PKEventTypeConference|PKEventTypeConvention|PKEventTypeWorkshop|PKEventTypeSocialGathering)/),
eventStartDate: Joi.string(),
eventEndDate: Joi.string(),
artistIDs: Joi.string(),
performerNames: Joi.array().items(Joi.string()),
genre: Joi.string(),
// Sport Event Tickets
leagueName: Joi.string(),
leagueAbbreviation: Joi.string(),
homeTeamLocation: Joi.string(),
homeTeamName: Joi.string(),
homeTeamAbbreviation: Joi.string(),
awayTeamLocation: Joi.string(),
awayTeamName: Joi.string(),
awayTeamAbbreviation: Joi.string(),
sportName: Joi.string(),
// Store Card Passes
balance: currencyAmount
});
const currencyAmount = Joi.object().keys({
currencyCode: Joi.string().required(),
amount: Joi.string().required(),
});
const personNameComponents = Joi.object().keys({
givenName: Joi.string().required(),
familyName: Joi.string().required()
});
const seat = Joi.object().keys({
seatSection: Joi.string(),
seatRow: Joi.string(),
seatNumber: Joi.string(),
seatIdentifier: Joi.string(),
seatType: Joi.string(),
seatDescription: Joi.string()
});
const location = Joi.object().keys({
latitude: Joi.number(),
longitude: Joi.number()
});
// --------- UTILITIES ---------- //
const schemas = {
instance, instance,
barcode, barcode,
field, field,