/
dhl.suma
98 lines (87 loc) · 2.08 KB
/
dhl.suma
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//DHL API reference: https://developer.dhl.com/api-reference/shipment-tracking
profile = "delivery-tracking/shipment-info@1.1"
provider = "dhl"
map ShipmentInfo {
call FetchShipment(
trackingNumber = input.trackingNumber,
carrier = input.carrier) {
return map result if (!outcome.error) outcome.data
return map error {
title = outcome.error.title
}
}
}
operation FetchShipment {
trackingNumber = args.trackingNumber
http GET "/track/shipments" {
security "dhl_api_key"
request {
query {
trackingNumber = trackingNumber
service = args.carrier
}
}
response 200 "application/json" {
shipments = call foreach(shipment of body.shipments) MapShipment(
shipment = shipment,
trackingNumber = trackingNumber
)
return shipments
}
response 404 {
fail {
title = "No shipment with given tracking number found"
}
}
response 401 {
fail {
title = "Invalid api key"
}
}
response 429 {
fail {
title = "Too many requests within defined time period"
}
}
}
}
operation MapShipment {
estimatedDeliveryDate = null
shipment = args.shipment
set if (shipment.estimatedDeliveryDate) {
estimatedDeliveryDate = shipment.estimatedDeliveryDate
}
set {
status = call MapEvent(
event = shipment.status
)
}
set {
events = call foreach(event of shipment.events) MapEvent(
event = event
)
}
return {
trackingNumber = args.trackingNumber
origin = shipment.origin
destination = shipment.destination
status = status
events = events
estimatedDeliveryDate = estimatedDeliveryDate
carrier = shipment.service
}
}
operation MapEvent {
set if(args.event.statusCode === "pre-transit") {
statusCode = "pre_transit"
}
set if(args.event.statusCode !== "pre-transit") {
statusCode = args.event.statusCode
}
return {
timestamp = args.event.timestamp
statusCode = statusCode
statusText = args.event.status
location = args.event.location
}
}