From 40f72ac434e4eaf2c9e2dbc8bf7d135c97df0f4c Mon Sep 17 00:00:00 2001 From: Alexander Cerutti Date: Mon, 1 Apr 2019 23:20:36 +0200 Subject: [PATCH] Added support to semantics keys to fields in schema --- src/schema.js | 120 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 110 insertions(+), 10 deletions(-) diff --git a/src/schema.js b/src/schema.js index 76920fc..54271d2 100644 --- a/src/schema.js +++ b/src/schema.js @@ -1,7 +1,7 @@ const Joi = require("joi"); const debug = require("debug")("Schema"); -let instance = Joi.object().keys({ +const instance = Joi.object().keys({ model: Joi.string().required(), certificates: Joi.object().keys({ wwdr: Joi.string().required(), @@ -15,7 +15,7 @@ let instance = Joi.object().keys({ shouldOverwrite: Joi.boolean() }); -let supportedOptions = Joi.object().keys({ +const supportedOptions = Joi.object().keys({ serialNumber: Joi.string(), description: Joi.string(), userInfo: Joi.alternatives(Joi.object().unknown(), Joi.array()), @@ -30,14 +30,14 @@ let supportedOptions = Joi.object().keys({ suppressStripShine: Joi.boolean() }).with("webServiceURL", "authenticationToken"); -let barcode = Joi.object().keys({ +const barcode = Joi.object().keys({ altText: Joi.string(), messageEncoding: Joi.string().default("iso-8859-1"), format: Joi.string().required().regex(/(PKBarcodeFormatQR|PKBarcodeFormatPDF417|PKBarcodeFormatAztec|PKBarcodeFormatCode128)/, "barcodeType"), 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()), changeMessage: Joi.string(), 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"), key: Joi.string().required(), value: Joi.alternatives(Joi.string().allow(""), Joi.number(), Joi.date().iso()).required(), + semantics, // date fields formatters, all optionals dateStyle: Joi.string().regex(/(PKDateStyleNone|PKDateStyleShort|PKDateStyleMedium|PKDateStyleLong|PKDateStyleFull)/, "date style"), 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")), minor: Joi.number().integer().positive().max(65535).less(Joi.ref("major")), proximityUUID: Joi.string().required(), relevantText: Joi.string() }); -let locationsDict = Joi.object().keys({ +const locationsDict = Joi.object().keys({ altitude: Joi.number(), latitude: Joi.number().required(), longitude: Joi.number().required(), relevantText: Joi.string() }); -let passDict = Joi.object().keys({ +const passDict = Joi.object().keys({ auxiliaryFields: Joi.array().items(field), backFields: Joi.array().items(field), headerFields: Joi.array().items(field), @@ -86,14 +87,113 @@ let passDict = Joi.object().keys({ 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), 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, barcode, field,