rtech-struct
Version:
Rtech Platform Superstruct Entity
76 lines (68 loc) • 2.85 kB
JavaScript
const s = require('superstruct')
const Contact = require('./contact').contact
const Address = require('./address').address
const Url = s.define('Url', require('is-url'))
const Integer = s.define('Integer', (value) => {
return typeof value === 'number' && value.toString().match(/^\d+$/) !== null
})
const toZoulouDate = (value) => {
return value.slice(-1) !== 'Z' ? value + 'Z' : value
}
const { ZuluDateTimeStruct } = require('./lib')
const Point = s.object({
arrival_at: s.coerce(ZuluDateTimeStruct, s.string(), toZoulouDate),
departure_at: s.coerce(ZuluDateTimeStruct, s.string(), toZoulouDate),
arrival_at_range: s.optional(s.string()),
departure_at_range: s.optional(s.string()),
address: Address,
contact: s.optional(Contact)
})
const Package = s.object({
shipper: s.size(s.string(), 2, Infinity),
width: s.union([s.number(), s.pattern(s.string(), /^\d+(\.\d+)?$/)]),
length: s.union([s.number(), s.pattern(s.string(), /^\d+(\.\d+)?$/)]),
height: s.union([s.number(), s.pattern(s.string(), /^\d+(\.\d+)?$/)]),
weight: s.union([s.number(), s.pattern(s.string(), /^\d+(\.\d+)?$/)]),
quantity: s.defaulted(s.union([Integer, s.pattern(s.string(), /^\d+$/)]), 1),
status: s.defaulted(
s.enums(['waiting_for_pickup', 'pickup_delayed', 'picked_up', 'delivery_delayed', 'delivered']),
'waiting_for_pickup'
),
reference: s.optional(s.size(s.string(), 1, Infinity)),
track_id: s.defaulted(s.string(), (value) => {
return require('uuid').v4()
}),
stackable: s.defaulted(s.boolean(), false)
})
const Transport = s.object({
id: s.defaulted(s.string(), (value) => {
return require('uuid').v4()
}),
type: s.defaulted(s.pattern(s.string(), /transport/), (value) => {
return 'transport'
}),
key: s.size(s.string(), 8, Infinity),
shippers: s.size(s.array(s.size(s.string(), 2, Infinity)), 1, Infinity),
shippers_name: s.optional(s.size(s.array(s.size(s.string(), 2, Infinity)), 1, Infinity)),
status: s.defaulted(s.enums(['planned', 'cancelled', 'running', 'completed', 'expired']), 'planned'),
timestamp: s.defaulted(ZuluDateTimeStruct, () => new Date().toISOString()),
archived_at: s.optional(ZuluDateTimeStruct),
tracking_url: s.optional(Url),
waybills: s.optional(s.size(s.string(), 8, Infinity)),
creator: s.size(s.string(), 2, Infinity),
starting_point: Point,
destination_point: Point,
packages_loaded: s.size(s.array(Package), 1, Infinity),
vehicle: s.size(s.string(), 2, Infinity),
vehicle_type: s.size(s.string(), 1, Infinity),
vehicle_owner: s.optional(s.size(s.string(), 2, Infinity)),
vehicle_owner_name: s.optional(s.size(s.string(), 2, Infinity)),
vehicle_tracking_provider: s.optional(s.size(s.string(), 3, Infinity))
})
module.exports = {
address: Address,
contact: Contact,
point: Point,
package: Package,
transport: Transport
}