diff --git a/development/404.html b/development/404.html new file mode 100644 index 00000000..39db7f9d --- /dev/null +++ b/development/404.html @@ -0,0 +1,2743 @@ + + + + + + + + + + + + + + + + + + + + + + + ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/access-delegations/index.html b/development/API-Security/access-delegations/index.html new file mode 100644 index 00000000..b19ebd9f --- /dev/null +++ b/development/API-Security/access-delegations/index.html @@ -0,0 +1,3278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Access Delegations - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Access Delegations

+ +

In ONE Record, parties can grant other parties access to their data (or parts of it). +The ONE Record standard allows parties to change or revoke these access rights to their data whenever they wish.

+

Before an organization can access a LogisticsObject of another organization, it needs to be authorized to do so and the server that hosts the logistics objects will determine whether to grant access. +Typically, when an participant creates a LogisticsObject and makes it available via its ONE Record API, the IoL participant will share the URI of that LogisticsObject with another IoL participant and grant them access by default.

+

For example, a freight forwarder creates a Shipment, grants read access to an airline, and then sends the URI of the Logistics Object via a ONE Record Notification or other channel to the airline.

+

It might happen that the Airline needs access to additional Logistics objects linked to the Shipment (i.e.: Piece). In this case, the Airline MAY request the access delegation directly from the freight forwarder (Example A1)

+

At this point, only the forwarder and the airline can access this specific LogisticsObjects, but no one else.

+

However, if a ground handling agent (GHA) also needs access to this logistics object, the airline MAY request an access delegation for the GHA (Example A2).

+

If, as in this presented scenario, the airline already has a delegation of access to the logistics object, the concept of Trust Chains takes effect.

+
+

Note

+

The party granting access is referred to as the Delegator and the party receiving access is the Delegate. +The party requesting access is referred to as the Requestor.

+
+

Guidelines for Access Delegations in ONE Record:

+ +

Request Access Delegation

+

Endpoint

+
 POST {{baseURL}}/access-delegations
+
+

Request

+

The following HTTP header parameters MUST be present in the request:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExamples
AcceptThe content type that the ONE Record client wants the HTTP response to be formatted in.application/ld+json
Content-TypeThe content type that is contained with the HTTP body. Valid content types.application/ld+json
+

The HTTP request body must contain a valid AccessDelegation object in the format as specified by the Content-Type in the header.

+

The AccessDelegation is a data class of the ONE Record API ontology. +The properties and relationships to other data classes are visualized in the diagram.

+
classDiagram
+    direction LR
+
+    class LogisticsObject{                
+    }
+
+    class Organization{        
+    }  
+    class AccessDelegation{
+        + hasDescription: xsd:string [0..1]
+        + hasPermission[]: Permission [1..*]                
+        + isRequestedFor[]: Organization [1..*]
+        + notifyRequestStatusChange: xsd:boolean = FALSE
+        + hasLogisticsObject[]: LogisticsObject [1..*]        
+    }
+
+    AccessDelegation "1" --> "1..*" Permission   
+    AccessDelegation "1" --> "1..*" Organization: requestedFor
+    AccessDelegation "1" --> "1..*" LogisticsObject
+
+    class Permission{
+        <<Enumeration>>
+        GET_LOGISTICS_EVENT
+        GET_LOGISTICS_OBJECT
+        PATCH_LOGISTICS_OBJECT
+        POST_LOGISTICS_EVENT
+    }    
+

Response

+

A successful request MUST return a HTTP/1.1 201 Created status code and the following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExamples
LocationThe URI of the newly created AccessDelegationRequesthttps://1r.example.com/action-requests/b6c24b63-405c-5cc3-ac88-9b109bb939ba
TypeThe type of the newly created AccessDelegationRequest as a URIhttps://onerecord.iata.org/ns/api#AccessDelegationRequest
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
201Request for delegation was successfulNo response body
400Invalid Access Delegation objectError
401Not authenticatedError
403Not authorized to submit Delegation RequestError
415Unsupported Content TypeError
500Internal Server ErrorError
+

Security

+

To engage with the "Request Access Delegation" endpoint, a client needs proper authentication. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status.

+

Example A1

+

An organization requests an access delegation for itself for the Piece with the URI https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c

+

Request:

+

POST /access-delegations HTTP/1.1
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:AccessDelegation",
+    "api:hasDescription": "Require access to Piece for handling",
+    "api:hasPermission": [{
+            "@id": "api:GET_LOGISTICS_OBJECT"
+        }
+    ],
+    "api:isRequestedFor": [{
+        "@id": "https://1r.example.com/logistics-objects/Airline_XYZ"
+    }],
+    "api:notifyRequestStatusChange": false,
+    "api:hasLogisticsObject": [{
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    }]
+}
+
+(AccessDelegation_example1.json)

+

Response: +

HTTP/1.1 201 Created
+Location: https://1r.example.com/action-requests/b6c24b63-405c-5cc3-ac88-9b109bb939ba
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/api#AccessDelegationRequest
+

+
+

Note

+

The Requestor linked the isRequestedBy property in the created AccessDelegationRequest +and the Delegate linked in the isRequestedFor property in the AccessDelegation are the same.

+
+

Example A2

+

An organization requests an access delegation for a business partner for the Piece with the URI https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c

+

Request:

+

POST /access-delegations HTTP/1.1
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:AccessDelegation",
+    "api:hasDescription": "Our GHA requires read access to Piece for handling",
+    "api:hasPermission": [{
+            "@id": "api:GET_LOGISTICS_OBJECT"
+        }
+    ],
+    "api:isRequestedFor": [{
+        "@id": "https://1r.example.com/logistics-objects/GHA_ABC"
+    }],
+    "api:notifyRequestStatusChange": false,
+    "api:hasLogisticsObject": [{
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    }]
+}
+
+(AccessDelegation_example2.json)

+

Response: +

HTTP/1.1 201 Created
+Location: https://1r.example.com/action-requests/1d2d3807-5dd9-5b5b-acb6-26163a6d7411
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/api#AccessDelegationRequest
+

+
+

Note

+

The Requestor associated with the isRequestedBy property in the created AccessDelegationRequest +is different from the Delegate linked in the isRequestedFor property in the AccessDelegation. The Requestor must be derived from the API authentication mechanism identifying who is making the request.

+
+

Trust Chains

+

Trust chains are based on business partnerships and trust in the transport chain. +It ensures that the company who has shared a logistics object, always knows who MAY access the data and at any time, it can revoke all or part of the chain of trust.

+

Therefore, the concept described in the previous sections can be used by organizations to delegate access to their partners, which become 3rd parties. +In the example above, the airline can request that the forwarder gives access to their ground handler. +The forwarder will grant the access on the basis that they trust the airline who trusts their ground handler.

+

However, if the holder of the logistics object withdraws access delegation to a second party, it MUST be ensured that the third party's access delegation is also withdrawn.

+

See also the section about revoking Action Requests.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/action-requests/index.html b/development/API-Security/action-requests/index.html new file mode 100644 index 00000000..bba48502 --- /dev/null +++ b/development/API-Security/action-requests/index.html @@ -0,0 +1,3888 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Action Requests - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Action Requests

+ +

ONE Record uses a generic action request pattern to support the process of one organization requesting an action that must be approved by another organization. +Examples include SubscriptionRequest, where the subscriber asks the publisher to subscribe him/her on a LogisticsObject; or the ChangeRequest, +where a User of a LogisticsObject submits a Change of a LogisticsObject that must be approved and applied by the Holder of the LogisticsObject.

+

While the creation of Action Requests by submitting Change, Subscription or Access Delegation objects is described in the previous sections, this section describes the managing of Action Requests. +This enables users and holders to view and revoke action requests, and enables holders to change the status of an ActionRequest, i.e. to accept or reject.

+

Guidelines for Action Requests in ONE Record:

+ +

ActionRequest state diagram for AccessDelegationRequest, ChangeRequest, and SubscriptionRequest

+
    stateDiagram-v2
+
+    direction LR   
+
+    [*] --> REQUEST_PENDING
+
+    REQUEST_PENDING --> REQUEST_ACCEPTED: accepted by holder
+    REQUEST_PENDING --> REQUEST_REJECTED: rejected by holder
+    REQUEST_PENDING --> REQUEST_REVOKED: revocation requested
+
+    REQUEST_REVOKED --> [*]
+
+    REQUEST_ACCEPTED --> [*]        
+    REQUEST_ACCEPTED --> REQUEST_FAILED:  an error has occurred        
+
+    REQUEST_FAILED --> [*]
+
+    REQUEST_REJECTED --> [*]    
+

ActionRequest state diagram for VerificationRequest

+
    stateDiagram-v2
+
+    direction LR   
+
+    [*] --> REQUEST_PENDING
+
+    REQUEST_PENDING --> REQUEST_ACKNOWLEDGED: acknowledged by holder
+    REQUEST_PENDING --> REQUEST_REJECTED: rejected by holder
+    REQUEST_PENDING --> REQUEST_REVOKED: revocation requested
+    REQUEST_PENDING --> REQUEST_FAILED: revocation requested
+
+    REQUEST_REVOKED --> [*]      
+
+    REQUEST_FAILED --> [*]
+
+    REQUEST_REJECTED --> [*]    
+
+    REQUEST_ACKNOWLEDGED --> [*]
+

ActionRequest data model

+

The ActionRequest is a data class of the ONE Record API ontology. +The properties and relationships to other data classes are visualized in the following class diagram.

+
    classDiagram
+
+    direction LR   
+
+    class LogisticsObject{                
+    }
+
+    class Organization{        
+    }  
+
+    class AccessDelegation{
+        + hasDescription: xsd:string [0..1]
+        + hasPermission[]: Permission [1..*]                
+        + isRequestedFor[]: Organization [1..*]
+        + notifyRequestStatusChange: xsd:boolean = FALSE
+        + hasLogisticsObject[]: LogisticsObject [1..*]        
+    }
+
+    AccessDelegation "1" --> "1..*" Permission   
+    AccessDelegation "1" --> "1..*" Organization: requestedFor
+    AccessDelegation "1" --> "1..*" LogisticsObject
+
+    class ActionRequest {
+        <<Abstract>>         
+        + hasError[]: Error [*]
+        + isRequestedAt: xsd:dateTime         
+        + isRequestedBy: Organization            
+        + isRevokedBy: Organization [0..1]
+        + hasRequestStatus: RequestStatus = REQUEST_PENDING
+        + isRevokedAt: xsd:dateTime [0..1]                 
+    }
+    ActionRequest <|-- AccessDelegationRequest
+    ActionRequest <|-- ChangeRequest
+    ActionRequest <|-- SubscriptionRequest
+
+    ActionRequest "1" --> "0..*" Error     
+    ActionRequest "1" --> "1..*" Organization : requestedBy    
+    ActionRequest --> RequestStatus                
+    ActionRequest "1" --> "1..*" Organization : revokedBy
+
+    class AccessDelegationRequest{
+        + hasAccessDelegation: AccessDelegation        
+    }
+    AccessDelegationRequest "1" --> "1" AccessDelegation    
+
+    class ChangeRequest{        
+        + hasChange: Change        
+    }    
+    ChangeRequest "1" --> "1" Change
+
+    class SubscriptionRequest{
+        + hasSubscription: Subscription
+    }   
+    SubscriptionRequest "1" --> "1" Subscription
+
+    class VerificationRequest{
+        + hasVerification: Verification
+    }   
+    VerificationRequest"1" --> "1" Verification
+
+    class Change{    
+        + hasDescription: xsd:string [0..1]    
+        + hasOperation[]: Operation [1..*]        
+        + hasLogisticsObject: LogisticsObject
+        + hasRevision: xsd:positiveInteger        
+        + notifyRequestStatusChange: xsd:boolean = FALSE
+    }
+    Change "1" --> "1" LogisticsObject
+    Change "1" --> "1..*" Operation
+
+    class Subscription{        
+        + hasContentType[]: xsd:string [*]
+        + hasDescription: xsd:string [0..1]
+        + expiresAt: xsd:dateTime [0..1]                                
+        + hasSubscriber: Organization        
+        + hasTopicType: TopicType
+        + notifyRequestStatusChange: xsd:boolean = FALSE          
+        + sendLogisticsObjectBody: xsd:boolean = FALSE        
+        + includeSubscriptionEventType[]: SubscriptionEventType [1..*]
+        + hasTopic: xsd:anyURI        
+    }    
+    Subscription "1" --> "1" Organization: hasSubscriber
+    Subscription --> TopicType
+    Subscription "1" --> "1..*" SubscriptionEventType
+
+    class Verification{      
+        + hasLogisticsObject: LogisticsObject
+        + hasError[]: Error[1..*]        
+        + hasRevision: xsd:positiveInteger        
+        + notifyRequestStatusChange: xsd:boolean = FALSE
+    }
+    Verification "1" --> "1" LogisticsObject
+    Verification "1" --> "1..*" Error
+
+    class RequestStatus{
+        <<Enumeration>>
+        REQUEST_PENDING
+        REQUEST_ACCEPTED
+        REQUEST_ACKNOWLEDGED
+        REQUEST_REJECTED
+        REQUEST_FAILED
+        REQUEST_REVOKED        
+    }
+
+    class SubscriptionEventType{
+        <<Enumeration>>
+        LOGISTICS_OBJECT_CREATED
+        LOGISTICS_OBJECT_UPDATED
+
+        LOGISTICS_EVENT_RECEIVED
+    }
+

Get Action Request Details

+

Endpoint

+
 GET {{baseURL}}/action-requests/{{actionRequestId}}
+
+

Request

+

The following HTTP header parameters MUST be present in the request:

+ + + + + + + + + + + + + + + +
HeaderDescriptionExamples
AcceptThe content type that a ONE Record client wants the HTTP response to be formatted in. This SHOULD include the version of the ONE Record API, otherwise the latest supported ONE Record API MAY be applied.
  • application/ld+json
  • application/ld+json; version=2.0.0-dev
  • application/ld+json; version=1.2
+

Response

+

A successful request MUST return a HTTP/1.1 200 OK status code. +The body of the response includes the Action Request in the RDF serialization format that has been requested in the Accept header of the request.

+

The following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
Content-LanguageDescribes the language(s) for which the requested resource is intended.en-US
TypeThe type of the Action Request as a URIhttps://onerecord.iata.org/ns/api#SubscriptionRequest
Last-Modifiedhe date and time of the most recent change to the Action Request. Syntax: Last-Modified: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT. See https://developer.mozilla.org/en-US/docs/Web/Tue, 21 Feb 2023 07:28:00 GMT
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
200The request to retrieve the Action Request has been successfulAction Request
301The URI of the Action Request has permanently changed.No response body
302The URI of the Action Request has temporarily moved.No response body
401Not authenticatedError
403Not authorized to retrieve the Action RequestError
404Action Request not foundError
415Unsupported Content TypeError
500Internal Server ErrorError
+

Security

+

To engage with the "Get Action Request Details" endpoint, a client needs proper authentication and authorization to access the designated resource. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status. Conversely, for requests without proper authorization, a 403 "Not Authorized" response should be provided.

+

Example A1

+

Each SubscriptionRequest MUST have a URI that can be accessed by the requestor (subscriber) +and the publisher to obtain the current status of the request and subscription details.

+

Request:

+
GET /action-requests/599fea49-7287-42af-b441-1fa618d2aaed HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+
+

Response:

+

HTTP/1.1 200 OK
+Content-Type: application/ld+json; version=2.0.0-dev
+Content-Language: en-US
+Location: https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed
+Type: https://onerecord.iata.org/ns/api#SubscriptionRequest
+Last-Modified: Tue, 21 Feb 2023 07:28:00 GMT
+
+{
+    "@context": {
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:SubscriptionRequest",
+    "@id": "https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed",
+    "api:hasSubscription": {
+        "@type": "api:Subscription",
+        "@id": "internal:84891422-0215-519b-b551-bfb41d0519cd",
+        "api:hasContentType": "application/ld+json",
+        "api:hasSubscriber": {
+            "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+        },
+        "api:hasTopicType": {
+            "@id": "api:LOGISTICS_OBJECT_IDENTIFIER"
+        },
+        "api:includeSubscriptionEventType": [
+            {
+                "@id": "api:LOGISTICS_OBJECT_UPDATED"
+            },
+            {
+                "@id": "api:LOGISTICS_OBJECT_CREATED"
+            },
+            {
+                "@id": "api:LOGISTICS_EVENT_RECEIVED"
+            }
+        ],
+        "api:hasTopic": {
+            "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+            "@value": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+        }
+    },
+    "api:isRequestedBy": {
+        "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+    },
+    "api:hasRequestStatus": {
+        "@id": "api:REQUEST_PENDING"
+    },
+    "api:isRequestedAt": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-20T10:38:01.000Z"
+    }
+}
+
+(SubscriptionRequest_example2.json)

+

Example A2

+

After requesting a Verification of a LogisticsObject (see Example A1 in Verifications), the requestor can retrieve the VerificationRequest to check the status.

+

Request: +

GET /action-requests/e4cf1ea5-96fc-4025-be21-159b779e3200 HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+

+

Response:

+

HTTP/1.1 200 OK
+Content-Type: application/ld+json; version=2.0.0-dev
+Content-Language: en-US
+Location: https://1r.example.com/action-requests/e4cf1ea5-96fc-4025-be21-159b779e3200
+Type: https://onerecord.iata.org/ns/api#VerificationRequest
+Last-Modified: Tue, 02 Jul 2024 10:45:00 GMT
+
+{
+    "@context":{
+       "api":"https://onerecord.iata.org/ns/api#"
+    },
+    "@type":"api:VerificationRequest",
+    "@id":"https://1r.example.com/action-requests/e4cf1ea5-96fc-4025-be21-159b779e3200",
+    "api:hasVerification":{
+       "@type":"api:Verification",
+       "api:hasLogisticsObject":{
+          "@id":"https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+       },
+       "api:hasError":[
+          {
+             "@type":"api:Error",
+             "api:hasTitle":"Empty goodsDescription. Please use goodsDescription to specify the description of the cargo",
+             "api:hasErrorDetail":{
+                "@type":"api:ErrorDetail",
+                "api:hasProperty":{
+                   "@value":"https: //onerecord.iata.org/ns/cargo#goodsDescription",
+                   "@type":"xsd:anyURI"
+                }
+             }
+          }
+       ],
+       "api:hasRevision":{
+          "@type":"http: //www.w3.org/2001/XMLSchema#positiveInteger",
+          "@value":"1"
+       },
+       "api:notifyRequestStatusChange":true
+    },
+    "api:isRequestedBy":{
+       "@id":"https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+    },
+    "api:hasRequestStatus":{
+       "@id":"api:REQUEST_PENDING"
+    },
+    "api:isRequestedAt":{
+       "@type":"http://www.w3.org/2001/XMLSchema#dateTime",
+       "@value":"2024-01-20T10:38:01.000Z"
+    }
+ }
+
+(VerificationRequest.json)

+

Update an Action Request

+

This API action can be used the holder/publisher of a Logistics Object to approve or reject a pending ActionRequest.

+

For example, as a publisher, this API action is used to change the status of a received Subscription Request on a ONE Record server using the PATCH HTTP method.

+
+

Note

+

Although the updating the state of of a Subscription Request is specified in the ONE Record API specification, it is not required to expose an API endpoint for this API action to be compliant with the ONE Record standard. +The reason for this is that only the holder of the logistics object MAY accept or reject a subscription request with any business logic or technology.

+

Nevertheless, this API action specification is included for reference, because in many cases, the use of HTTP PATCH is the preferred solution to update resources with REST APIs.

+
+

Endpoint

+
 PATCH {{baseURL}}/action-requests/{{actionRequestId}}
+
+

Request

+

The following query parameters MUST be supported:

+ + + + + + + + + + + + + + + +
Query parameterDescriptionValid values
statusA parameter used to configure the status of an Action request. This operation modifies the status of the Action Request based on the value specified in the status parameter.
  • https://onerecord.iata.org/ns/api#REQUEST_ACCEPTED or REQUEST_ACCEPTED
  • https://onerecord.iata.org/ns/api#REQUEST_REJECTED or REQUEST_REJECTED
  • https://onerecord.iata.org/ns/api#REQUEST_REVOKED or REQUEST_REVOKED
+

The following HTTP header parameters MUST be present in the request:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExamples
AcceptThe content type that a ONE Record client wants the HTTP response to be formatted in. This SHOULD include the version of the ONE Record API, otherwise the latest supported ONE Record API MAY be applied.
  • application/ld+json
  • application/ld+json; version=2.0.0-dev
  • application/ld+json; version=1.2
Content-TypeThe content type that is contained with the HTTP body.
  • application/ld+json
  • application/ld+json; version=2.0.0-dev
  • application/ld+json; version=1.2
+

Response

+

A successful request MUST return a HTTP/1.1 204 No Content status code and the following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
LocationThe URI of the Action Requesthttps://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b
TypeThe type of the Action Request as a URIhttps://onerecord.iata.org/ns/api#ChangeRequest
+

Otherwise, an Error object with ErrorDetail as response body MUST be returned with the following HTTP headers:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
Content-LanguageDescribes the language(s) for which the requested resource is intended.en-US
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
204The Action Request was successfully updatedNo body required
400The update request body is invalidError
401Not authenticatedError
403Not authorized to update the Action RequestError
404Action Request not foundError
415Unsupported Content Type, response when the client sends a PATCH document format that the server does not support for the resource identified by the Request-URI.Error
422Unprocessable request, when the server understands the PATCH document and the syntax of the PATCH document appears to be valid, but the server is incapable of processing the request.Error
500Internal Server ErrorError
+

Security

+

Access to the Action Request update endpoint should be restricted to internal usage only, and it must not be made available to external entities.

+

Example B1

+

Request:

+
PATCH /action-requests/733ed391-ad11-4c02-a2bf-c77ee7997c28?status=https://onerecord.iata.org/ns/api#REQUEST_ACCEPTED HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+

Response:

+
HTTP/1.1 204 No Content
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/api#SubscriptionRequest
+Location: https://1r.example.com/action-requests/733ed391-ad11-4c02-a2bf-c77ee7997c28
+
+

Revoke Action Request

+

This API action MUST be used to revoke an Action Request MUST be revoked only by the original requestor of the ActionRequest or the holder/publisher of the Logistics Object.

+

Endpoint

+
 DELETE {{baseURL}}/action-requests/{{actionRequestId}}
+
+

Request

+

Revoking an Action Rquest does not require any mandatory HTTP headers.

+

Response

+

A successful request MUST return a HTTP/1.1 204 No Content status code.

+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
204The Action Request was successfully deletedNo body required
401Not authenticatedError
403Not authorized to update the Action RequestError
404Action Request not foundError
500Internal Server ErrorError
+

Security

+

To engage with the "Revoke Action Request" endpoint, a client needs proper authentication and authorization to access the designated resource. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status. Conversely, for requests without proper authorization, a 403 "Not Authorized" response should be provided.

+

Example C1

+

Request: +

DELETE /action-requests/449661ee-fecf-465d-8eae-15bdaccb7080 HTTP/1.1
+Host: 1r.example.com
+

+

Response: +

HTTP/1.1 204 No Content
+

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/api-features/index.html b/development/API-Security/api-features/index.html new file mode 100644 index 00000000..673e323f --- /dev/null +++ b/development/API-Security/api-features/index.html @@ -0,0 +1,3002 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Overview - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Overview

+ +

API Features

+

The following features summarize all of the ONE Record API features

+

Get ONE Record Server Information Anyone who has access to a ONE Record server can retrieve the technical server meta information that contains information about supported features, supported ONE Record API version, supported ONE Record data model version, etc.

+

Create and publish a Logistics Object - Anyone who controls a ONE Record server can create a new Logistics Object based on the ONE Record data model specification. Once created the Logistics Object is associated with a unique URI that makes the Logistics Object available on the network.

+

Read a Logistics Object - Logistics Objects can be retrieved by calling the URI of that Logistics Object - its Logistics Object URI. Access rights to that Logistics Object URI is managed by the Holder of the Logistics Object.

+

Update a Logistics Object - As a fundamental principle, only the Holder of a Logistics Object can make changes to it. Therefore, changes required by other parties are expressed as Change Requests that needs to be approved and executed by the actual holder.

+

Subscribe to a Logistics Object for updates - Once a Logistics Object has been created, the holder can propose subscriptions to other parties who will then be notified of any changes. Other parties may also request such a subscription at the discretion of the holder.

+

Create Logistics Event linked with Logistics Objects - Logistics Events like "arrival", "acceptance" etc. are central in the management of logistics and transport. Every participant in the network with sufficient access rights can submit any type of Logistics Event to any published Logistics Object.

+

Read Logistics Event linked to a Logistics Object - Every participant of the network with sufficient permissions, can also query the Logistics Events associated with a Logistics Object.

+

Manage access to a Logistics Object - Another fundamental principle of ONE Record is that only holders of Logistics Objects have fully control access rights to that Logistics Object. Therefore, only the holder of a Logistics Object can delegate permissions to users of the Logistics Object.

+

Delegate access to a Logistics Object to a third party - By default, most Logistics Objects are not public accessible. Most of the time, access is granted to specific parties. Should these parties need to delegate access to further stakeholders - because they require data access to fulfil their logistics activities- then there is a mechanism for requesting such access to the holder of the Logistics Object.

+

Manage and access versions of Logistics Objects - Each time a logistics object is updated by a change in data, this change is recorded in an audit trail. This automatically creates a new version of the Logistics Object. Each version of the logistics object SHOULD be found and retrieved.

+

API security - Although not strictly an API feature, ONE Record specifies security measures for implementation on web servers such that access to the server may be identified, authenticated and authorized.

+

API Endpoints

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP MethodsAPI EndpointAPI Function
GET/Retrieve ServerInformation
POST/logistics-objects/Create Logistics Object. This endpoint could be either internal or not implemented.
GET, PATCH/logistics-objects/{logisticsObjectId}Retrieve Logistics Object and links to related resources
GET/logistics-objects/{logisticsObjectId}/audit-trailRetrieve Audit Trail of a Logistics Object
GET, POST/logistics-objects/{logisticsObjectId}/logistics-eventsCreate or retrieve LogisticsEvents to a Logistics Object
GET/logistics-objects/{logisticsObjectId}/logistics-events/{LogisticsEvent URI}Retrieve a LogisticsEvent
GET, POST/subscriptionsCreate or retrieve Subscription information for a Logistics Object type or a specific LogisticsObjectIdentifier
GET, PATCH, DELETE/action-requestsCreate, retrieve, or update Action Request (i.e. SubscriptionRequests, ChangeRequests or AccessDelegationRequests)
POST/notificationsReceive Notifications
POST/access-delegationsCreate, retrieve, or update Access Delegation Request
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/assets/ONE-Record-API-Class-Diagram/index.html b/development/API-Security/assets/ONE-Record-API-Class-Diagram/index.html new file mode 100644 index 00000000..cc3fff08 --- /dev/null +++ b/development/API-Security/assets/ONE-Record-API-Class-Diagram/index.html @@ -0,0 +1,3000 @@ + + + + + + + + + + + + + + + + + + + + + + + + + ONE Record API Class Diagram - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

ONE Record API Class Diagram

+ +

ONE Record API Class Diagram

+

Version: 2.0.0 Status: Endorsed by COTB on December 2023

+
classDiagram   
+    direction LR   
+
+    class LogisticsObject{                
+    }
+
+    class Organization{        
+    }  
+
+    class AccessDelegation{
+        + hasDescription: xsd:string [0..1]
+        + hasPermission[]: Permission [1..*]                
+        + isRequestedFor[]: Organization [1..*]
+        + notifyRequestStatusChange: xsd:boolean = FALSE
+        + hasLogisticsObject[]: LogisticsObject [1..*]        
+    }
+
+    AccessDelegation "1" --> "1..*" Permission   
+    AccessDelegation "1" --> "1..*" Organization: requestedFor
+    AccessDelegation "1" --> "1..*" LogisticsObject
+
+    class ActionRequest {
+        <<Abstract>>         
+        + hasError[]: Error [*]
+        + isRequestedAt: xsd:dateTime         
+        + isRequestedBy: Organization            
+        + isRevokedBy: Organization [0..1]
+        + hasRequestStatus: RequestStatus = REQUEST_PENDING
+        + isRevokedAt: xsd:dateTime [0..1]                 
+    }
+    ActionRequest <|-- AccessDelegationRequest
+    ActionRequest <|-- ChangeRequest
+    ActionRequest <|-- SubscriptionRequest
+
+    ActionRequest "1" --> "0..*" Error     
+    ActionRequest "1" --> "1..*" Organization : requestedBy    
+    ActionRequest --> RequestStatus                
+    ActionRequest "1" --> "1..*" Organization : revokedBy
+
+    class AccessDelegationRequest{
+        + hasAccessDelegation: AccessDelegation        
+    }
+    AccessDelegationRequest "1" --> "1" AccessDelegation    
+
+    class ChangeRequest{        
+        + hasChange: Change        
+    }
+    ChangeRequest "1" --> "1" LogisticsObject
+    ChangeRequest "1" --> "1" Change
+
+    class SubscriptionRequest{
+        + hasSubscription: Subscription
+    }   
+    SubscriptionRequest "1" --> "1" Subscription
+
+    class AuditTrail{                
+        + hasChangeRequest[]: ChangeRequest [*]                
+        + hasLatestRevision: xsd:positiveInteger       
+    }
+    AuditTrail "1" --> "*" ChangeRequest
+
+    class Change{    
+        + hasDescription: xsd:string [0..1]    
+        + hasOperation[]: Operation [1..*]        
+        + hasLogisticsObject: LogisticsObject
+        + hasRevision: xsd:positiveInteger        
+        + notifyRequestStatusChange: xsd:boolean = FALSE
+    }
+    Change "1" --> "1" LogisticsObject
+    Change "1" --> "1..*" Operation
+
+    class Collection{    
+        + hasItem: Object [0..*]
+        + hasTotalItems: xsd:nonNegativeInteger [0..1]    
+    }
+
+    class Error{        
+        + hasErrorDetail[]: ErrorDetail [1..*]
+        + hasTitle: xsd:string
+    }
+    Error "1" --> "*" ErrorDetail
+
+    class ErrorDetail{
+        + hasCode: xsd:string  [0..1]
+        + hasMessage: xsd:string [0..1]
+        + hasProperty: xsd:anyURI [0..1]
+        + hasResource: xsd:anyURI [0..1]
+    }
+
+    class Notification{
+        + hasChangedProperty[]: xsd:anyURI [*]        
+        + hasEventType: NotificationEventType
+        + isTriggeredBy: ActionRequest [0..1]  
+        + hasLogisticsObject: LogisticsObject [0..1]
+        + hasLogisticsObjectType: xsd:anyURI [0..1]            
+    }
+    Notification "1"--> "0..1" LogisticsObject
+    Notification "1" --> "1" NotificationEventType
+    Notification "1" --> "0..1" ActionRequest    
+
+    class Operation{
+        + o: OperationObject
+        + op: PatchOperation
+        + p: xsd:anyURI
+        + s: xsd:string
+    }
+    Operation "1" --> "1" OperationObject
+    Operation --> PatchOperation
+
+    class OperationObject{
+        + hasDatatype: xsd:anyURI
+        + hasValue: xsd:string   
+    }
+
+    class ServerInformation{
+        + hasDataHolder: Organization                
+        + hasServerEndpoint: xsd:anyURI        
+        + hasSupportedApiVersion[]: xsd:string [1..*]
+        + hasSupportedContentType[]: xsd:string [1..*]        
+        + hasSupportedEncoding[]: xsd:string [*]
+        + hasSupportedLanguage[]: xsd:string [1..*]
+        + hasSupportedOntology[]: xsd:anyURI [1..*]
+        + hasSupportedOntologyVersion[]: xsd:anyURI [1..*]
+    }    
+    ServerInformation "1" --> "1" Organization
+
+    class Subscription{        
+        + hasContentType[]: xsd:string [*]
+        + hasDescription: xsd:string [0..1]
+        + expiresAt: xsd:dateTime [0..1]                                
+        + hasSubscriber: Organization        
+        + hasTopicType: TopicType  
+        + notifyRequestStatusChange: xsd:boolean = FALSE      
+        + sendLogisticsObjectBody: xsd:boolean = FALSE        
+        + includeSubscriptionEventType[]: SubscriptionEventType [1..*]
+        + hasTopic: xsd:anyURI        
+    }    
+    Subscription "1" --> "1" Organization: hasSubscriber
+    Subscription --> TopicType
+    Subscription "1" --> "1..*" SubscriptionEventType
+
+    class NotificationEventType{
+        <<Enumeration>>
+        LOGISTICS_OBJECT_CREATED
+        LOGISTICS_OBJECT_UPDATED
+
+        LOGISTICS_EVENT_RECEIVED
+
+        CHANGE_REQUEST_PENDING
+        CHANGE_REQUEST_ACCEPTED                
+        CHANGE_REQUEST_REJECTED
+        CHANGE_REQUEST_FAILED        
+        CHANGE_REQUEST_REVOKED
+
+
+        ACCESS_DELEGATION_REQUEST_PENDING
+        ACCESS_DELEGATION_REQUEST_ACCEPTED                
+        ACCESS_DELEGATION_REQUEST_REJECTED
+        ACCESS_DELEGATION_REQUEST_FAILED
+        ACCESS_DELEGATION_REQUEST_REVOKED
+
+        SUBSCRIPTION_REQUEST_PENDING
+        SUBSCRIPTION_REQUEST_ACCEPTED                
+        SUBSCRIPTION_REQUEST_REJECTED
+        SUBSCRIPTION_REQUEST_FAILED
+        SUBSCRIPTION_REQUEST_REVOKED
+    }
+    class PatchOperation{
+        <<Enumeration>>
+        ADD
+        DELETE
+    }
+    class Permission{
+        <<Enumeration>>                
+        GET_LOGISTICS_EVENT
+        GET_LOGISTICS_OBJECT
+        PATCH_LOGISTICS_OBJECT        
+        POST_LOGISTICS_EVENT        
+    }
+    class TopicType{
+        <<Enumeration>>
+        LOGISTICS_OBJECT_TYPE
+        LOGISTICS_OBJECT_URI
+    }
+    class RequestStatus{
+        <<Enumeration>>
+        REQUEST_PENDING
+        REQUEST_ACCEPTED
+        REQUEST_REJECTED
+        REQUEST_FAILED
+        REQUEST_REVOKED        
+    }
+    class SubscriptionEventType{
+        <<Enumeration>>
+        LOGISTICS_OBJECT_CREATED
+        LOGISTICS_OBJECT_UPDATED
+
+        LOGISTICS_EVENT_RECEIVED
+    }
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/assets/ONE-Record-API-Collections.postman_collection b/development/API-Security/assets/ONE-Record-API-Collections.postman_collection new file mode 100644 index 00000000..731c489b --- /dev/null +++ b/development/API-Security/assets/ONE-Record-API-Collections.postman_collection @@ -0,0 +1,2253 @@ +{ + "info": { + "_postman_id": "91bb2018-a47d-4110-82e0-4f5c229aa093", + "name": "ONE Record API Collections", + "description": "# ONE Record Example Collection\n\nThis collection contains all the examples described in the ONE Record API specification website([https://iata-cargo.github.io/ONE-Record/](https://))\n\n# Collection Variables\n\nA set of variables has been designed to ease the use of this collections. In order to run any call, please set the following variables according to your setup:\n\n- baseUrl : the url of the ONE Record server (i.e. [https://1r.example.com](https://1r.example.com))\n \n\n# Authentication\n\nIf ONE Record Server implements the authentication, you should add a bearer token for each API call. Please setup the Authorization tab according to your server implementation.", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "28309429", + "_collection_link": "https://crimson-crescent-500945.postman.co/workspace/One-Record-workspace~090d2458-3b0b-4449-8278-184b7711961d/collection/28309429-91bb2018-a47d-4110-82e0-4f5c229aa093?action=share&source=collection_link&creator=28309429" + }, + "item": [ + { + "name": "Server Information", + "item": [ + { + "name": "Server Information", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "" + ] + }, + "description": "This request retrieve the Server Information of the ONE Record server. For more information visit : [ONE Record Server Information](https://iata-cargo.github.io/ONE-Record/server-information/)" + }, + "response": [ + { + "name": "Example A1", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json;charset=UTF-8" + }, + { + "key": "transfer-encoding", + "value": "chunked" + } + ], + "cookie": [], + "body": "" + } + ] + } + ], + "description": "This folder contains the API to integract with ONE Record Server Information" + }, + { + "name": "Logistics Objects", + "item": [ + { + "name": "Create logistics object", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{{Define your json request. See examples}}" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + }, + "description": "This request is used to create a logistics object.\n\n## Examples:\n\nDescription of the examples:\n\n1. Creating a LogisticsObject of type Piece\n \n2. Creating a LogisticsObject of type Company with an embedded Logistics Object of type Person\n \n3. Creating a LogisticsObject of type Shipment that links the previously created Piece.\n\n4. Creating a LogisticsObject of type CustomsInformation\n \n\nNote:\n\nIn order to perform Example A3 please set the variable pieceId to an existing Cargo:Piece object Id" + }, + "response": [ + { + "name": "Example A1", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": \"cargo:Piece\",\n \"cargo:coload\": false,\n \"cargo:handlingInstructions\": [\n {\n \"@type\": \"cargo:HandlingInstructions\", \n \"cargo:handlingInstructionsType\": \"SPH\",\n \"cargo:description\": \"Valuable Cargo\",\n \"cargo:handlingInstructionsTypeCode\": \"VAL\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "status": "Created", + "code": 201, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + }, + { + "name": "Example A2", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": [\n \"cargo:Company\",\n \"cargo:Organization\",\n \"cargo:LogisticsAgent\",\n \"cargo:LogisticsObject\"\n ],\n \"cargo:name\": \"Acme Corporation\",\n \"cargo:shortName\": \"ACME\",\n \"cargo:contactPersons\": [\n {\n \"@type\": [\n \"cargo:Person\",\n \"cargo:Actor\",\n \"cargo:LogisticsAgent\",\n \"cargo:LogisticsObject\"\n ],\n \"cargo:firstName\": \"Jane\",\n \"cargo:lastName\": \"Doe\",\n \"cargo:salutation\": \"Ms\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + }, + { + "name": "Example A3", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": \"cargo:Shipment\",\n \"cargo:goodsDescription\": \"Lots of awesome ONE Record information materials\",\n \"cargo:containedPieces\": [{\n \"@type\": \"cargo:Piece\",\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\n }]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + }, + { + "name": "Example A4", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": \"cargo:CustomsInformation\",\n \"cargo:countryCode\": \"DE\",\n \"cargo:subjectCode\": \"ISS\",\n \"cargo:contentCode\": \"RA\",\n \"cargo:otherCustomsInformation\": \"01234-01\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + } + ] + }, + { + "name": "Get logistics object", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": null + } + ] + }, + "description": "This request is used to get logistics objects.\n\n## Examples\n\nDescription of the examples:\n\n1. Retreive the Piece object previously created\n2. Retreive a not existing Logistics Object\n3. Retreive the Shipment object previously created with the Piece embedded.\n \n\nNote:\n\nIn order to run this example, the variables \"pieceId\" and must have existing logistics objects Id." + }, + "response": [ + { + "name": "Example B1", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + }, + { + "name": "Example B2", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "notExistingLO", + "description": "Simulate a not existing Logistics Object" + } + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + }, + { + "name": "Example B3", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId?embedded=true", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "query": [ + { + "key": "embedded", + "value": "true" + } + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + }, + { + "name": "Update logistics object", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{{Define your json request. See examples}}" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": null + } + ] + }, + "description": "This request is used to update a logistics object\n\n## Examples\n\nDescription of the examples:\n\n1. Modify a Piece object adding a \"goodsDescription\" and changing the \"coload\" from false to true\n2. Add the \"grossWeight\" to a Piece object.\n3. Modify the \"grossWeight\" of a Piece object.\n4. Delete the \"grossWeight\" of a Piece object.\n5. Add two CustomsInformation logistics objects to a Piece object.\n6. Execute a change request where the referenced Logistics Object is different from the one in the URL ( it must return 400 Bad Request)\n7. Execute a change request where the ADD operation uses a disallowed property ( it must return 400 Bad Request)\n \n\nNote:\n\nIn order to have the example working you need to:\n\n- setup the \"pieceId\" variable to an existing Piece Id ( Use the example A1 to create one).\n- setup the \"shipmentId\" to run example C7\n- setup the \"internalNodeId\" to the grossWeight id give by the server (Example C3)\n- setup the hasRevision value according to your revision number\n- setup the customsInformation and customsInformation2 to run Example C5. Use the Example A4 to create CustomsInformation logistics objects" + }, + "response": [ + { + "name": "Example C1", + "originalRequest": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\n \"api\": \"https://onerecord.iata.org/ns/api#\"\n },\n \"@type\": \"api:Change\",\n \"api:hasLogisticsObject\": {\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\n },\n \"api:hasDescription\": \"Update goods description and coload\",\n \"api:hasOperation\": [{\n \"@type\": \"api:Operation\",\n \"api:op\": { \"@id\": \"api:ADD\" },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#goodsDescription\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#string\",\n \"api:hasValue\": \"ONE Record Advertisement Materials\"\n }]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": { \"@id\": \"api:DELETE\" },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#coload\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#boolean\",\n \"api:hasValue\": \"false\"\n }]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": { \"@id\": \"api:ADD\" },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#coload\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#boolean\",\n \"api:hasValue\": \"true\"\n }]\n }\n ],\n \"api:hasRevision\": {\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\n \"@value\": \"1\"\n }\n}\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + }, + { + "name": "Example C2", + "originalRequest": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\n \"api\": \"https://onerecord.iata.org/ns/api#\"\n },\n \"@type\": \"api:Change\",\n \"api:hasLogisticsObject\": {\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\n },\n \"api:hasDescription\": \"Add grossWeight\",\n \"api:hasOperation\": [\n {\n \"@type\": \"api:Operation\",\n \"api:op\": {\n \"@id\": \"api:ADD\"\n },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#grossWeight\",\n \"api:o\": [\n {\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"https://onerecord.iata.org/ns/cargo#Value\",\n \"api:hasValue\": \"_:b0\"\n }\n ]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": {\n \"@id\": \"api:ADD\"\n },\n \"api:s\": \"_:b0\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#unit\",\n \"api:o\": [\n {\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#string\",\n \"api:hasValue\": \"KGM\"\n }\n ]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": {\n \"@id\": \"api:ADD\"\n },\n \"api:s\": \"_:b0\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#value\",\n \"api:o\": [\n {\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#double\",\n \"api:hasValue\": \"20.0\"\n }\n ]\n }\n ],\n \"api:hasRevision\": {\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\n \"@value\": \"2\"\n }\n}\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + }, + { + "name": "Example C3", + "originalRequest": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\n \"api\": \"https://onerecord.iata.org/ns/api#\"\n },\n \"@type\": \"api:Change\",\n \"api:hasLogisticsObject\": {\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\n },\n \"api:hasDescription\": \"Change grossWeight\",\n \"api:hasOperation\": [{\n \"@type\": \"api:Operation\",\n \"api:op\": {\n \"@id\": \"api:DELETE\"\n },\n \"api:s\": \"{{internalNodeId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#value\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#double\",\n \"api:hasValue\": \"20.0\"\n }]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": {\n \"@id\": \"api:ADD\"\n },\n \"api:s\": \"{{internalNodeId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#value\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#double\",\n \"api:hasValue\": \"25.0\"\n }]\n }\n ],\n \"api:hasRevision\": {\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\n \"@value\": \"3\"\n }\n}\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + }, + { + "name": "Example C4", + "originalRequest": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:Change\",\r\n \"api:hasLogisticsObject\": {\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\r\n },\r\n \"api:hasDescription\": \"delete grossWeight\",\r\n \"api:hasOperation\": [{\r\n \"@type\": \"api:Operation\",\r\n \"api:op\": {\r\n \"@id\": \"api:DELETE\"\r\n },\r\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\r\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#grossWeight\",\r\n \"api:o\": [{\r\n \"@type\": \"api:OperationObject\",\r\n \"api:hasDatatype\": \"https://onerecord.iata.org/ns/cargo#Value\",\r\n \"api:hasValue\": \"{{internalNodeId}}\"\r\n }]\r\n },\r\n {\r\n \"@type\": \"api:Operation\",\r\n \"api:op\": {\r\n \"@id\": \"api:DELETE\"\r\n },\r\n \"api:s\": \"{{internalNodeId}}\",\r\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#unit\",\r\n \"api:o\": [{\r\n \"@type\": \"api:OperationObject\",\r\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#string\",\r\n \"api:hasValue\": \"KGM\"\r\n }]\r\n },\r\n {\r\n \"@type\": \"api:Operation\",\r\n \"api:op\": {\r\n \"@id\": \"api:DELETE\"\r\n },\r\n \"api:s\": \"{{internalNodeId}}\",\r\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#value\",\r\n \"api:o\": [{\r\n \"@type\": \"api:OperationObject\",\r\n \"api:hasDatatype\": \"https://www.w3.org/2001/XMLSchema#double\",\r\n \"api:hasValue\": \"20\"\r\n }]\r\n }\r\n ],\r\n \"api:hasRevision\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\r\n \"@value\": \"3\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + }, + { + "name": "Example C5", + "originalRequest": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:Change\",\r\n \"api:hasLogisticsObject\": {\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\r\n },\r\n \"api:hasDescription\": \"add CustomsInformations\",\r\n \"api:hasOperation\": [{\r\n \"@type\": \"api:Operation\",\r\n \"api:op\": {\r\n \"@id\": \"api:ADD\"\r\n },\r\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\r\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#customsInformation\",\r\n \"api:o\": [{\r\n \"@type\": \"api:OperationObject\",\r\n \"api:hasDatatype\": \"https://onerecord.iata.org/ns/cargo#CustomsInformation\",\r\n \"api:hasValue\": \"{{baseUrl}}/logistics-objects/{{customsInformation}}\"\r\n }]\r\n },\r\n {\r\n \"@type\": \"api:Operation\",\r\n \"api:op\": {\r\n \"@id\": \"api:ADD\"\r\n },\r\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\r\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#customsInformation\",\r\n \"api:o\": [{\r\n \"@type\": \"api:OperationObject\",\r\n \"api:hasDatatype\": \"https://onerecord.iata.org/ns/cargo#CustomsInformation\",\r\n \"api:hasValue\": \"{{baseUrl}}/logistics-objects/{{customsInformation2}}\"\r\n }]\r\n }\r\n ],\r\n \"api:hasRevision\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\r\n \"@value\": \"4\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + }, + { + "name": "Example C6", + "originalRequest": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:Change\",\r\n \"api:hasLogisticsObject\": [\r\n {\r\n \"@type\": \"cargo:LogisticsObject\",\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\r\n }\r\n ], \r\n \"api:hasDescription\": \"add CustomsInformations\",\r\n \"api:hasOperation\": [\r\n {\r\n \"@type\": \"api:Operation\",\r\n \"api:op\": { \"@id\": \"api:ADD\" },\r\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\r\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#customsInfos\",\r\n \"api:o\": [\r\n {\r\n \"@type\": \"api:OperationObject\",\r\n \"api:hasDatatype\": \"https://onerecord.iata.org/ns/cargo#CustomsInformation\",\r\n \"api:hasValue\": \"https://1r.example.com/logistics-objects/4d73acf0-3073-4ec9-8aee-b82d64ba3805\"\r\n }\r\n ]\r\n } \r\n ], \r\n \"api:hasRevision\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\r\n \"@value\": \"4\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{shipmentId}}" + } + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + }, + { + "name": "Example C7", + "originalRequest": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:Change\",\r\n \"api:hasLogisticsObject\": [\r\n {\r\n \"@type\": \"cargo:LogisticsObject\",\r\n \"@id\": \"https://1r.example.com/logistics-objects/{{pieceId}}\"\r\n }\r\n ], \r\n \"api:hasDescription\": \"add LogisticsEvent\",\r\n \"api:hasOperation\": [\r\n {\r\n \"@type\": \"api:Operation\",\r\n \"api:op\": { \"@id\": \"api:ADD\" },\r\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\r\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#hasLogisticsEvent\",\r\n \"api:o\": [\r\n {\r\n \"@type\": \"api:OperationObject\",\r\n \"api:hasDatatype\": \"https://onerecord.iata.org/ns/cargo#LogisticsEvent\",\r\n \"api:hasValue\": \"{{baseUrl}}/logistics-objects/{{pieceId}}/logistics-events/c9ab534e-3246-48d3-b34d-bb380bd98af7\"\r\n }\r\n ]\r\n } \r\n ], \r\n \"api:hasRevision\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\r\n \"@value\": \"5\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "_postman_previewlanguage": "Text", + "header": [], + "cookie": [], + "body": "" + } + ] + }, + { + "name": "Get Audit Trail", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/ld+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/audit-trail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "audit-trail" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": null + } + ] + }, + "description": "This request is used to get the Audit Trail of a logistics object.\n\nThe example shows how to get the Audit Trail of a Cargo:Piece. Use the example A1 to create a Piece and add the id on the variable \"pieceId\"" + }, + "response": [ + { + "name": "Example D1", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/ld+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/audit-trail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "audit-trail" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + }, + { + "name": "Retrieve Historical Logistics object", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId?at={{historicalDate}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "query": [ + { + "key": "at", + "value": "{{historicalDate}}" + } + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": null + } + ] + }, + "description": "This request is used to get a Historical logistics object.\nThe example shows how to get an historical version of a Cargo:Piece. Use the example A1 to create a Piece and add the id on the variable \"pieceId\". Then, set \"historicalDate\" to a date following the standard YYYYMMDDThhmmssZ\n" + }, + "response": [ + { + "name": "Example E1", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId?at={{historicalDate}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "query": [ + { + "key": "at", + "value": "{{historicalDate}}" + } + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + } + ], + "description": "This folder contains all the APIs to manipulate logistics objects in ONE Record. For more information visit : [ONE Record Logistics Objects](https://iata-cargo.github.io/ONE-Record/logistics-objects/)" + }, + { + "name": "Logistics Events", + "item": [ + { + "name": "Create a Logistics Event", + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{{Add here your request body. See Examples}}" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": null + } + ] + }, + "description": "This endpoints allows to create Logistics Events.\n\n## Examples\n\nDescription of the examples:\n\n1. Add a Logistics Event on an existing Cargo:Shipment object.\n2. Adding a Logistics Event on a non existing Logistics Object.\n \n\nNote:\n\nIn order to use the examples please set the variable \"shipmentId\" to an existing Shipment Logistics Object and the variable \"companyId\" to an existing Company Logistics Object (See example Logistics Objects- Example A2 and Example A3)" + }, + "response": [ + { + "name": "Example A1", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\r\n },\r\n \"@type\": \"cargo:LogisticsEvent\",\r\n \"cargo:creationDate\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\r\n \"@value\": \"2023-04-01T10:38:01.000Z\"\r\n },\r\n \"cargo:eventDate\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\r\n \"@value\": \"2023-04-01T10:38:01.000Z\"\r\n },\r\n \"cargo:eventCode\": {\r\n \"@type\": \"cargo:CodeListElement\",\r\n \"cargo:code\": \"DEP\",\r\n \"cargo:codeListName\": \"Departure\"\r\n },\r\n \"cargo:eventName\": \"Consignment departed on a specific flight\",\r\n \"cargo:eventTimeType\": {\r\n \"@id\": \"cargo:ACTUAL\",\r\n \"@type\": \"cargo:EventTimeType\"\r\n },\r\n \"cargo:partialEventIndicator\": false,\r\n \"cargo:eventFor\": {\r\n \"@type\": \"cargo:Shipment\",\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{shipmentId}}\"\r\n },\r\n \"cargo:recordingOrganization\": {\r\n \"@type\": \"cargo:Company\",\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{companyId}}\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + }, + { + "name": "Example A2", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\r\n },\r\n \"@type\": \"cargo:LogisticsEvent\",\r\n \"cargo:creationDate\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\r\n \"@value\": \"2023-04-01T10:38:01.000Z\"\r\n },\r\n \"cargo:eventDate\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\r\n \"@value\": \"2023-04-01T10:38:01.000Z\"\r\n },\r\n \"cargo:eventCode\": {\r\n \"@type\": \"cargo:CodeListElement\",\r\n \"cargo:code\": \"DEP\",\r\n \"cargo:codeListName\": \"Departure\"\r\n },\r\n \"cargo:eventName\": \"Consignment departed on a specific flight\",\r\n \"cargo:eventTimeType\": {\r\n \"@id\": \"cargo:ACTUAL\",\r\n \"@type\": \"cargo:EventTimeType\"\r\n },\r\n \"cargo:partialEventIndicator\": false,\r\n \"cargo:linkedObject\": {\r\n \"@type\": \"cargo:Shipment\",\r\n \"@id\": \"Test\"\r\n },\r\n \"cargo:recordedBy\": {\r\n \"@type\": \"cargo:Company\",\r\n \"@id\": \"Test\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "NotExistingLO", + "description": "Setup to not existing logistics object" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + }, + { + "name": "Get a Logistics Event", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events/:logisticsEventId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events", + ":logisticsEventId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": null + }, + { + "key": "logisticsEventId", + "value": null + } + ] + }, + "description": "This endpoints allows to get Logistics Events.\n\n## Examples\n\nDescription of the examples:\n\n1. Get an existing Logistics Event\n2. Get a non exiting Logistics Event\n \n\nNote:\n\nIn order to use the examples please set the variable \"shipmentId\" to an existing Shipment Logistics Object ( See Logistics Object - Example A3 ) and set the variable \"LEId\" to an existing Logistics Event (See example Logistics Event - Example A1)" + }, + "response": [ + { + "name": "Example B1", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events/:logisticsEventId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events", + ":logisticsEventId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + }, + { + "key": "logisticsEventId", + "value": "{{LEId}}" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + }, + { + "name": "Example B2", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events/:logisticsEventId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events", + ":logisticsEventId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{pieceId}}" + }, + { + "key": "logisticsEventId", + "value": "notExisingLE", + "description": "Setup to not exiting Logistics Event" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + }, + { + "name": "Get a Logistics Event of a Logistics Object", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events/", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events", + "" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": null + } + ] + }, + "description": "This endpoints allows to get Logistics Events.\n\n## Examples\n\nDescription of the examples:\n\n1. Get all Logistics Event of a Shipment Logistics Object\n2. Get all Logistics Event filtered by Event Type of a Shipment Logistics Object\n \n\nNote:\n\nIn order to use the examples please set the variable \"shipmentId\" to an existing Shipment Logistics Object ( See Logistics Object - Example A3 )" + }, + "response": [ + { + "name": "Example C1", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events/", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events", + "" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + }, + { + "name": "Example C2", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events/?eventType=DEP", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events", + "" + ], + "query": [ + { + "key": "eventType", + "value": "DEP" + } + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + } + ] + }, + { + "name": "Subscriptions", + "item": [ + { + "name": "Get Subscription", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/subscriptions?topicType={{logisticsObjectType}}&topic={{logisticsObjectOrLogisticsObjectType}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ], + "query": [ + { + "key": "topicType", + "value": "{{logisticsObjectType}}", + "description": "Used by the publisher to specify if Subscription information for a specific Logistics Object or a data class should be in the response body.\nExample: \n- https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_IDENTIFIER\n- https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_TYPE" + }, + { + "key": "topic", + "value": "{{logisticsObjectOrLogisticsObjectType}}", + "description": "Used by the publisher to specify the data class or Logistics Object URI the Subscription information should be related to. topic MUST be a valid URI\nExample: \n- https://onerecord.iata.org/ns/cargo#Piece\n- https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + } + ] + }, + "description": "This endpoints allows to get Subscription. \n \n## Examples \nDescription of the examples:\n\n1. Request subscription information for specific Logistics Object URI.\n2. Request subscription information for a Logistics Object type\n3. Request subscription information for a not supported Logistics Object type\n4. Required parameter \"topic=\" is missing in the HTTP query parameters. \n Note: \n In order to use the examples please set the variable \"pieceId\" to an existing Piece Logistics Object ( See Logistics Object - Example A1 )" + }, + "response": [ + { + "name": "Example A1", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_IDENTIFIER&topic={{pieceId}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ], + "query": [ + { + "key": "topicType", + "value": "https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_IDENTIFIER" + }, + { + "key": "topic", + "value": "{{pieceId}}" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + }, + { + "name": "Example A2", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE&topic=https://onerecord.iata.org/ns/cargo%23Shipment", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ], + "query": [ + { + "key": "topicType", + "value": "https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE" + }, + { + "key": "topic", + "value": "https://onerecord.iata.org/ns/cargo%23Shipment" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + }, + { + "name": "Example A3", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE&topic=https://onerecord.iata.org/ns/cargo%23ForkLift", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ], + "query": [ + { + "key": "topicType", + "value": "https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE" + }, + { + "key": "topic", + "value": "https://onerecord.iata.org/ns/cargo%23ForkLift" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + }, + { + "name": "Example A4", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ], + "query": [ + { + "key": "topicType", + "value": "https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + }, + { + "name": "Subscribe to Logistics Objects", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{{Add a response body. See examples}}" + }, + "url": { + "raw": "{{baseUrl}}/subscriptions", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ] + }, + "description": "This endpoints allows to subscribe to a Logistics Object or a type of logistics objects .\n\n## Examples\n\nDescription of the examples:\n\n1. Subscribe to a specific Logistics Object\n2. Subscribe to all Shipment Logistics Objects\n \n\nNote: \nIn order to use the examples please set the variable \"pieceId\" to an existing Piece Logistics Object and \"companyId\" to an existing Company LO ( See Logistics Object - Example A1 and A2)" + }, + "response": [ + { + "name": "Example B1", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:Subscription\",\r\n \"api:hasContentType\": \"application/ld+json\",\r\n \"api:hasSubscriber\": {\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{companyId}}\"\r\n },\r\n \"api:hasTopicType\": {\r\n \"@id\": \"api:LOGISTICS_OBJECT_IDENTIFIER\"\r\n },\r\n \"api:includeSubscriptionEventType\": [\r\n {\r\n \"@id\": \"api:LOGISTICS_OBJECT_UPDATED\"\r\n },\r\n {\r\n \"@id\": \"api:LOGISTICS_OBJECT_CREATED\"\r\n },\r\n {\r\n \"@id\": \"api:LOGISTICS_EVENT_RECEIVED\"\r\n }\r\n ],\r\n \"api:hasTopic\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#anyURI\",\r\n \"@value\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/subscriptions", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + }, + { + "name": "Example B2", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:Subscription\",\r\n \"api:hasContentType\": \"application/ld+json\",\r\n \"api:hasSubscriber\": {\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{companyId}}\"\r\n },\r\n \"api:hasTopicType\": {\r\n \"@id\": \"api:LOGISTICS_OBJECT_TYPE\"\r\n },\r\n \"api:includeSubscriptionEventType\": [\r\n {\r\n \"@id\": \"api:LOGISTICS_OBJECT_UPDATED\"\r\n },\r\n {\r\n \"@id\": \"api:LOGISTICS_OBJECT_CREATED\"\r\n },\r\n {\r\n \"@id\": \"api:LOGISTICS_EVENT_RECEIVED\"\r\n }\r\n ],\r\n \"api:hasTopic\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#anyURI\",\r\n \"@value\": \"https://onerecord.iata.org/ns/cargo#Shipment\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/subscriptions", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + } + ] + }, + { + "name": "Access Delegations", + "item": [ + { + "name": "Request Access Delegation", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{{Add here your request body. See Examples}}" + }, + "url": { + "raw": "{{baseUrl}}/access-delegations", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "access-delegations" + ] + }, + "description": "This endpoints allows to subscribe request Access Delegation on a Logistics Object.\n\n## Examples\n\nDescription of the examples:\n\n1. An organization requests an access delegation for a specific Piece Logistics Object\n2. An organization requests an access delegation for a business partner on a specific Piece Logistics Object\n \n\nNote: \nIn order to use the examples please set the variable \"pieceId\" to an existing Piece Logistics Object ( See Logistics Object - Example A1 ) and \"companyId\" and \"internalCompanyId\" to an existing Company Logistics Object. The \"internalCompanyID\" should be set to the company owning the server which will send the request." + }, + "response": [ + { + "name": "Example A1", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:AccessDelegation\",\r\n \"api:hasDescription\": \"Our GHA requires read access to Piece for handling\",\r\n \"api:hasPermission\": [{\r\n \"@id\": \"api:GET_LOGISTICS_OBJECT\"\r\n }\r\n ],\r\n \"api:isRequestedFor\": [{\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{internalCompanyId}}\"\r\n }],\r\n \"api:notifyRequestStatusChange\": false,\r\n \"api:hasLogisticsObject\": [{\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\r\n }]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/access-delegations", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "access-delegations" + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + }, + { + "name": "Example A2", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:AccessDelegation\",\r\n \"api:hasDescription\": \"Our GHA requires read access to Piece for handling\",\r\n \"api:hasPermission\": [{\r\n \"@id\": \"api:GET_LOGISTICS_OBJECT\"\r\n }\r\n ],\r\n \"api:isRequestedFor\": [{\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{companyId}}\"\r\n }],\r\n \"api:notifyRequestStatusChange\": false,\r\n \"api:hasLogisticsObject\": [{\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\r\n }]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/access-delegations", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "access-delegations" + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + } + ] + }, + { + "name": "Action Requests", + "item": [ + { + "name": "Get Action Request Details", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/action-requests/:actionRequestId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":actionRequestId" + ], + "variable": [ + { + "key": "actionRequestId", + "value": null + } + ] + }, + "description": "This endpoints allows to get details of a specific Action Request\n\n## Examples\n\nDescription of the examples:\n\n1. Get details about a Subscription Request\n \n\nNote: \nIn order to use the examples please set the variable \"ARId\" to an existing Subscription Request. To create a Subscription Request use the Example B1 or B2 in Subscriptions." + }, + "response": [ + { + "name": "Example A1", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/action-requests/:actionRequestId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":actionRequestId" + ], + "variable": [ + { + "key": "actionRequestId", + "value": "{{ARId}}" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + }, + { + "name": "Update an Action Request", + "request": { + "method": "PATCH", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/action-requests/{{actionRequestId}}?status={{acStatus}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + "{{actionRequestId}}" + ], + "query": [ + { + "key": "status", + "value": "{{acStatus}}" + } + ] + }, + "description": "This endpoints allows to update a specific Action Request\n\n## Examples\n\nDescription of the examples:\n\n1. Update a Subscription Request\n \n\nNote: \nIn order to use the examples please set the variable \"ARId\" to an existing Subscription Request. To create a Subscription Request use the Example B1 or B2 in Subscriptions." + }, + "response": [ + { + "name": "Example B1", + "originalRequest": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/action-requests/:actionRequestId?status=https://onerecord.iata.org/ns/api%23REQUEST_ACCEPTED", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":actionRequestId" + ], + "query": [ + { + "key": "status", + "value": "https://onerecord.iata.org/ns/api%23REQUEST_ACCEPTED" + } + ], + "variable": [ + { + "key": "actionRequestId", + "value": "{{ARId}}" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + }, + { + "name": "Revoke Action Request", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{baseUrl}}/action-requests/{{actionRequestId}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + "{{actionRequestId}}" + ] + }, + "description": "This endpoints allows to delete a specific Action Request\n\n## Examples\n\nDescription of the examples:\n\n1. Delete a Subscription Request\n \n\nNote: \nIn order to use the examples please set the variable \"ARId\" to an existing Subscription Request. To create a Subscription Request use the Example B1 or B2 in Subscriptions." + }, + "response": [ + { + "name": "Example C1", + "originalRequest": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{baseUrl}}/action-requests/:actionRequestId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":actionRequestId" + ], + "variable": [ + { + "key": "actionRequestId", + "value": "{{ARId}}" + } + ] + } + }, + "_postman_previewlanguage": null, + "header": null, + "cookie": [], + "body": null + } + ] + } + ] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "baseUrl", + "value": "http://localhost:8080", + "type": "string" + }, + { + "key": "pieceId", + "value": "7c24adc7-b334-45a4-9bb2-8c2421e62979", + "type": "string" + }, + { + "key": "companyId", + "value": "f22976dc-676d-472e-bd28-24604ed082dd", + "type": "string" + }, + { + "key": "shipmentId", + "value": "a76e06f0-0662-4602-817e-9ee4fac82b35", + "type": "string" + }, + { + "key": "internalNodeId", + "value": "neone:21312", + "type": "string" + }, + { + "key": "historicalDate", + "value": "20230807T143832Z", + "type": "string" + }, + { + "key": "LEId", + "value": "61454dfe-94c7-4659-b324-e0d7f45b50e6", + "type": "string" + }, + { + "key": "ARId", + "value": "ee31870a-b4c3-4e8e-938c-a7d098592dba", + "type": "string" + }, + { + "key": "customsInformation", + "value": "1ef90d88-fa69-432b-af2b-815d7071625c", + "type": "string" + }, + { + "key": "customsInformation2", + "value": "1ef90d88-fa69-432b-af2b-815d7071626c", + "type": "string" + } + ] +} \ No newline at end of file diff --git a/development/API-Security/assets/ONE-Record-API-Ontology.csv b/development/API-Security/assets/ONE-Record-API-Ontology.csv new file mode 100644 index 00000000..b717dc44 --- /dev/null +++ b/development/API-Security/assets/ONE-Record-API-Ontology.csv @@ -0,0 +1,50 @@ +Deprecated; OWL Class;OWL Property; Data Type; Cardinality; Allowed Values; Description +False;https://onerecord.iata.org/ns/api#DelegationRequest;https://onerecord.iata.org/ns/api#action;http://www.w3.org/2001/XMLSchema#string;0..1;DELEGATE,REVOKE;REVOKE or DELEGATE +False;https://onerecord.iata.org/ns/api#ChangeRequest;https://onerecord.iata.org/ns/api#callbackUrl;http://www.w3.org/2001/XMLSchema#anyURI;0..1;;Callback URL to be used where the subscriber receives Notifications +False;https://onerecord.iata.org/ns/api#Notification;https://onerecord.iata.org/ns/api#changedProperties;http://www.w3.org/2001/XMLSchema#anyURI;0..N;;List of all changed properties as IRIs after a ChangeRequest was successfully applied, e.g. [https://onerecord.iata.org/ns/cargo#volumetricWeight, https://onerecord.iata.org/ns/cargo#goodsDescription] +False;https://onerecord.iata.org/ns/api#ErrorDetail;https://onerecord.iata.org/ns/api#code;http://www.w3.org/2001/XMLSchema#string;0..1;;Error code is a numeric or alphanumeric code that can be used to determine the source of the error and why it occured. +False;https://onerecord.iata.org/ns/api#Subscription;https://onerecord.iata.org/ns/api#contentTypes;http://www.w3.org/2001/XMLSchema#string;0..N;;Content types that the subscriber wants to receive in the notifications, e.g. application/ld+json +False;https://onerecord.iata.org/ns/api#ServerInformation;https://onerecord.iata.org/ns/api#dataHolder;https://onerecord.iata.org/ns/cargo#Organization;0..1;;Organization Identifier that links the Holder of the data hosted on the ONE Record server +False;https://onerecord.iata.org/ns/api#OperationObject;https://onerecord.iata.org/ns/api#datatype;http://www.w3.org/2001/XMLSchema#anyURI;0..1;;Data type of the field to update, must be a valid URI, e.g. http://www.w3.org/2001/XMLSchema#int +False;https://onerecord.iata.org/ns/api#DelegationRequest;https://onerecord.iata.org/ns/api#delegates;https://onerecord.iata.org/ns/cargo#Organization;0..N;;Organization Identifier of the Organization that should receive the delegated permissions +False;https://onerecord.iata.org/ns/api#DelegationRequest;https://onerecord.iata.org/ns/api#description;http://www.w3.org/2001/XMLSchema#string;0..1;;Reason for the request (optional) +False;https://onerecord.iata.org/ns/api#Notification;https://onerecord.iata.org/ns/api#eventType;http://www.w3.org/2001/XMLSchema#string;0..1;CHANGE_REQUEST_ACCEPTED,CHANGE_REQUEST_FAILED,CHANGE_REQUEST_PENDING,CHANGE_REQUEST_REJECTED,DELEGATION_REQUEST_ACCEPTED,DELEGATION_REQUEST_FAILED,DELEGATION_REQUEST_PENDING,DELEGATION_REQUEST_REJECTED,LOGISTICS_EVENT_RECEIVED,LOGISTICS_OBJECT_CREATED,LOGISTICS_OBJECT_UPDATED,SUBSCRIPTION_REQUEST_ACCEPTED,SUBSCRIPTION_REQUEST_FAILED,SUBSCRIPTION_REQUEST_PENDING,SUBSCRIPTION_REQUEST_REJECTED;LOGISTICS_OBJECT_CREATED, LOGISTICS_OBJECT_UPDATED, LOGISTICS_EVENT_RECEIVED, CHANGE_REQUEST_PENDING, CHANGE_REQUEST_ACCEPTED, CHANGE_REQUEST_REJECTED, CHANGE_REQUEST_FAILED +False;https://onerecord.iata.org/ns/api#Subscription;https://onerecord.iata.org/ns/api#expiresAt;http://www.w3.org/2001/XMLSchema#dateTime;0..1;;Expiry date as date time of the subscription information that supports caching but does not require the ONE Record client to store the datetime when the Subscription object was received, if not given: the information does not expire +False;https://onerecord.iata.org/ns/api#ChangeRequest;https://onerecord.iata.org/ns/api#hasError;https://onerecord.iata.org/ns/api#Error;0..N;;Error object(s) if the processing was not successful +False;https://onerecord.iata.org/ns/api#Error;https://onerecord.iata.org/ns/api#hasErrorDetail;https://onerecord.iata.org/ns/api#ErrorDetail;0..N;;Error details +False;https://onerecord.iata.org/ns/api#Notification;https://onerecord.iata.org/ns/api#hasLogisticsObject;https://onerecord.iata.org/ns/cargo#LogisticsObject;0..1;;Link to the related LogisticsObject +False;https://onerecord.iata.org/ns/api#ChangeRequest;https://onerecord.iata.org/ns/api#hasOperation;https://onerecord.iata.org/ns/api#Operation;1..N;;Operation(s) to apply as PATCH on a Logistics Object +False;https://onerecord.iata.org/ns/api#SubscriptionRequest;https://onerecord.iata.org/ns/api#hasSubscription;https://onerecord.iata.org/ns/api#Subscription;0..1;;Contains a list links to the requestors Subscription objects with all subscription information +False;https://onerecord.iata.org/ns/api#AuditTrail;https://onerecord.iata.org/ns/api#latestRevision;http://www.w3.org/2001/XMLSchema#positiveInteger;0..1;;Latest revision of the Logistics Object. Starting with revision 0 +False;https://onerecord.iata.org/ns/api#ErrorDetail;https://onerecord.iata.org/ns/api#message;http://www.w3.org/2001/XMLSchema#string;0..1;;Message that describes the error +False;https://onerecord.iata.org/ns/api#Operation;https://onerecord.iata.org/ns/api#o;n8238ebcaaba547eb984dc94af5ca9d8eb109;0..1;;PATCH object to modify +False;https://onerecord.iata.org/ns/api#Operation;https://onerecord.iata.org/ns/api#op;n8238ebcaaba547eb984dc94af5ca9d8eb20;0..1;ADD,DELETE;Operation objects must have exactly one op (operation) member, this value indicates which operation is to be performed. The value must be one of ADD or DELETE, all other values result in an error +False;https://onerecord.iata.org/ns/api#Operation;https://onerecord.iata.org/ns/api#p;http://www.w3.org/2001/XMLSchema#anyURI;0..1;;Operations objects must have exactly one p, predicate, member. The value of this member must be an URI, e.g. https://onerecord.iata.org/ns/cargo#goodsDescription +False;https://onerecord.iata.org/ns/api#DelegationRequest;https://onerecord.iata.org/ns/api#permissions;http://www.w3.org/2001/XMLSchema#string;0..N;GET,PATCH;GET or PATCH +False;https://onerecord.iata.org/ns/api#ErrorDetail;https://onerecord.iata.org/ns/api#property;http://www.w3.org/2001/XMLSchema#anyURI;0..1;;Property of the object for which the error applies in IRI format, i.e. https://onerecord.iata.org/ns/cargo#volumetricWeight +False;https://onerecord.iata.org/ns/api#AuditTrail;https://onerecord.iata.org/ns/api#recordsChangeRequest;https://onerecord.iata.org/ns/api#ChangeRequest;0..N;;Recorded change requests in the Audit Trail of a Logistics Object +False;https://onerecord.iata.org/ns/api#DelegationRequest;https://onerecord.iata.org/ns/api#requestedAt;http://www.w3.org/2001/XMLSchema#dateTime;0..1;;Datetime when the request was created +False;https://onerecord.iata.org/ns/api#ChangeRequest;https://onerecord.iata.org/ns/api#requestedBy;https://onerecord.iata.org/ns/cargo#Organization;0..1;;Organization Identifier that represents the Organization that has requested +False;https://onerecord.iata.org/ns/api#ErrorDetail;https://onerecord.iata.org/ns/api#resource;http://www.w3.org/2001/XMLSchema#anyURI;0..1;;URI of the object where the error occurred +False;https://onerecord.iata.org/ns/api#ChangeRequest;https://onerecord.iata.org/ns/api#revision;http://www.w3.org/2001/XMLSchema#positiveInteger;0..1;;Revision number of the Logistics Object, starting with 0 for changing the initial revision of a Logistics Object +False;https://onerecord.iata.org/ns/api#Operation;https://onerecord.iata.org/ns/api#s;http://www.w3.org/2001/XMLSchema#string;0..1;;Operation objects MUST have exactly one "s", subject, member. The value of this member MUST be one of IRI or blank node. +False;https://onerecord.iata.org/ns/api#Subscription;https://onerecord.iata.org/ns/api#secret;http://www.w3.org/2001/XMLSchema#string;0..1;;Either a secret or API Key that ensures that only companies with this subscription information can POST to the subscriber callback endpoint +False;https://onerecord.iata.org/ns/api#Subscription;https://onerecord.iata.org/ns/api#sendLogisticsObjectBody;http://www.w3.org/2001/XMLSchema#boolean;0..1;;Flag specifying if the publisher should send the whole logistics object or not in the notification object +False;https://onerecord.iata.org/ns/api#ServerInformation;https://onerecord.iata.org/ns/api#serverEndpoint;http://www.w3.org/2001/XMLSchema#anyURI;0..1;;ONE Record API endpoint +False;https://onerecord.iata.org/ns/api#SubscriptionRequest;https://onerecord.iata.org/ns/api#status;http://www.w3.org/2001/XMLSchema#string;0..1;ACCEPTED,PENDING,REJECTED;PENDING, ACCEPTED or REJECTED +False;https://onerecord.iata.org/ns/api#Subscription;https://onerecord.iata.org/ns/api#includeSubscriptionEventType;https://onerecord.iata.org/ns/api#SubscriptionEventType;1..N;LOGISTICS_OBJECT_CREATED,LOGISTICS_OBJECT_UPDATED,LOGISTICS_EVENT_RECEIVED;An array used to indicate the specific types of notifications that the subscriber desires to receive from the publisher. The subscriber is required to specify their preferences on a per-type basis +False;https://onerecord.iata.org/ns/api#Subscription;https://onerecord.iata.org/ns/api#subscriber;https://onerecord.iata.org/ns/cargo#Organization;0..1;;Organization Identifier of the subscribing Organization +False;https://onerecord.iata.org/ns/api#ServerInformation;https://onerecord.iata.org/ns/api#supportedContentTypes;http://www.w3.org/2001/XMLSchema#string;0..N;;Supported content types of the server, MUST contain at least application/ld+json +False;https://onerecord.iata.org/ns/api#ServerInformation;https://onerecord.iata.org/ns/api#supportedEncodings;http://www.w3.org/2001/XMLSchema#string;0..N;;Optional list of supported encodings of the ONE Record server, e.g. gzip +False;https://onerecord.iata.org/ns/api#ServerInformation;https://onerecord.iata.org/ns/api#supportedLanguages;http://www.w3.org/2001/XMLSchema#string;0..N;;Supported languages of the ONE Record API, minimum is en-US (American English) +False;https://onerecord.iata.org/ns/api#ServerInformation;https://onerecord.iata.org/ns/api#supportedLogisticsObjectTypes;http://www.w3.org/2001/XMLSchema#anyURI;0..N;;Supported logistics object types on the server +False;https://onerecord.iata.org/ns/api#DelegationRequest;https://onerecord.iata.org/ns/api#targetCompanies;http://www.w3.org/2001/XMLSchema#string;0..N;;Parties that receive the delegated rights +False;https://onerecord.iata.org/ns/api#DelegationRequest;https://onerecord.iata.org/ns/api#targetLogisticsObjects;https://onerecord.iata.org/ns/cargo#LogisticsObject;0..N;;Identifiers of the logistics objects to which the access is requested +False;https://onerecord.iata.org/ns/api#Error;https://onerecord.iata.org/ns/api#title;http://www.w3.org/2001/XMLSchema#string;0..1;;Short summary of the error +False;https://onerecord.iata.org/ns/api#Notification;https://onerecord.iata.org/ns/api#topic;http://www.w3.org/2001/XMLSchema#anyURI;0..1;;The Logistics Object type or specific Logistics Object to which the subscription belongs to e.g. https://onerecord.iata.org/ns/cargo#Piece or https://1r.example.com/7f01363f-0c6a-4414-be48-d3692e219b91 +False;https://onerecord.iata.org/ns/api#Subscription;https://onerecord.iata.org/ns/api#topicType;http://www.w3.org/2001/XMLSchema#string;0..1;LOGISTICS_OBJECT_IDENTIFIER,LOGISTICS_OBJECT_TYPE;Specifies if the topic is a LogisticsObject type or a Logistics Object Identifier +False;https://onerecord.iata.org/ns/api#Notification;https://onerecord.iata.org/ns/api#triggeredByChangeRequest;https://onerecord.iata.org/ns/api#ChangeRequest;0..1;;Optional URI to the ChangeRequest that triggered a Notification if the eventType is one of CHANGE_REQUEST_ACCEPTED, CHANGE_REQUEST_REJECT, or CHANGE_REQUEST_FAILED +False;https://onerecord.iata.org/ns/api#OperationObject;https://onerecord.iata.org/ns/api#value;http://www.w3.org/2001/XMLSchema#string;0..1;;Updated value for the field +False;https://onerecord.iata.org/ns/api#Notification;https://onerecord.iata.org/ns/api#hasLogisticsObjectType;http://www.w3.org/2001/XMLSchema#anyURI;0..1;;The type of cargo:LogisticsObject in the notification e.g. https://onerecord.iata.org/ns/cargo#Piece +False;https://onerecord.iata.org/ns/api#Collection;https://onerecord.iata.org/ns/api#hasItem;http://www.w3.org/2002/07/owl#Thing;0..N;;Item that is contained in a collection +False;https://onerecord.iata.org/ns/api#Collection;https://onerecord.iata.org/ns/api#hasTotalItems;http://www.w3.org/2001/XMLSchema#nonNegativeInteger;0..1;;The number of total items contained in a collection diff --git a/development/API-Security/assets/ONE-Record-API-Ontology.ttl b/development/API-Security/assets/ONE-Record-API-Ontology.ttl new file mode 100644 index 00000000..4eb8acd8 --- /dev/null +++ b/development/API-Security/assets/ONE-Record-API-Ontology.ttl @@ -0,0 +1,1370 @@ +@prefix : . +@prefix dc: . +@prefix owl: . +@prefix rdf: . +@prefix xml: . +@prefix xsd: . +@prefix rdfs: . +@prefix cargo: . +@prefix terms: . +@base . + + rdf:type owl:Ontology ; + owl:versionIRI ; + owl:imports cargo: ; + dc:description "The ONE Record API vocabulary, described using W3C RDF Schema and the Web Ontology Language."@en ; + dc:title "ONE Record API Ontology"@en ; + terms:abstract "The ontology of the ONE Record API is the data model underlying for standard ONE Record API: https://github.com/IATA-Cargo/ONE-Record. ONE Record is a standard for data sharing and creates a single record view of the shipment. This standard defines a common data model for the data that is shared via standardized and secured web API."@en ; + terms:modified "2023-05-02" ; + terms:title "ONE Record API Ontology"@en ; + rdfs:comment """ +For a detailed Changelog, see CHANGELOG.md in API directory in GitHub"""@en ; + rdfs:isDefinedBy "https://www.iata.org/one-record/"^^xsd:anyURI ; + rdfs:label "ONE Record API Ontology"@en ; + owl:versionInfo "2.0.1-dev" . + +################################################################# +# Annotation properties +################################################################# + +### http://purl.org/dc/elements/1.1/description +dc:description rdf:type owl:AnnotationProperty . + + +### http://purl.org/dc/elements/1.1/title +dc:title rdf:type owl:AnnotationProperty . + + +### http://purl.org/dc/terms/abstract +terms:abstract rdf:type owl:AnnotationProperty . + + +### http://purl.org/dc/terms/modified +terms:modified rdf:type owl:AnnotationProperty . + + +### http://purl.org/dc/terms/title +terms:title rdf:type owl:AnnotationProperty . + + +### http://www.w3.org/2002/07/owl#maxCardinality +owl:maxCardinality rdf:type owl:AnnotationProperty . + + +### http://www.w3.org/2002/07/owl#maxQualifiedCardinality +owl:maxQualifiedCardinality rdf:type owl:AnnotationProperty . + + +### http://www.w3.org/2002/07/owl#minCardinality +owl:minCardinality rdf:type owl:AnnotationProperty . + + +### http://www.w3.org/2002/07/owl#minQualifiedCardinality +owl:minQualifiedCardinality rdf:type owl:AnnotationProperty . + + +################################################################# +# Object Properties +################################################################# + +### https://onerecord.iata.org/ns/api#hasAccessDelegation +:hasAccessDelegation rdf:type owl:ObjectProperty ; + rdfs:domain :AccessDelegationRequest ; + rdfs:range :AccessDelegation ; + rdfs:label "has Access Delegation"@en . + + +### https://onerecord.iata.org/ns/api#hasChange +:hasChange rdf:type owl:ObjectProperty ; + rdfs:domain :ChangeRequest ; + rdfs:comment "Contains submitted Change object"@en ; + rdfs:label "has Change"@en . + + +### https://onerecord.iata.org/ns/api#hasChangeRequest +:hasChangeRequest rdf:type owl:ObjectProperty ; + rdfs:domain :AuditTrail ; + rdfs:range :ChangeRequest ; + rdfs:comment "Recorded change requests in the Audit Trail of a Logistics Object"@en ; + rdfs:label "has Change Request"@en . + + +### https://onerecord.iata.org/ns/api#hasDataHolder +:hasDataHolder rdf:type owl:ObjectProperty ; + rdfs:domain :ServerInformation ; + rdfs:range cargo:Organization ; + rdfs:comment "The data holder of the servers data."@en ; + rdfs:label "has data holder"@en . + + +### https://onerecord.iata.org/ns/api#hasError +:hasError rdf:type owl:ObjectProperty ; + rdfs:domain :ActionRequest ; + rdfs:range :Error ; + rdfs:comment "Error object(s) if the processing was not successful"@en ; + rdfs:label "has Error"@en . + + +### https://onerecord.iata.org/ns/api#hasErrorDetail +:hasErrorDetail rdf:type owl:ObjectProperty ; + rdfs:domain :Error ; + rdfs:range :ErrorDetail ; + rdfs:comment "Error details"@en ; + rdfs:label "has Error Detail"@en . + + +### https://onerecord.iata.org/ns/api#hasEventType +:hasEventType rdf:type owl:ObjectProperty ; + rdfs:domain :Notification ; + rdfs:range :NotificationEventType ; + rdfs:label "has Event Type"@en . + + +### https://onerecord.iata.org/ns/api#hasItem +:hasItem rdf:type owl:ObjectProperty ; + rdfs:domain :Collection ; + rdfs:comment "Item that is contained in a collection"@en ; + rdfs:label "has Item"@en . + + +### https://onerecord.iata.org/ns/api#hasLogisticsAgent +:hasLogisticsAgent rdf:type owl:ObjectProperty ; + rdfs:domain :AccessPermissions ; + rdfs:range cargo:LogisticsAgent . + + +### https://onerecord.iata.org/ns/api#hasLogisticsObject +:hasLogisticsObject rdf:type owl:ObjectProperty ; + rdfs:range cargo:LogisticsObject ; + rdfs:comment "A reference to a cargo:LogisticsObject." ; + rdfs:label "has Logistics Object"@en . + + +### https://onerecord.iata.org/ns/api#hasOperation +:hasOperation rdf:type owl:ObjectProperty ; + rdfs:domain :Change ; + rdfs:range :Operation ; + rdfs:comment "Operation(s) to apply as PATCH on a Logistics Object"@en ; + rdfs:label "has Operation"@en . + + +### https://onerecord.iata.org/ns/api#hasPermission +:hasPermission rdf:type owl:ObjectProperty ; + rdfs:subPropertyOf owl:topObjectProperty ; + rdfs:domain :AccessDelegation ; + rdfs:range :Permission ; + rdfs:label "has Permission"@en . + + +### https://onerecord.iata.org/ns/api#hasRequestStatus +:hasRequestStatus rdf:type owl:ObjectProperty ; + rdfs:subPropertyOf owl:topObjectProperty ; + rdfs:domain :ActionRequest ; + rdfs:range :RequestStatus ; + rdfs:comment "has Request Status" . + + +### https://onerecord.iata.org/ns/api#hasSubscriber +:hasSubscriber rdf:type owl:ObjectProperty ; + rdfs:domain :Subscription ; + rdfs:range cargo:Organization ; + rdfs:label "has Subscriber"@en . + + +### https://onerecord.iata.org/ns/api#hasSubscription +:hasSubscription rdf:type owl:ObjectProperty ; + rdfs:domain :SubscriptionRequest ; + rdfs:range :Subscription ; + rdfs:comment "Link to the requestors Subscription object with all subscription information"@en ; + rdfs:label "has Subscription"@en . + + +### https://onerecord.iata.org/ns/api#hasTopicType +:hasTopicType rdf:type owl:ObjectProperty ; + rdfs:subPropertyOf owl:topObjectProperty ; + rdfs:domain :Subscription ; + rdfs:range :TopicType . + + +### https://onerecord.iata.org/ns/api#isRequestedBy +:isRequestedBy rdf:type owl:ObjectProperty ; + rdfs:subPropertyOf owl:topObjectProperty ; + rdfs:domain :ActionRequest ; + rdfs:range cargo:Organization ; + rdfs:comment "Organization Identifier that represents the Organization that has requested the action"@en ; + rdfs:label "is Requested By"@en . + + +### https://onerecord.iata.org/ns/api#isRequestedFor +:isRequestedFor rdf:type owl:ObjectProperty ; + rdfs:domain :AccessDelegation ; + rdfs:range cargo:Organization ; + rdfs:label "is requested for"@en . + + +### https://onerecord.iata.org/ns/api#isRevokedBy +:isRevokedBy rdf:type owl:ObjectProperty ; + rdfs:subPropertyOf owl:topObjectProperty ; + rdfs:domain :ActionRequest ; + rdfs:range cargo:Organization ; + rdfs:label "is revoked by"@en . + + +### https://onerecord.iata.org/ns/api#isTriggeredBy +:isTriggeredBy rdf:type owl:ObjectProperty ; + rdfs:domain :Notification ; + rdfs:range :ActionRequest ; + rdfs:comment "Optional URI to the ChangeRequest that triggered a Notification if the eventType is one of CHANGE_REQUEST_ACCEPTED, CHANGE_REQUEST_REJECT, or CHANGE_REQUEST_FAILED"@en ; + rdfs:label "is triggered by"@en . + + +### https://onerecord.iata.org/ns/api#o +:o rdf:type owl:ObjectProperty ; + rdfs:domain :Operation ; + rdfs:range :OperationObject . + + +### https://onerecord.iata.org/ns/api#op +:op rdf:type owl:ObjectProperty ; + rdfs:domain :Operation ; + rdfs:range :PatchOperation . + + +### https://onerecord.iata.org/ns/api#includeSubscriptionEventType +:includeSubscriptionEventType rdf:type owl:ObjectProperty ; + rdfs:domain :Subscription ; + rdfs:range :SubscriptionEventType ; + rdfs:comment "An array used to indicate the specific types of notifications that the subscriber desires to receive from the publisher. The subscriber is required to specify their preferences on a per-type basis"@en ; + rdfs:label "Include SubscriptionEventType"@en . + + +################################################################# +# Data properties +################################################################# + +### https://onerecord.iata.org/ns/api#expiresAt +:expiresAt rdf:type owl:DatatypeProperty ; + rdfs:domain :Subscription ; + rdfs:range xsd:dateTime ; + rdfs:comment "Expiry date as date time of the subscription information that supports caching but does not require the ONE Record client to store the datetime when the Subscription object was received; if not given: the information does not expire"@en ; + rdfs:label "Expires at"@en . + + +### https://onerecord.iata.org/ns/api#hasChangedProperty +:hasChangedProperty rdf:type owl:DatatypeProperty ; + rdfs:domain :Notification ; + rdfs:range xsd:anyURI ; + rdfs:comment "List of all changed properties as IRIs after a ChangeRequest was successfully applied, e.g. [https://onerecord.iata.org/ns/cargo#hasVolumetricWeight, https://onerecord.iata.org/ns/cargo/#hasGoodsDescription]"@en ; + rdfs:label "Changed property"@en . + + +### https://onerecord.iata.org/ns/api#hasCode +:hasCode rdf:type owl:DatatypeProperty ; + rdfs:domain :ErrorDetail ; + rdfs:range xsd:string ; + rdfs:comment "Error code is a numeric or alphanumeric code that can be used to determine the source of the error and why it occured."@en ; + rdfs:label "Code"@en . + + +### https://onerecord.iata.org/ns/api#hasContentType +:hasContentType rdf:type owl:DatatypeProperty ; + rdfs:domain :Subscription ; + rdfs:range xsd:string ; + rdfs:comment "Content types that the subscriber wants to receive in the notifications, e.g. application/ld+json"@en ; + rdfs:label "Content type"@en ; + rdfs:seeAlso "https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types"@en . + + +### https://onerecord.iata.org/ns/api#hasDatatype +:hasDatatype rdf:type owl:DatatypeProperty ; + rdfs:domain :OperationObject ; + rdfs:range xsd:anyURI ; + rdfs:comment "Data type of the field to update, must be a valid URI, e.g. http://www.w3.org/2001/XMLSchema#int"@en ; + rdfs:label "Datatype"@en . + + +### https://onerecord.iata.org/ns/api#hasDescription +:hasDescription rdf:type owl:DatatypeProperty ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( :AccessDelegation + :Change + :Subscription + ) + ] ; + rdfs:range xsd:string ; + rdfs:comment "Reason for the request (optional)"@en ; + rdfs:label "Description"@en . + + +### https://onerecord.iata.org/ns/api#hasLatestRevision +:hasLatestRevision rdf:type owl:DatatypeProperty ; + rdfs:domain :AuditTrail ; + rdfs:range xsd:positiveInteger ; + rdfs:comment "Latest revision of the Logistics Object. Starting with revision 0"@en ; + rdfs:label "Latest revision"@en . + + +### https://onerecord.iata.org/ns/api#hasLogisticsObjectType +:hasLogisticsObjectType rdf:type owl:DatatypeProperty ; + rdfs:domain :Notification ; + rdfs:range xsd:anyURI ; + rdfs:comment "The type of cargo:LogisticsObject in the notification e.g. https://onerecord.iata.org/ns/cargo#Piece" ; + rdfs:label "has Logistics Object Type"@en . + + +### https://onerecord.iata.org/ns/api#hasMessage +:hasMessage rdf:type owl:DatatypeProperty ; + rdfs:domain :ErrorDetail ; + rdfs:range xsd:string ; + rdfs:comment "Message that describes the error"@en ; + rdfs:label "Message"@en . + + +### https://onerecord.iata.org/ns/api#hasProperty +:hasProperty rdf:type owl:DatatypeProperty ; + rdfs:domain :ErrorDetail ; + rdfs:range xsd:anyURI ; + rdfs:comment "Property of the object for which the error applies in IRI format, i.e. https://onerecord.iata.org/ns/cargo#hasVolumetricWeight"@en ; + rdfs:label "Property"@en . + + +### https://onerecord.iata.org/ns/api#hasResource +:hasResource rdf:type owl:DatatypeProperty ; + rdfs:domain :ErrorDetail ; + rdfs:range xsd:anyURI ; + rdfs:comment "URI of the object where the error occurred"@en ; + rdfs:label "Resource"@en . + + +### https://onerecord.iata.org/ns/api#hasRevision +:hasRevision rdf:type owl:DatatypeProperty ; + rdfs:domain :ChangeRequest ; + rdfs:range xsd:positiveInteger ; + rdfs:comment "Revision number of the Logistics Object, starting with 0 for changing the initial revision of a Logistics Object"@en ; + rdfs:label "Revision"@en . + + +### https://onerecord.iata.org/ns/api#hasServerEndpoint +:hasServerEndpoint rdf:type owl:DatatypeProperty ; + rdfs:domain :ServerInformation ; + rdfs:range xsd:anyURI ; + rdfs:comment "ONE Record API endpoint"@en ; + rdfs:label "Server endpoint"@en . + + +### https://onerecord.iata.org/ns/api#hasSupportedApiVersion +:hasSupportedApiVersion rdf:type owl:DatatypeProperty ; + rdfs:domain :ServerInformation ; + rdfs:range xsd:string ; + rdfs:comment "Supported ONE Record API versions by the server, MUST include at least one supported version."@en ; + rdfs:label "Supported API version"@en . + + +### https://onerecord.iata.org/ns/api#hasSupportedContentType +:hasSupportedContentType rdf:type owl:DatatypeProperty ; + rdfs:domain :ServerInformation ; + rdfs:range xsd:string ; + rdfs:comment "Supported content types of the server, MUST contain at least application/ld+json"@en ; + rdfs:label "Supported content type"@en . + + +### https://onerecord.iata.org/ns/api#hasSupportedEncoding +:hasSupportedEncoding rdf:type owl:DatatypeProperty ; + rdfs:domain :ServerInformation ; + rdfs:range xsd:string ; + rdfs:comment "Optional list of supported encodings of the ONE Record server, e.g. gzip"@en ; + rdfs:label "Supported encoding"@en ; + rdfs:seeAlso "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding"@en . + + +### https://onerecord.iata.org/ns/api#hasSupportedLanguage +:hasSupportedLanguage rdf:type owl:DatatypeProperty ; + rdfs:domain :ServerInformation ; + rdfs:range xsd:string ; + rdfs:comment "Supported languages of the ONE Record API, minimum is en-US (American English)"@en ; + rdfs:label "Supported language"@en . + + +### https://onerecord.iata.org/ns/api#hasSupportedOntology +:hasSupportedOntology rdf:type owl:DatatypeProperty ; + rdfs:domain :ServerInformation ; + rdfs:range xsd:anyURI ; + rdfs:comment "Supported ontologies on the server, MUST be non-versioned IRIs"@en ; + rdfs:label "Supported ontology"@en . + + +### https://onerecord.iata.org/ns/api#hasSupportedOntologyVersion +:hasSupportedOntologyVersion rdf:type owl:DatatypeProperty ; + rdfs:domain :ServerInformation ; + rdfs:range xsd:anyURI ; + rdfs:comment "Supported ontology versions on the server, MUST be versioned IRIs"@en ; + rdfs:label "Supported ontology version"@en . + + +### https://onerecord.iata.org/ns/api#hasTitle +:hasTitle rdf:type owl:DatatypeProperty ; + rdfs:domain :Error ; + rdfs:range xsd:string ; + rdfs:comment "Short summary of the error"@en ; + rdfs:label "Title"@en . + + +### https://onerecord.iata.org/ns/api#hasTopic +:hasTopic rdf:type owl:DatatypeProperty ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( :Notification + :Subscription + ) + ] ; + rdfs:range xsd:anyURI ; + rdfs:comment "The Logistics Object type or specific Logistics Object to which the subscription belongs to e.g. https://onerecord.iata.org/Piece or https://1r.example.com/7f01363f-0c6a-4414-be48-d3692e219b91"@en ; + rdfs:label "Topic"@en . + + +### https://onerecord.iata.org/ns/api#hasTotalItems +:hasTotalItems rdf:type owl:DatatypeProperty ; + rdfs:domain :Collection ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:comment "The number of total items contained in a collection"@en ; + rdfs:label "Total items"@en . + + +### https://onerecord.iata.org/ns/api#hasValue +:hasValue rdf:type owl:DatatypeProperty ; + rdfs:domain :OperationObject ; + rdfs:range xsd:string ; + rdfs:comment "Updated value for the field"@en ; + rdfs:label "Value"@en . + + +### https://onerecord.iata.org/ns/api#isRequestedAt +:isRequestedAt rdf:type owl:DatatypeProperty ; + rdfs:domain :ActionRequest ; + rdfs:range xsd:dateTime ; + rdfs:comment "Datetime when the request was created"@en ; + rdfs:label "Requested at"@en . + + +### https://onerecord.iata.org/ns/api#isRevokedAt +:isRevokedAt rdf:type owl:DatatypeProperty ; + rdfs:domain :ActionRequest ; + rdfs:range xsd:dateTime ; + rdfs:comment "The datetime when the action request was revoked."@en ; + rdfs:label "Revoked at"@en . + + +### https://onerecord.iata.org/ns/api#notifyRequestStatusChange +:notifyRequestStatusChange rdf:type owl:DatatypeProperty ; + rdfs:domain [ rdf:type owl:Class ; + owl:unionOf ( :AccessDelegation + :Change + :Subscription + ) + ] ; + rdfs:range xsd:boolean ; + rdfs:comment "Flag specifying if the requestor wants to receive Notification from the publisher when the status of an action request changed, default=FALSE"@en ; + rdfs:label "notify RequestStatus Change"@en . + + +### https://onerecord.iata.org/ns/api#p +:p rdf:type owl:DatatypeProperty ; + rdfs:domain :Operation ; + rdfs:range xsd:anyURI ; + rdfs:comment "Operations objects must have exactly one p, predicate, member. The value of this member must be an URI, e.g. https://onerecord.iata.org/ns/cargo#hasGoodsDescription"@en ; + rdfs:label "p"@en . + + +### https://onerecord.iata.org/ns/api#s +:s rdf:type owl:DatatypeProperty ; + rdfs:domain :Operation ; + rdfs:range xsd:string ; + rdfs:comment "Operation objects MUST have exactly one \"s\", subject, member. The value of this member MUST be one of IRI or blank node."@en ; + rdfs:label "s"@en . + + +### https://onerecord.iata.org/ns/api#sendLogisticsObjectBody +:sendLogisticsObjectBody rdf:type owl:DatatypeProperty ; + rdfs:domain :Subscription ; + rdfs:range xsd:boolean ; + rdfs:comment "Flag specifying if the publisher should send the whole logistics object or not in the notification object"@en ; + rdfs:label "Send LogisticsObject body"@en . + + +################################################################# +# Classes +################################################################# + +### https://onerecord.iata.org/ns/api#AccessDelegation +:AccessDelegation rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsObject ; + owl:allValuesFrom cargo:LogisticsObject + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasPermission ; + owl:allValuesFrom :Permission + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isRequestedFor ; + owl:allValuesFrom cargo:Organization + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsObject ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass cargo:LogisticsObject + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasPermission ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :Permission + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isRequestedFor ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass cargo:Organization + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasDescription ; + owl:allValuesFrom xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :notifyRequestStatusChange ; + owl:allValuesFrom xsd:boolean + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :notifyRequestStatusChange ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:boolean + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasDescription ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string + ] ; + rdfs:comment "Access to a Logistics Object delegated to an Organization"@en ; + rdfs:label "Access Delegation"@en . + + +### https://onerecord.iata.org/ns/api#AccessDelegationRequest +:AccessDelegationRequest rdf:type owl:Class ; + rdfs:subClassOf :ActionRequest , + [ rdf:type owl:Restriction ; + owl:onProperty :hasAccessDelegation ; + owl:allValuesFrom :AccessDelegation + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasAccessDelegation ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :AccessDelegation + ] ; + rdfs:comment "Delegation Request to 3rd parties"@en ; + rdfs:label "Access Delegation Request"@en . + + +### https://onerecord.iata.org/ns/api#AccessPermissions +:AccessPermissions rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsAgent ; + owl:allValuesFrom cargo:LogisticsAgent + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsObject ; + owl:allValuesFrom cargo:LogisticsObject + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasPermission ; + owl:allValuesFrom :Permission + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasPermission ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :Permission + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsAgent ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass cargo:LogisticsAgent + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsObject ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass cargo:LogisticsObject + ] ; + rdfs:comment "Access permissions granted to a logistics agent for a logistics object"@en ; + rdfs:label "Access Permissions"@en . + + +### https://onerecord.iata.org/ns/api#ActionRequest +:ActionRequest rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasError ; + owl:allValuesFrom :Error + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasRequestStatus ; + owl:allValuesFrom :RequestStatus + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isRequestedBy ; + owl:allValuesFrom cargo:Organization + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isRevokedBy ; + owl:allValuesFrom cargo:Organization + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasRequestStatus ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :RequestStatus + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isRequestedBy ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass cargo:Organization + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isRevokedBy ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass cargo:Organization + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isRequestedAt ; + owl:allValuesFrom xsd:dateTime + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isRevokedAt ; + owl:allValuesFrom xsd:dateTime + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isRequestedAt ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:dateTime + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isRevokedAt ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:dateTime + ] ; + rdfs:comment "Superclass for all kinds of requests (i.e someone requsted something (e.g. subscription, access, etc.) at a publisher/holder of a logistics object)"@en ; + rdfs:label "Action Request"@en . + + +### https://onerecord.iata.org/ns/api#AuditTrail +:AuditTrail rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasChangeRequest ; + owl:allValuesFrom :ChangeRequest + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasLatestRevision ; + owl:allValuesFrom xsd:positiveInteger + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasLatestRevision ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:positiveInteger + ] ; + rdfs:comment "Audit trail of a Logistics Object"@en ; + rdfs:label "Audit Trail"@en . + + +### https://onerecord.iata.org/ns/api#Change +:Change rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsObject ; + owl:allValuesFrom cargo:LogisticsObject + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasOperation ; + owl:allValuesFrom :Operation + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasOperation ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :Operation + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsObject ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass cargo:LogisticsObject + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasDescription ; + owl:allValuesFrom xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasRevision ; + owl:allValuesFrom xsd:positiveInteger + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :notifyRequestStatusChange ; + owl:allValuesFrom xsd:boolean + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasRevision ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:positiveInteger + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :notifyRequestStatusChange ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:boolean + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasDescription ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string + ] ; + rdfs:label "Change"@en . + + +### https://onerecord.iata.org/ns/api#ChangeRequest +:ChangeRequest rdf:type owl:Class ; + rdfs:subClassOf :ActionRequest , + [ rdf:type owl:Restriction ; + owl:onProperty :hasChange ; + owl:allValuesFrom :Change + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasChange ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :Change + ] ; + rdfs:comment "Change Request containing updates on a Logistics Object"@en ; + rdfs:label "Change Request"@en . + + +### https://onerecord.iata.org/ns/api#Collection +:Collection rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasItem ; + owl:someValuesFrom owl:Thing + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasTotalItems ; + owl:allValuesFrom xsd:nonNegativeInteger + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasTotalItems ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:nonNegativeInteger + ] ; + rdfs:comment "Used as response of endpoints returning a collection of more than one graph, i.e. more than one not linked subjects."@en ; + rdfs:label "Collection"@en . + + +### https://onerecord.iata.org/ns/api#Error +:Error rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasErrorDetail ; + owl:allValuesFrom :ErrorDetail + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasErrorDetail ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :ErrorDetail + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasTitle ; + owl:allValuesFrom xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasTitle ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string + ] ; + rdfs:comment "Error model"@en ; + rdfs:label "Error"@en . + + +### https://onerecord.iata.org/ns/api#ErrorDetail +:ErrorDetail rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasCode ; + owl:allValuesFrom xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasMessage ; + owl:allValuesFrom xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasProperty ; + owl:allValuesFrom xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasResource ; + owl:allValuesFrom xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasCode ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasMessage ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasProperty ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasResource ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI + ] ; + rdfs:comment "Error details that belong to an error"@en ; + rdfs:label "Error Detail"@en . + + +### https://onerecord.iata.org/ns/api#Notification +:Notification rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasEventType ; + owl:allValuesFrom :NotificationEventType + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsObject ; + owl:allValuesFrom cargo:LogisticsObject + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isTriggeredBy ; + owl:allValuesFrom :ActionRequest + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasEventType ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :NotificationEventType + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsObject ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass cargo:LogisticsObject + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :isTriggeredBy ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :ActionRequest + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasChangedProperty ; + owl:allValuesFrom xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsObjectType ; + owl:allValuesFrom xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasLogisticsObjectType ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI + ] ; + rdfs:comment "Notification sent by the publisher to the subscriber"@en ; + rdfs:label "Notification"@en . + + +### https://onerecord.iata.org/ns/api#NotificationEventType +:NotificationEventType rdf:type owl:Class ; + owl:equivalentClass [ rdf:type owl:Class ; + owl:oneOf ( :ACCESS_DELEGATION_REQUEST_ACCEPTED + :ACCESS_DELEGATION_REQUEST_FAILED + :ACCESS_DELEGATION_REQUEST_PENDING + :ACCESS_DELEGATION_REQUEST_REJECTED + :ACCESS_DELEGATION_REQUEST_REVOKED + :CHANGE_REQUEST_ACCEPTED + :CHANGE_REQUEST_FAILED + :CHANGE_REQUEST_PENDING + :CHANGE_REQUEST_REJECTED + :CHANGE_REQUEST_REVOKED + :LOGISTICS_EVENT_RECEIVED + :LOGISTICS_OBJECT_CREATED + :LOGISTICS_OBJECT_UPDATED + :SUBSCRIPTION_REQUEST_ACCEPTED + :SUBSCRIPTION_REQUEST_FAILED + :SUBSCRIPTION_REQUEST_PENDING + :SUBSCRIPTION_REQUEST_REJECTED + :SUBSCRIPTION_REQUEST_REVOKED + ) + ] ; + rdfs:label "Notification Event Type"@en . + + +### https://onerecord.iata.org/ns/api#SubscriptionEventType +:SubscriptionEventType rdf:type owl:Class ; + owl:equivalentClass [ rdf:type owl:Class ; + owl:oneOf ( :LOGISTICS_EVENT_RECEIVED + :LOGISTICS_OBJECT_CREATED + :LOGISTICS_OBJECT_UPDATED + ) + ] ; + rdfs:label "Subscription Event Type"@en . + + +### https://onerecord.iata.org/ns/api#Operation +:Operation rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :o ; + owl:allValuesFrom :OperationObject + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :op ; + owl:allValuesFrom :PatchOperation + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :o ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :OperationObject + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :op ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :PatchOperation + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :p ; + owl:allValuesFrom xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :s ; + owl:allValuesFrom xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :p ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :s ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string + ] ; + rdfs:comment "Operation Request contained in the PATCH body"@en ; + rdfs:label "Operation"@en . + + +### https://onerecord.iata.org/ns/api#OperationObject +:OperationObject rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasDatatype ; + owl:allValuesFrom xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasValue ; + owl:allValuesFrom xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasDatatype ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasValue ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string + ] ; + rdfs:comment "Object to modify in the PATCH request"@en ; + rdfs:label "Operation Object"@en . + + +### https://onerecord.iata.org/ns/api#PatchOperation +:PatchOperation rdf:type owl:Class ; + owl:equivalentClass [ rdf:type owl:Class ; + owl:oneOf ( :ADD + :DELETE + ) + ] ; + rdfs:label "Patch Operation" . + + +### https://onerecord.iata.org/ns/api#Permission +:Permission rdf:type owl:Class ; + owl:equivalentClass [ rdf:type owl:Class ; + owl:oneOf ( :GET_LOGISTICS_EVENT + :GET_LOGISTICS_OBJECT + :PATCH_LOGISTICS_OBJECT + :POST_LOGISTICS_EVENT + ) + ] ; + rdfs:label "Permission"@en . + + +### https://onerecord.iata.org/ns/api#RequestStatus +:RequestStatus rdf:type owl:Class ; + owl:equivalentClass [ rdf:type owl:Class ; + owl:oneOf ( :REQUEST_ACCEPTED + :REQUEST_FAILED + :REQUEST_PENDING + :REQUEST_REJECTED + :REQUEST_REVOKED + ) + ] ; + rdfs:label "RequestStatus"@en . + + +### https://onerecord.iata.org/ns/api#ServerInformation +:ServerInformation rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasDataHolder ; + owl:allValuesFrom cargo:Organization + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasDataHolder ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass cargo:Organization + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasSupportedEncoding ; + owl:allValuesFrom xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasSupportedApiVersion ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasSupportedContentType ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasSupportedLanguage ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasSupportedOntology ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasSupportedOntologyVersion ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasServerEndpoint ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI + ] ; + rdfs:comment "Information about the ONE Record server"@en ; + rdfs:label "Server Information"@en . + + +### https://onerecord.iata.org/ns/api#Subscription +:Subscription rdf:type owl:Class ; + rdfs:subClassOf [ rdf:type owl:Restriction ; + owl:onProperty :hasSubscriber ; + owl:allValuesFrom cargo:Organization + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasTopicType ; + owl:allValuesFrom :TopicType + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :includeSubscriptionEventType ; + owl:allValuesFrom :SubscriptionEventType + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :includeSubscriptionEventType ; + owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :SubscriptionEventType + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasSubscriber ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass cargo:Organization + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasTopicType ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :TopicType + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasContentType ; + owl:allValuesFrom xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :notifyRequestStatusChange ; + owl:allValuesFrom xsd:boolean + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasTopic ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:anyURI + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :notifyRequestStatusChange ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:boolean + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :expiresAt ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:dateTime + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasDescription ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:string + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :sendLogisticsObjectBody ; + owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onDataRange xsd:boolean + ] ; + rdfs:comment "Subscription information sent to the publisher"@en ; + rdfs:label "Subscription"@en . + + +### https://onerecord.iata.org/ns/api#SubscriptionRequest +:SubscriptionRequest rdf:type owl:Class ; + rdfs:subClassOf :ActionRequest , + [ rdf:type owl:Restriction ; + owl:onProperty :hasSubscription ; + owl:allValuesFrom :Subscription + ] , + [ rdf:type owl:Restriction ; + owl:onProperty :hasSubscription ; + owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ; + owl:onClass :Subscription + ] ; + rdfs:comment "SubscriptionRequest initiated by subscribers to publisher (data holder) for themselves or for a third party subscriber."@en ; + rdfs:label "Subscription Request"@en . + + +### https://onerecord.iata.org/ns/api#TopicType +:TopicType rdf:type owl:Class ; + owl:equivalentClass [ rdf:type owl:Class ; + owl:oneOf ( :LOGISTICS_OBJECT_IDENTIFIER + :LOGISTICS_OBJECT_TYPE + ) + ] . + + +### https://onerecord.iata.org/ns/cargo#LogisticsAgent +cargo:LogisticsAgent rdf:type owl:Class . + + +### https://onerecord.iata.org/ns/cargo#LogisticsObject +cargo:LogisticsObject rdf:type owl:Class . + + +### https://onerecord.iata.org/ns/cargo#Organization +cargo:Organization rdf:type owl:Class . + + +################################################################# +# Individuals +################################################################# + +### https://onerecord.iata.org/ns/api#ACCESS_DELEGATION_REQUEST_ACCEPTED +:ACCESS_DELEGATION_REQUEST_ACCEPTED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "ACCESS_DELEGATION_REQUEST_ACCEPTED"@en . + + +### https://onerecord.iata.org/ns/api#ACCESS_DELEGATION_REQUEST_FAILED +:ACCESS_DELEGATION_REQUEST_FAILED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "ACCESS_DELEGATION_REQUEST_FAILED"@en . + + +### https://onerecord.iata.org/ns/api#ACCESS_DELEGATION_REQUEST_PENDING +:ACCESS_DELEGATION_REQUEST_PENDING rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "ACCESS_DELEGATION_REQUEST_PENDING"@en . + + +### https://onerecord.iata.org/ns/api#ACCESS_DELEGATION_REQUEST_REJECTED +:ACCESS_DELEGATION_REQUEST_REJECTED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "ACCESS_DELEGATION_REQUEST_REJECTED"@en . + + +### https://onerecord.iata.org/ns/api#ACCESS_DELEGATION_REQUEST_REVOKED +:ACCESS_DELEGATION_REQUEST_REVOKED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "ACCESS_DELEGATION_REQUEST_REVOKED"@en . + + +### https://onerecord.iata.org/ns/api#ADD +:ADD rdf:type owl:NamedIndividual , + :PatchOperation ; + rdfs:comment "Defines a :PatchOperation to be an operation that adds new triples."@en ; + rdfs:label "ADD"@en . + + +### https://onerecord.iata.org/ns/api#CHANGE_REQUEST_ACCEPTED +:CHANGE_REQUEST_ACCEPTED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:comment ":EventType for accepted :ChangeRequests"@en ; + rdfs:label "CHANGE_REQUEST_ACCEPTED"@en . + + +### https://onerecord.iata.org/ns/api#CHANGE_REQUEST_FAILED +:CHANGE_REQUEST_FAILED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:comment ":EventType for failed :ChangeRequests." ; + rdfs:label "CHANGE_REQUEST_FAILED"@en . + + +### https://onerecord.iata.org/ns/api#CHANGE_REQUEST_PENDING +:CHANGE_REQUEST_PENDING rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:comment ":EventType for pending :ChangeRequests." ; + rdfs:label "CHANGE_REQUEST_PENDING" . + + +### https://onerecord.iata.org/ns/api#CHANGE_REQUEST_REJECTED +:CHANGE_REQUEST_REJECTED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "CHANGE_REQUEST_PENDING" . + + +### https://onerecord.iata.org/ns/api#CHANGE_REQUEST_REVOKED +:CHANGE_REQUEST_REVOKED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "CHANGE_REQUEST_REVOKED"@en . + + +### https://onerecord.iata.org/ns/api#DELETE +:DELETE rdf:type owl:NamedIndividual , + :PatchOperation ; + rdfs:label "DELETE"@en . + + +### https://onerecord.iata.org/ns/api#GET_LOGISTICS_EVENT +:GET_LOGISTICS_EVENT rdf:type owl:NamedIndividual , + :Permission ; + rdfs:comment ":Permission to get a :LogisticsEvent"@en ; + rdfs:label "GET_LOGISTICS_EVENT"@en . + + +### https://onerecord.iata.org/ns/api#GET_LOGISTICS_OBJECT +:GET_LOGISTICS_OBJECT rdf:type owl:NamedIndividual , + :Permission ; + rdfs:comment ":Permission to get a :LogisticsObject"@en ; + rdfs:label "GET_LOGISTICS_OBJECT"@en . + + +### https://onerecord.iata.org/ns/api#LOGISTICS_EVENT_RECEIVED +:LOGISTICS_EVENT_RECEIVED rdf:type owl:NamedIndividual , + :NotificationEventType , + :SubscriptionEventType ; + rdfs:label "LOGISTICS_EVENT_RECEIVED"@en . + + +### https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_CREATED +:LOGISTICS_OBJECT_CREATED rdf:type owl:NamedIndividual , + :NotificationEventType , + :SubscriptionEventType ; + rdfs:label "LOGISTICS_OBJECT_CREATED"@en . + + +### https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_IDENTIFIER +:LOGISTICS_OBJECT_IDENTIFIER rdf:type owl:NamedIndividual , + :TopicType ; + rdfs:label "LOGISTICS_OBJECT_IDENTIFIER"@en . + + +### https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_TYPE +:LOGISTICS_OBJECT_TYPE rdf:type owl:NamedIndividual , + :TopicType ; + rdfs:label "LOGISTICS_OBJECT_TYPE"@en . + + +### https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_UPDATED +:LOGISTICS_OBJECT_UPDATED rdf:type owl:NamedIndividual , + :NotificationEventType , + :SubscriptionEventType ; + rdfs:label "LOGISTICS_OBJECT_UPDATED"@en . + + +### https://onerecord.iata.org/ns/api#PATCH_LOGISTICS_OBJECT +:PATCH_LOGISTICS_OBJECT rdf:type owl:NamedIndividual , + :Permission ; + rdfs:label "PATCH_LOGISTICS_OBJECT"@en . + + +### https://onerecord.iata.org/ns/api#POST_LOGISTICS_EVENT +:POST_LOGISTICS_EVENT rdf:type owl:NamedIndividual , + :Permission ; + rdfs:comment ":Permission to add a logistics event."@en ; + rdfs:label "POST_LOGISTICS_EVENT" . + + +### https://onerecord.iata.org/ns/api#REQUEST_ACCEPTED +:REQUEST_ACCEPTED rdf:type owl:NamedIndividual , + :RequestStatus ; + rdfs:label "REQUEST_ACCEPTED"@en . + + +### https://onerecord.iata.org/ns/api#REQUEST_FAILED +:REQUEST_FAILED rdf:type owl:NamedIndividual , + :RequestStatus ; + rdfs:label "REQUEST_FAILED"@en . + + +### https://onerecord.iata.org/ns/api#REQUEST_PENDING +:REQUEST_PENDING rdf:type owl:NamedIndividual , + :RequestStatus ; + rdfs:label "REQUEST_PENDING"@en . + + +### https://onerecord.iata.org/ns/api#REQUEST_REJECTED +:REQUEST_REJECTED rdf:type owl:NamedIndividual , + :RequestStatus ; + rdfs:label "REQUEST_REJECTED"@en . + + +### https://onerecord.iata.org/ns/api#REQUEST_REVOKED +:REQUEST_REVOKED rdf:type owl:NamedIndividual , + :RequestStatus ; + rdfs:label "REQUEST_REVOKED"@en . + + +### https://onerecord.iata.org/ns/api#SUBSCRIPTION_REQUEST_ACCEPTED +:SUBSCRIPTION_REQUEST_ACCEPTED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "SUBSCRIPTION_REQUEST_ACCEPTED"@en . + + +### https://onerecord.iata.org/ns/api#SUBSCRIPTION_REQUEST_FAILED +:SUBSCRIPTION_REQUEST_FAILED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "SUBSCRIPTION_REQUEST_FAILED"@en . + + +### https://onerecord.iata.org/ns/api#SUBSCRIPTION_REQUEST_PENDING +:SUBSCRIPTION_REQUEST_PENDING rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "SUBSCRIPTION_REQUEST_PENDING"@en . + + +### https://onerecord.iata.org/ns/api#SUBSCRIPTION_REQUEST_REJECTED +:SUBSCRIPTION_REQUEST_REJECTED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "SUBSCRIPTION_REQUEST_REJECTED"@en . + + +### https://onerecord.iata.org/ns/api#SUBSCRIPTION_REQUEST_REVOKED +:SUBSCRIPTION_REQUEST_REVOKED rdf:type owl:NamedIndividual , + :NotificationEventType ; + rdfs:label "SUBSCRIPTION_REQUEST_REVOKED"@en . + + +[ owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger +] . + +[ owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger + ] . + +[ owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger + ] . + +[ owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger + ] . + +### Generated by the OWL API (version 4.5.25.2023-02-15T19:15:49Z) https://github.com/owlcs/owlapi diff --git a/development/API-Security/assets/ONE-Record-API-OpenAPI.yaml b/development/API-Security/assets/ONE-Record-API-OpenAPI.yaml new file mode 100644 index 00000000..b38aa823 --- /dev/null +++ b/development/API-Security/assets/ONE-Record-API-OpenAPI.yaml @@ -0,0 +1,14361 @@ +openapi: 3.0.1 +info: + title: ONE Record API Documentation + description: "This OpenAPI specification describes the API endpoint structure of\ + \ an ONE Record API implementation.

Note:
The included schemas\ + \ can only be used to generate JSON-LD in the extended document form.
However,\ + \ to be fully ONE Record compliant, any ONE Record API (and any compliant ONE\ + \ Record client)
MUST support at least the expanded, compacted, and\ + \ flattened document forms.

More information about the ONE Record specification\ + \ are available on [IATA Github repository](https://github.com/IATA-Cargo/ONE-Record)\ + \ and on the [ONE Record Developer Portal](https://onerecord.iata.org)." + contact: + name: IATA + url: https://onerecord.iata.org/ + email: onerecord@iata.org + license: + name: MIT License + url: https://opensource.org/licenses/MIT + version: 2.0.0 +servers: +- url: https://1r.example.com +tags: + - name: Server Information + - name: Logistics Objects + - name: Logistics Events + - name: Subscriptions + - name: Notifications + - name: Access Delegations + - name: Action Requests + +paths: + /: + get: + summary: Get Server Information + description: Return the information about the server + tags: + - Server Information + operationId: getServerInformation + responses: + "200": + description: The request to retrieve the ServerInformation has been successful + headers: + Last-Modified: + description: The date and time of the most recent change to the server information + required: true + style: simple + schema: + type: string + format: HTTP-date + example: "Tue, 21 Feb 2023 07:28:00 GMT" + content: + application/ld+json: + schema: + $ref: '#/components/schemas/ServerInformation' + "301": + description: The server has permanently moved to a new location + headers: + Location: + description: New location of the server + required: true + style: simple + schema: + type: string + format: uri + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "404": + description: Resource Not Found + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method not Allowd + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + "415": + description: Unsupported Content Type + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + /logistics-objects: + post: + tags: + - Logistics Objects + summary: "INTERNAL: Create a LogisticsObject" + description: Create a LogisticsObject in the ONE Record server + operationId: createLogisticsObject + requestBody: + content: + application/ld+json: + schema: + $ref: '#/components/schemas/LogisticsObject' + required: true + responses: + "201": + description: Logistics Object has been created + headers: + Type: + description: Type of the created LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + Location: + description: Location of the created LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + "400": + description: Invalid Logistics Object + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: LogisticsObject with provided ID already exists + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "415": + description: Unsupported Content Type + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + + /logistics-objects/{logisticsObjectId}: + get: + tags: + - Logistics Objects + summary: Request a logistics object + description: Get all information contained into a LogisticsObject in the ONE Record server + operationId: getLogisticsObject + parameters: + - name: logisticsObjectId + in: path + required: true + schema: + type: string + - name: at + in: query + required: false + schema: + type: string + format: date-time + - name: embedded + in: query + required: false + schema: + type: boolean + responses: + "200": + description: The request to retrieve the Logistics Object has been successful + headers: + Type: + description: Type of the requested LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + Revision: + description: The revision of the requested Logistics Object + required: true + style: simple + schema: + type: integer + format: int64 + Last-Modified: + description: The date and time of the most recent change to the Logistics Object + required: true + style: simple + schema: + type: string + format: HTTP-date + example: "Tue, 21 Feb 2023 07:28:00 GMT" + Latest-Revision: + description: Latest revision number of the requested Logistics Object + required: true + style: simple + schema: + type: integer + format: int64 + Location: + description: Location of the created LogisticsObject + required: false + style: simple + schema: + type: string + format: uri + content: + application/ld+json: + schema: + $ref: '#/components/schemas/LogisticsObject' + "301": + description: The URI of the Logistics Object has permanently changed. + headers: + Location: + description: New location of the LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + "302": + description: The URI of the Logistics Object has temporarily moved. + headers: + Location: + description: New location of the LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "404": + description: Logistics Object not found + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "415": + description: Unsupported Content Type + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + patch: + tags: + - Logistics Objects + summary: Request a change for a given logistics object + description: Allow a third party to propose a change on a logistics object + operationId: updateLogisticsObject + parameters: + - name: logisticsObjectId + in: path + required: true + schema: + type: string + requestBody: + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Change' + required: true + responses: + "201": + description: The change was successfully requested + headers: + Type: + description: The type of the newly created resource as a URI + required: true + style: simple + schema: + type: string + format: uri + Location: + description: The URI of the submitted ChangeRequest + required: true + style: simple + schema: + type: string + format: uri + "400": + description: The update request body is invalid + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized to update the Logistics Object + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "404": + description: Logistics Object not found + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "415": + description: Unsupported Content Type + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "422": + description: Unprocessable Request + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + /logistics-objects/{logisticsObjectId}/audit-trail: + get: + tags: + - Logistics Objects + summary: Retrieves the audit trail (history) of a given logistics object + description: Retrieve the list of change request applied to the logistics object + operationId: getAuditTrail + parameters: + - name: logisticsObjectId + in: path + required: true + schema: + type: string + - name: updatedFrom + in: query + required: false + schema: + type: string + format: date-time + - name: updatedTo + in: query + required: false + schema: + type: string + format: date-time + - name: status + in: query + required: false + schema: + type: string + enum: [PENDING, ACCEPTED, REJECTED] + responses: + "200": + description: The request to retrieve the AuditTrail has been successful + content: + application/ld+json: + schema: + $ref: '#/components/schemas/AuditTrail' + "301": + description: The URI of the Logistics Object has permanently changed. + headers: + Location: + description: New location of the LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + "302": + description: The URI of the Logistics Object has temporarily moved. + headers: + Location: + description: New location of the LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "404": + description: Logistics Object not found + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "415": + description: Unsupported Content Type + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + /logistics-objects/{logisticsObjectId}/logistics-events: + get: + tags: + - Logistics Events + summary: Retrieves the LogisticsEvents of a given LogisticsObject + description: Retrieve the list of LogisticsEvents of a given LogisticsObject + operationId: getLogisticsEvents + parameters: + - name: logisticsObjectId + in: path + required: true + schema: + type: string + - name: eventType + in: query + required: false + schema: + type: array + items: + type: string + example: [FOF,DEP] + - name: created_after + in: query + required: false + schema: + type: string + format: date-time + - name: created_before + in: query + required: false + schema: + type: string + format: date-time + - name: occurred_after + in: query + required: false + schema: + type: string + format: date-time + - name: occurred_before + in: query + required: false + schema: + type: string + format: date-time + responses: + "200": + description: The request to retrieve the Logistics Events has been successful + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Collection' + "301": + description: The URI of the Logistics Object has permanently changed. + headers: + Location: + description: New location of the LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + "302": + description: The URI of the Logistics Object has temporarily moved. + headers: + Location: + description: New location of the LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "404": + description: Logistics Object not found + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + post: + tags: + - Logistics Events + summary: Append a LogisticsEvent to the event log of a given LogisticsObject + description: Add a LogisticsEvent to a given LogisticsObject + operationId: appendLogisticsEvent + parameters: + - name: logisticsObjectId + in: path + required: true + schema: + type: string + requestBody: + content: + application/ld+json: + schema: + $ref: '#/components/schemas/LogisticsEvent' + required: true + responses: + "201": + description: Logistics Event has been created + headers: + Type: + description: Type of the created LogisticsEvent + required: true + style: simple + schema: + type: string + format: uri + Location: + description: Location of the created LogisticsEvent + required: true + style: simple + schema: + type: string + format: uri + "400": + description: Invalid Logistics Object + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "404": + description: LogisticsObject not found + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "415": + description: Unsupported Content Type + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal server error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + /logistics-objects/{logisticsObjectId}/logistics-events/{logisticsEventsId}: + get: + tags: + - Logistics Events + summary: Retrieves a LogisticsEvents + description: Get a specific LogisticsEvents from a give LogisticsObject + operationId: getLogisticsEvent + parameters: + - name: logisticsObjectId + in: path + required: true + schema: + type: string + - name: logisticsEventsId + in: path + required: true + schema: + type: string + responses: + "200": + description: The request to retrieve the Logistics Event has been successful + headers: + Last-Modified: + description: The date and time of the most recent change to the Logistics Object + required: true + style: simple + schema: + type: string + format: HTTP-date + example: "Tue, 21 Feb 2023 07:28:00 GMT" + content: + application/ld+json: + schema: + $ref: '#/components/schemas/LogisticsEvent' + "301": + description: The URI of the Logistics Object has permanently changed. + headers: + Location: + description: New location of the LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + "302": + description: The URI of the Logistics Object has temporarily moved. + headers: + Location: + description: New location of the LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "404": + description: Logistics Object or Logistics Event not found + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + /subscriptions: + get: + tags: + - Subscriptions + summary: Get subscription information + description: Get a specific subscription object + operationId: getSubscription + parameters: + - name: topicType + in: query + required: true + schema: + type: string + - name: topic + in: query + required: true + schema: + type: string + responses: + "200": + description: The request to retrieve the Subscription Information has been successful + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Subscription' + "400": + description: The request is invalid + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + post: + tags: + - Subscriptions + summary: Request subscription + description: Send a subscription request for a Logistics Object + operationId: createSubscriptionRequest + requestBody: + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Subscription' + required: true + responses: + "201": + description: The Subscription Request has been created successfully + headers: + Type: + description: Type of the SubscriptionRequest + required: true + style: simple + schema: + type: string + format: uri + Location: + description: Location of the created SubscriptionRequest + required: true + style: simple + schema: + type: string + format: uri + "400": + description: The request is invalid + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "415": + description: Unsupported Content Type + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + /notifications: + post: + tags: + - Notifications + summary: Used as callback URL for receiving Notifications + description: Post a notification object to a specific host + operationId: receiveNotification + requestBody: + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Notification' + required: true + responses: + "204": + description: No Content + "400": + description: The request is invalid + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "404": + description: Not Found + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method not allowed + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + "415": + description: Unsupported Content Type + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + /access-delegations: + post: + tags: + - Access Delegations + summary: Request delegated access on LogisticsObjects + description: Request an access delegation on a given LogisticsObjects + operationId: createAccessDelegationRequest + requestBody: + content: + application/ld+json: + schema: + $ref: '#/components/schemas/AccessDelegation' + required: true + responses: + "201": + description: Access Delegation Request has been created + headers: + Type: + description: Type of the created Access Delegation Request + required: true + style: simple + schema: + type: string + format: uri + Location: + description: Location of the created Access Delegation Request + required: true + style: simple + schema: + type: string + format: uri + "400": + description: Invalid Access Delegation Object + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "415": + description: Unsupported Content Type + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + /action-requests/{actionRequestId}: + get: + tags: + - Action Requests + summary: Retrieve an ActionRequest + description: Get any type of ActionRequest by the id + operationId: getActionRequest + parameters: + - name: actionRequestId + in: path + required: true + schema: + type: string + responses: + "200": + description: OK + headers: + Type: + description: Type of the retrieved Action Request + required: true + style: simple + schema: + type: string + format: uri + Last-Modified: + description: The date and time of the most recent change to the Action Request + required: true + style: simple + schema: + type: string + format: HTTP-date + example: "Tue, 21 Feb 2023 07:28:00 GMT" + content: + application/ld+json: + schema: + oneOf: + - $ref: '#/components/schemas/ActionRequest' + - $ref: '#/components/schemas/AccessDelegationRequest' + - $ref: '#/components/schemas/ChangeRequest' + - $ref: '#/components/schemas/SubscriptionRequest' + "301": + description: The URI of the Action Request has permanently changed. + headers: + Location: + description: New location of the LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + "302": + description: The URI of the Action Request has temporarily moved. + headers: + Location: + description: New location of the LogisticsObject + required: true + style: simple + schema: + type: string + format: uri + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "404": + description: Logistics Object not found + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "415": + description: Unsupported Content Type + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + patch: + tags: + - Action Requests + summary: "INTERNAL: Update an ActionRequest" + description: Update the status of an ActionRequest + operationId: updateActionRequest + parameters: + - name: actionRequestId + in: path + required: true + schema: + type: string + - name: status + in: query + required: true + schema: + type: string + enum: [https://onerecord.iata.org/ns/api#REQUEST_ACCEPTED, https://onerecord.iata.org/ns/api#REQUEST_REJECTED, https://onerecord.iata.org/ns/api#REQUEST_REVOKED] + responses: + "204": + description: The Action Request was successfully updated + headers: + Type: + description: Type of retrieved Action Request + required: true + style: simple + schema: + type: string + format: uri + "400": + description: The update request body is invalid + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "404": + description: Action Request not found + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "415": + description: Unsupported Content Type + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "422": + description: Unprocessable request + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - Action Requests + summary: Revoke an Action Request + description: Revoke an Action Request + operationId: revokeActionRequest + parameters: + - name: actionRequestId + in: path + required: true + schema: + type: string + responses: + "204": + description: The Action Request was successfully deleted + "401": + description: Not authenticated + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "403": + description: Not authorized + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "404": + description: Action Request not found + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Internal Server Error + content: + application/ld+json: + schema: + $ref: '#/components/schemas/Error' +components: + schemas: + AccessDelegation: + description: Access to a Logistics Object delegated to an Organization + properties: + https://onerecord.iata.org/ns/api#hasDescription: + description: Reason for the request (optional) + items: + maxItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasPermission: + description: Description not available + items: + $ref: '#/components/schemas/Permission' + minItems: 1 + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#AccessDelegation + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/api#hasLogisticsObject: + description: A reference to a cargo:LogisticsObject. + items: + $ref: '#/components/schemas/LogisticsObject' + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#isRequestedFor: + description: Description not available + items: + $ref: '#/components/schemas/Organization' + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#notifyRequestStatusChange: + description: Flag specifying if the requestor wants to receive Notification + from the publisher when the status of an action request changed, default=FALSE + items: + maxItems: 1 + minItems: 1 + type: boolean + type: array + '@id': + description: Resource Identifier + type: string + type: object + OperationObject: + description: Object to modify in the PATCH request + properties: + https://onerecord.iata.org/ns/api#hasValue: + description: Updated value for the field + items: + maxItems: 1 + minItems: 1 + type: string + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#OperationObject + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/api#hasDatatype: + description: Data type of the field to update, must be a valid URI, e.g. + http://www.w3.org/2001/XMLSchema#int + items: + maxItems: 1 + minItems: 1 + type: string + type: array + '@id': + description: Resource Identifier + type: string + type: object + Error: + description: Error model + properties: + https://onerecord.iata.org/ns/api#hasTitle: + description: Short summary of the error + items: + maxItems: 1 + minItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasErrorDetail: + description: Error details + items: + $ref: '#/components/schemas/ErrorDetail' + minItems: 1 + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#Error + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + AccessPermissions: + description: Access permissions granted to a logistics agent for a logistics + object + properties: + https://onerecord.iata.org/ns/api#hasPermission: + description: Description not available + items: + $ref: '#/components/schemas/Permission' + minItems: 1 + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#AccessPermissions + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/api#hasLogisticsObject: + description: A reference to a cargo:LogisticsObject. + items: + $ref: '#/components/schemas/LogisticsObject' + maxItems: 1 + minItems: 1 + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/api#hasLogisticsAgent: + description: Description not available + items: + $ref: '#/components/schemas/LogisticsAgent' + maxItems: 1 + minItems: 1 + type: array + type: object + Change: + description: Description not available + properties: + https://onerecord.iata.org/ns/api#hasRevision: + description: Revision number of the Logistics Object, starting with 0 for + changing the initial revision of a Logistics Object + items: + format: int32 + maxItems: 1 + minItems: 1 + type: integer + type: array + https://onerecord.iata.org/ns/api#hasDescription: + description: Reason for the request (optional) + items: + maxItems: 1 + type: string + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#Change + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/api#hasLogisticsObject: + description: A reference to a cargo:LogisticsObject. + items: + $ref: '#/components/schemas/LogisticsObject' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#notifyRequestStatusChange: + description: Flag specifying if the requestor wants to receive Notification + from the publisher when the status of an action request changed, default=FALSE + items: + maxItems: 1 + minItems: 1 + type: boolean + type: array + https://onerecord.iata.org/ns/api#hasOperation: + description: Operation(s) to apply as PATCH on a Logistics Object + items: + $ref: '#/components/schemas/Operation' + minItems: 1 + type: array + '@id': + description: Resource Identifier + type: string + type: object + Operation: + description: Operation Request contained in the PATCH body + properties: + https://onerecord.iata.org/ns/api#s: + description: Operation objects MUST have exactly one "s", subject, member. + The value of this member MUST be one of IRI or blank node. + items: + maxItems: 1 + minItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#p: + description: Operations objects must have exactly one p, predicate, member. + The value of this member must be an URI, e.g. https://onerecord.iata.org/ns/cargo#hasGoodsDescription + items: + maxItems: 1 + minItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#o: + description: Description not available + items: + $ref: '#/components/schemas/OperationObject' + maxItems: 1 + minItems: 1 + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#Operation + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/api#op: + description: Operation + items: + $ref: '#/components/schemas/PatchOperation' + maxItems: 1 + minItems: 1 + type: array + '@id': + description: Resource Identifier + type: string + type: object + ChangeRequest: + description: Change Request containing updates on a Logistics Object + properties: + https://onerecord.iata.org/ns/api#hasError: + description: Error object(s) if the processing was not successful + items: + $ref: '#/components/schemas/Error' + type: array + https://onerecord.iata.org/ns/api#isRequestedAt: + description: Datetime when the request was created + items: + format: date-time + maxItems: 1 + minItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#isRevokedAt: + description: The datetime when the action request was revoked. + items: + format: date-time + maxItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasRequestStatus: + description: has Request Status + items: + $ref: '#/components/schemas/RequestStatus' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#hasRevision: + description: Revision number of the Logistics Object, starting with 0 for + changing the initial revision of a Logistics Object + items: + format: int32 + type: integer + type: array + https://onerecord.iata.org/ns/api#isRequestedBy: + description: Organization Identifier that represents the Organization that + has requested the action + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#isRevokedBy: + description: Description not available + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + type: array + https://onerecord.iata.org/ns/api#hasChange: + description: Contains submitted Change object + items: + $ref: '#/components/schemas/Change' + maxItems: 1 + minItems: 1 + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#ChangeRequest + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + Notification: + description: Notification sent by the publisher to the subscriber + properties: + https://onerecord.iata.org/ns/api#isTriggeredBy: + description: Optional URI to the ChangeRequest that triggered a Notification + if the eventType is one of CHANGE_REQUEST_ACCEPTED, CHANGE_REQUEST_REJECT, + or CHANGE_REQUEST_FAILED + items: + $ref: '#/components/schemas/ActionRequest' + maxItems: 1 + type: array + https://onerecord.iata.org/ns/api#hasEventType: + description: Description not available + items: + $ref: '#/components/schemas/NotificationEventType' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#hasLogisticsObjectType: + description: The type of cargo:LogisticsObject in the notification e.g. + https://onerecord.iata.org/ns/cargo#Piece + items: + maxItems: 1 + type: string + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#Notification + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/api#hasLogisticsObject: + description: A reference to a cargo:LogisticsObject. + items: + $ref: '#/components/schemas/LogisticsObject' + maxItems: 1 + type: array + https://onerecord.iata.org/ns/api#hasChangedProperty: + description: List of all changed properties as IRIs after a ChangeRequest + was successfully applied, e.g. [https://onerecord.iata.org/ns/cargo#hasVolumetricWeight, + https://onerecord.iata.org/ns/cargo/#hasGoodsDescription] + items: + type: string + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/api#hasTopic: + description: The Logistics Object type or specific Logistics Object to which + the subscription belongs to e.g. https://onerecord.iata.org/Piece or https://1r.example.com/7f01363f-0c6a-4414-be48-d3692e219b91 + items: + type: string + type: array + type: object + ErrorDetail: + description: Error details that belong to an error + properties: + https://onerecord.iata.org/ns/api#hasProperty: + description: Property of the object for which the error applies in IRI format, + i.e. https://onerecord.iata.org/ns/cargo#hasVolumetricWeight + items: + maxItems: 1 + type: string + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#ErrorDetail + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/api#hasCode: + description: Error code is a numeric or alphanumeric code that can be used + to determine the source of the error and why it occured. + items: + maxItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasResource: + description: URI of the object where the error occurred + items: + maxItems: 1 + type: string + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/api#hasMessage: + description: Message that describes the error + items: + maxItems: 1 + type: string + type: array + type: object + TopicType: + description: Description not available + properties: + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#TopicType + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + SubscriptionRequest: + description: SubscriptionRequest initiated by subscribers to publisher (data + holder) for themselves or for a third party subscriber. + properties: + https://onerecord.iata.org/ns/api#hasError: + description: Error object(s) if the processing was not successful + items: + $ref: '#/components/schemas/Error' + type: array + https://onerecord.iata.org/ns/api#isRequestedAt: + description: Datetime when the request was created + items: + format: date-time + maxItems: 1 + minItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#isRevokedAt: + description: The datetime when the action request was revoked. + items: + format: date-time + maxItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasRequestStatus: + description: has Request Status + items: + $ref: '#/components/schemas/RequestStatus' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#isRequestedBy: + description: Organization Identifier that represents the Organization that + has requested the action + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#isRevokedBy: + description: Description not available + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#SubscriptionRequest + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/api#hasSubscription: + description: Link to the requestors Subscription object with all subscription + information + items: + $ref: '#/components/schemas/Subscription' + maxItems: 1 + minItems: 1 + type: array + '@id': + description: Resource Identifier + type: string + type: object + ServerInformation: + description: Information about the ONE Record server + properties: + https://onerecord.iata.org/ns/api#hasSupportedEncoding: + description: Optional list of supported encodings of the ONE Record server, + e.g. gzip + items: + type: string + type: array + https://onerecord.iata.org/ns/api#hasSupportedLanguage: + description: Supported languages of the ONE Record API, minimum is en-US + (American English) + items: + minItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasSupportedOntologyVersion: + description: Supported ontology versions on the server, MUST be versioned + IRIs + items: + minItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasServerEndpoint: + description: ONE Record API endpoint + items: + maxItems: 1 + minItems: 1 + type: string + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#ServerInformation + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/api#hasSupportedOntology: + description: Supported ontologies on the server, MUST be non-versioned IRIs + items: + minItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasDataHolder: + description: The data holder of the servers data. + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + minItems: 1 + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/api#hasSupportedApiVersion: + description: Supported ONE Record API versions by the server, MUST include + at least one supported version. + items: + minItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasSupportedContentType: + description: Supported content types of the server, MUST contain at least + application/ld+json + items: + minItems: 1 + type: string + type: array + type: object + ActionRequest: + description: Superclass for all kinds of requests (i.e someone requsted something + (e.g. subscription, access, etc.) at a publisher/holder of a logistics object) + properties: + https://onerecord.iata.org/ns/api#hasError: + description: Error object(s) if the processing was not successful + items: + $ref: '#/components/schemas/Error' + type: array + https://onerecord.iata.org/ns/api#isRequestedAt: + description: Datetime when the request was created + items: + format: date-time + maxItems: 1 + minItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#isRevokedAt: + description: The datetime when the action request was revoked. + items: + format: date-time + maxItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasRequestStatus: + description: has Request Status + items: + $ref: '#/components/schemas/RequestStatus' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#isRequestedBy: + description: Organization Identifier that represents the Organization that + has requested the action + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#isRevokedBy: + description: Description not available + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#ActionRequest + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + NotificationEventType: + description: Description not available + properties: + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#NotificationEventType + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + SubscriptionEventType: + description: Description not available + properties: + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#SubscriptionEventType + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + AccessDelegationRequest: + description: Delegation Request to 3rd parties + properties: + https://onerecord.iata.org/ns/api#hasError: + description: Error object(s) if the processing was not successful + items: + $ref: '#/components/schemas/Error' + type: array + https://onerecord.iata.org/ns/api#isRequestedAt: + description: Datetime when the request was created + items: + format: date-time + maxItems: 1 + minItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#isRevokedAt: + description: The datetime when the action request was revoked. + items: + format: date-time + maxItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasAccessDelegation: + description: Description not available + items: + $ref: '#/components/schemas/AccessDelegation' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#hasRequestStatus: + description: has Request Status + items: + $ref: '#/components/schemas/RequestStatus' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#isRequestedBy: + description: Organization Identifier that represents the Organization that + has requested the action + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#isRevokedBy: + description: Description not available + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#AccessDelegationRequest + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + PatchOperation: + description: Description not available + properties: + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#PatchOperation + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + Permission: + description: Description not available + properties: + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#Permission + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + Collection: + description: Used as response of endpoints returning a collection of more than + one graph, i.e. more than one not linked subjects. + properties: + https://onerecord.iata.org/ns/api#hasTotalItems: + description: The number of total items contained in a collection + items: + format: int32 + maxItems: 1 + minItems: 1 + type: integer + type: array + https://onerecord.iata.org/ns/api#hasItems: + description: Item that is contained in a collection + items: + type: object + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#Collection + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + AuditTrail: + description: Audit trail of a Logistics Object + properties: + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#AuditTrail + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/api#hasChangeRequest: + description: Recorded change requests in the Audit Trail of a Logistics + Object + items: + $ref: '#/components/schemas/ChangeRequest' + type: array + https://onerecord.iata.org/ns/api#hasLatestRevision: + description: Latest revision of the Logistics Object. Starting with revision + 0 + items: + format: int32 + maxItems: 1 + minItems: 1 + type: integer + type: array + '@id': + description: Resource Identifier + type: string + type: object + Subscription: + description: Subscription information sent to the publisher + properties: + https://onerecord.iata.org/ns/api#hasTopicType: + description: Description not available + items: + $ref: '#/components/schemas/TopicType' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#hasSubscriber: + description: Description not available + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#includeSubscriptionEventType: + description: An array used to indicate the specific types of notifications + that the subscriber desires to receive from the publisher. The subscriber + is required to specify their preferences on a per-type basis + items: + $ref: '#/components/schemas/SubscriptionEventType' + minItems: 1 + type: array + https://onerecord.iata.org/ns/api#hasContentType: + description: Content types that the subscriber wants to receive in the notifications, + e.g. application/ld+json + items: + type: string + type: array + https://onerecord.iata.org/ns/api#expiresAt: + description: 'Expiry date as date time of the subscription information that + supports caching but does not require the ONE Record client to store the + datetime when the Subscription object was received; if not given: the + information does not expire' + items: + format: date-time + maxItems: 1 + type: string + type: array + https://onerecord.iata.org/ns/api#hasDescription: + description: Reason for the request (optional) + items: + maxItems: 1 + type: string + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#Subscription + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/api#notifyRequestStatusChange: + description: Flag specifying if the requestor wants to receive Notification + from the publisher when the status of an action request changed, default=FALSE + items: + maxItems: 1 + minItems: 1 + type: boolean + type: array + https://onerecord.iata.org/ns/api#sendLogisticsObjectBody: + description: Flag specifying if the publisher should send the whole logistics + object or not in the notification object + items: + maxItems: 1 + type: boolean + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/api#hasTopic: + description: The Logistics Object type or specific Logistics Object to which + the subscription belongs to e.g. https://onerecord.iata.org/Piece or https://1r.example.com/7f01363f-0c6a-4414-be48-d3692e219b91 + items: + maxItems: 1 + minItems: 1 + type: string + type: array + type: object + RequestStatus: + description: Description not available + properties: + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/api#RequestStatus + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + OtherIdentifier: + description: Other identifiers + properties: + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#OtherIdentifier + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#otherIdentifierType: + description: Identifier type or description + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#textualValue: + description: Textual value filled on use context (eg. characteristic colour, + contactDetail mail adress, etc.) + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + Address: + description: Address details + properties: + https://onerecord.iata.org/ns/cargo#country: + description: Country details. Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#streetAddressLines: + description: Street address including street name, street number, building + number, apartment etc + items: + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#addressCode: + description: Address identifier using special coding systems e.g. US CBP + FIRMS code + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#cityCode: + description: UN/LOCODE city code (5 letter) or IATA city code (3 letter) + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Address + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#postalCode: + description: Postal / ZIP code + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#postOfficeBox: + description: Post Office box number / code + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#regionCode: + description: Region/ State / Department. Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + type: object + BookingPreferences: + description: BookingPreferences details + properties: + https://onerecord.iata.org/ns/cargo#includedViaPoints: + description: Locations or stations to included in the routing + items: + $ref: '#/components/schemas/Location' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#excludedViaPoints: + description: Locations of excluded Via Points + items: + $ref: '#/components/schemas/Location' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#BookingPreferences + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#preferredTransportId: + description: When part of the Request it refers to the preferred Transport + ID from the customer. When part of the BookingOption (offer or actual + booking) it refers to the expected Transport ID or flight + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#priceReferenceId: + description: Reference to a price reference if existing (e.g. Allotment + number, contract reference, etc.) + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#aircraftPossibilityCode: + description: Type of aircraft to be used if any specific requirements (e.g. + Pure freighter, etc.) + items: + $ref: '#/components/schemas/AircraftPossibilityCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#maxSegments: + description: Maximum number of segments for the transportation of the goods. + 1 means direct flight + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + type: object + LogisticsAction: + description: 'Superclass: LogisticsAction is a specific task with a specific + result performed on one or more physical LOs by one party in the context of + an Activity' + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LogisticsAction + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionTimeType: + description: Enum stating the type of the Action + items: + $ref: '#/components/schemas/ActionTimeType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionStartTime: + description: DateTime holding the start time of the Action; Type is indicated + through ActionType property + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#performedAt: + description: Reference to the Location the Action was performed at + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#servedActivity: + description: Reference to the Activity the Action was performed for + items: + $ref: '#/components/schemas/LogisticsActivity' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionEndTime: + description: DateTime holding the end time of the Action; Type is indicated + through ActionType property + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + Check: + description: Action to describe a check + properties: + https://onerecord.iata.org/ns/cargo#checkedObject: + description: Reference to the checked Object + items: + $ref: '#/components/schemas/LogisticsObject' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checker: + description: Reference to the Actor performing the Check + items: + $ref: '#/components/schemas/Actor' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checkTotalResult: + description: Reference to the result of the Check + items: + $ref: '#/components/schemas/CheckTotalResult' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Check + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionTimeType: + description: Enum stating the type of the Action + items: + $ref: '#/components/schemas/ActionTimeType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionStartTime: + description: DateTime holding the start time of the Action; Type is indicated + through ActionType property + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#performedAt: + description: Reference to the Location the Action was performed at + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#servedActivity: + description: Reference to the Activity the Action was performed for + items: + $ref: '#/components/schemas/LogisticsActivity' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#usedTemplate: + description: Reference to the Template used in the Check + items: + $ref: '#/components/schemas/CheckTemplate' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionEndTime: + description: DateTime holding the end time of the Action; Type is indicated + through ActionType property + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + Adjustments: + description: Adjustments in the context of CASS records + properties: + https://onerecord.iata.org/ns/cargo#correctionSerialNumber: + description: Serial Number of the correction + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Adjustments + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#correctionNumber: + description: Number of the adjustment + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#reasonsForAdjustments: + description: A free text for user to include a reason for correction + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + Product: + description: Product details + properties: + https://onerecord.iata.org/ns/cargo#manufacturer: + description: Manufacturing company details and contacts + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherCharacteristics: + description: Charateristics of the product + items: + $ref: '#/components/schemas/Characteristic' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uniqueIdentifier: + description: Manufacturer's unique product identifier + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Product + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#describedObjects: + description: Reference to the Items or Pieces in which the product can be + found. + items: + $ref: '#/components/schemas/PhysicalLogisticsObject' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#description: + description: Natural language description if required + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#hsCommodityDescription: + description: Commodity description + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#hsCommodityName: + description: If no Code provided, name of commodity + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#hsCode: + description: Harmonized Commodity code, refer to hsType used. 6 minimum + digits are expected. + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#hsType: + description: Reference identifying the type of standard code to be used + for the Commodity Classification (Brussels Tariff Nomenclature, EU Harmonized + System Code, UN Standard International Trade Classification). Mandatory + if the commodity code is more than 6 digits + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#commodityItemNumber: + description: Indicates the specific commodity on which the rate class code + is applied + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + SpecialHandlingCode: + description: 'Source of DGR codes: Dangerous Goods Regulations, 46th Edition' + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#SpecialHandlingCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + PieceGroup: + description: PieceGroup details + properties: + https://onerecord.iata.org/ns/cargo#pieceGroupGrossWeight: + description: Total gross weight of the piece group + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dryIceWeight: + description: Weight of dry ice + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieceGroupId: + description: Identifier of the piece group, increasing integers + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#PieceGroup + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#pieceGroupCount: + description: Number of pieces in the piece group + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + type: object + CurrencyCode: + description: Open code list of currency codes based on ISO 4217 + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#CurrencyCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + RatingsType: + description: Restricted code list to describe whether a rating is Face, Published + or Actual + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#RatingsType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Item: + description: Item details + properties: + https://onerecord.iata.org/ns/cargo#weight: + description: Weight of the item + items: + $ref: '#/components/schemas/Value' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Item + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#dimensions: + description: Dimensions details + items: + $ref: '#/components/schemas/Dimensions' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#targetCountry: + description: Item target country. Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#ofProduct: + description: Reference to the Product describing the Item + items: + $ref: '#/components/schemas/Product' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#inPiece: + description: Reference to the Piece this Item or Piece is contained in + items: + $ref: '#/components/schemas/Piece' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#productionCountry: + description: Production country details. Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#itemQuantity: + description: Quantity of the item when applicable, with associated units + of measure + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#quantityForUnitPrice: + description: Product quantity for unit price - e.g. 12 (eggs for one USD + 1) + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#unitPrice: + description: Product price per unit in the base + items: + $ref: '#/components/schemas/CurrencyValue' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#lotNumber: + description: Production lot number / reference + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#batchNumber: + description: Production batch number / reference + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#expiryDate: + description: Product expiry date - e.g. for perishables goods or goods with + programmed obsolescence + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#productionDate: + description: Production date + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + type: object + ExternalReference: + description: Reference documents details + properties: + https://onerecord.iata.org/ns/cargo#originator: + description: Document originator details and contacts + items: + $ref: '#/components/schemas/Company' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#validUntil: + description: Validity end date (date of expiry) based on usage context + items: + format: date-time + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ExternalReference + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#createdAtLocation: + description: Location of the document, e.g. location where the document + was emitted + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#documentName: + description: 'If no DocumentType provided, name of the referenced document ' + items: + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#documentIdentifier: + description: Unique document identifier + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#documentVersion: + description: Document version number + items: + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#referenceForObjects: + description: References to the LogisticsObjects referring to this external + reference + items: + $ref: '#/components/schemas/LogisticsObject' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#documentLink: + description: Link to the document, e.g. URL of the file where it is hosted + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#checksum: + description: Checksum of the document to validate its integrity + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#validFrom: + description: Validity start date based on usage context + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#documentType: + description: Type of the referenced document . Can refer UNEDIFACT 11 e.g. + 74 - Air Waybill, but not limited to + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ExecutionStatus: + description: Restricted code list for the execution status of activities + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ExecutionStatus + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Actor: + description: 'Superclass: Actors are Persons or entities acting like a single + person' + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Actor + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#associatedOrganization: + description: Reference to the Organization the Actor is associated with + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + PublicAuthority: + description: PublicAuthorities are Organizations of the state on public interests, + such as customs + properties: + https://onerecord.iata.org/ns/cargo#parentOrganization: + description: Reference to the parent Organization + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#basedAtLocation: + description: Reference to the Location where the Organization is based at + or headquartered + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#PublicAuthority + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#name: + description: Human-understandable name of object depending on the context + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#shortName: + description: Short name of the Organization if any + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#subOrganization: + description: References to all sub-Organizations + items: + $ref: '#/components/schemas/Organization' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + EpermitConsignment: + description: Details of the pieces (Live animals) of the permit and specific + information such as quantity measured and used to date quota + properties: + https://onerecord.iata.org/ns/cargo#usedToDateQuotaQuantity: + description: total number of specimens exported in the current calendar + year and the current annuela quota for the species concerned (box 11a) + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#EpermitConsignment + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#consignmentItems: + description: Reference to te pieces (Live Animals) of the permit + items: + $ref: '#/components/schemas/PieceLiveAnimals' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#epermit: + description: Reference to the Epermit of the consignment + items: + $ref: '#/components/schemas/LiveAnimalsEpermit' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#examiningQuantity: + description: Quatity measured by the examining authority (box 14) + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + DgDeclaration: + description: Dangerous goods declaration + properties: + https://onerecord.iata.org/ns/cargo#issuedForPiece: + description: Reference to the Piece the document was issued for + items: + $ref: '#/components/schemas/PieceDg' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#handlingInformation: + description: 'Free text. This may include items such as Control temperature + for substances stabilized by temperature control, name and telephone number + of a responsible person for infectious substances. ' + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#DgDeclaration + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#shipperDeclarationText: + description: Contains the shipper's declaration to comply with the regulations + text note. Free text . This field is mandatory for air (Air) + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#aircraftLimitationInformation: + description: 'Contains the Special Handling Code related to the prescribed + limitation. Hardcoded to PASSENGER AND CARGO AIRCRAFT or CARGO AIRCRAFT + ONLY. This field is mandatory for air (Air) ' + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#exclusiveUseIndicator: + description: Indicates an exclusive use shipment + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#complianceDeclarationText: + description: 'Contains the warning message complying with the regulations + text note. This field is mandatory for air (Air) ' + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + PrepaidCollectIndicator: + description: Restricted code list corresponding to cXML code list 1.5 Prepaid/Collect + Indicators + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#PrepaidCollectIndicator + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + DemurrageCode: + description: Restricted code list based on RP 1654 + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#DemurrageCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + RegulatedEntityCategoryCode: + description: Restricted code list of regulated entity categories, partially + corresponding to cXML code list 1.100 Customs, Security and Regulatory Control + Information Identifiers + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#RegulatedEntityCategoryCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + DgProductRadioactive: + description: 'Details of the radioactive products ' + properties: + https://onerecord.iata.org/ns/cargo#forProductDg: + description: Reference to the ProductDg this DgProductRadiosctive details + items: + $ref: '#/components/schemas/ProductDg' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#fissileExceptionReference: + description: Fissile exception reference, mandatory if Fissile Exception + Indicator is true. + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#DgProductRadioactive + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#isotopes: + description: DgRadioactiveIsotope. + items: + $ref: '#/components/schemas/DgRadioactiveIsotope' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#transportIndexNumeric: + description: Radioactive Transport-Index value of the package or all packed + in one. Conditionally mandator and applies to categories II-Yellow and + III-Yellow only; field only contains the value, if printed, TI must be + added as a prefix to the value to be printed in the Packing Instructions + column + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dgRaTypeCode: + description: 'The category of the package or all packed in one. Complete + text to be transmitted: I-White, II-Yellow, III-Yellow instead of I, II, + III' + items: + $ref: '#/components/schemas/RaTypeCode' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#fissileExceptionIndicator: + description: Indicates if Fissile is excepted + items: + maxItems: 1 + type: boolean + nullable: true + type: array + type: object + CarrierProduct: + description: Carrier product details + properties: + https://onerecord.iata.org/ns/cargo#productCode: + description: Carrier's product code + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#productDescription: + description: Carrier's product description + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#CarrierProduct + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#serviceLevelCode: + description: Service level code + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + type: object + Booking: + description: Booking object refers to a confirmed booking + properties: + https://onerecord.iata.org/ns/cargo#bookingRequest: + description: Reference to the Booking Request + items: + $ref: '#/components/schemas/BookingRequest' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Booking + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#issuedForWaybill: + description: Reference to the Waybill object + items: + $ref: '#/components/schemas/Waybill' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#waybillPrefix: + description: Prefix used for the Waybill Number. Refer to IATA Airlines + Codes + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#updateBookingOptionRequests: + description: References to BookingOptionRequests that request to update + the Booking + items: + $ref: '#/components/schemas/BookingOptionRequest' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#activitySequences: + description: Information about the Activities that are part of the Service + and their sequence + items: + $ref: '#/components/schemas/ActivitySequence' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#waybillNumber: + description: House or Master Waybill unique identifier + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#bookingStatus: + description: Status of the Booking + items: + $ref: '#/components/schemas/BookingStatus' + maxItems: 1 + nullable: true + type: array + type: object + RegulatedEntity: + description: Regulated Entity + properties: + https://onerecord.iata.org/ns/cargo#regulatedEntityExpiryDate: + description: Expiry date 4 digits month/year + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#RegulatedEntity + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#regulatedEntityIdentifier: + description: Regulated entity identifier as per IATA e-CSD/CSD Resolution + 65 + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#owningOrganization: + description: Reference to the Organization for which the RegulatedEntity + information is valid + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#regulatedEntityCategory: + description: Category code of the Regulated Entity + items: + $ref: '#/components/schemas/RegulatedEntityCategoryCode' + maxItems: 1 + nullable: true + type: array + type: object + PieceDg: + description: Dangerous Goods subtype of Piece + properties: + https://onerecord.iata.org/ns/cargo#overpackTypeCode: + description: 'Identifies the Logistic Unit package type. UN Recommendation + on Transport of Dangerous Goods, Model Regulations ' + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#overpackT1: + description: 'A single number assigned to a package, overpack or freight + container to provide control over radiation exposure. ' + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#goodsDescription: + description: Description of goods, for the BookingShipment the commodity + list defined by Modernizing Cargo Distribution MCD working group can be + used as a referential. + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#PieceDg + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contentProducts: + description: Reference to the Products describing the content of the Piece, + mandatory if no data on Item level is used + items: + $ref: '#/components/schemas/Product' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dimensions: + description: Dimensions details + items: + $ref: '#/components/schemas/Dimensions' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#ofShipment: + description: Reference to the Shipment the Piece is assigned to + items: + $ref: '#/components/schemas/Shipment' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#containedPieces: + description: Details of contained piece(s) + items: + $ref: '#/components/schemas/Piece' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#packageMarkCoded: + description: Reference identifying how the package is marked. Field is hardcode + to "SSCC-18", "UPC" or "Other" + items: + $ref: '#/components/schemas/PackageMarkCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#volumetricWeight: + description: Volumetric weight details + items: + $ref: '#/components/schemas/VolumetricWeight' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#inPiece: + description: Reference to the Piece this Item or Piece is contained in + items: + $ref: '#/components/schemas/Piece' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#packagingType: + description: 'Packaging details ' + items: + $ref: '#/components/schemas/PackagingType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#overpackIndicator: + description: 'Overpack indicator ' + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#nvdForCustoms: + description: When no value is declared for Customs, this field may be completed + with the value TRUE otherwise FALSE + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#shippingMarks: + description: Shipping marks + items: + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dgDeclaration: + description: Reference to the Dangerous Goods declaration + items: + $ref: '#/components/schemas/DgDeclaration' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#fulfillsUldTypeCode: + description: Text holding an ULD Type Code if the Piece fulfills it before + UnitComposition + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#nvdForCarriage: + description: When no value is declared for Carriage, this field may be completed + with the value TRUE otherwise FALSE + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#securityDeclarations: + description: Security details of the piece + items: + $ref: '#/components/schemas/SecurityDeclaration' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#allPackedInOneIndicator: + description: 'A statement identifying that the dangerous goods listed above + are all contained in the same outer packaging. Takes the form All packed + in one aaaa (description of packaging type) x nn (number of packages). + Applies to air transport only. (Air) ' + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadType: + description: Load type of the shipment or piece (Bulk, ULD, Pallet, Loose) + items: + $ref: '#/components/schemas/LoadType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedParties: + description: Information about other Parties involved depending on the context + of use + items: + $ref: '#/components/schemas/Party' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#qValueNumeric: + description: 'Most instances of all packed in one will require the addition + of the Q value which 1. Applies to air transport only. (Air) ' + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#stackable: + description: Stackable indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#packagedeIdentifier: + description: SSCC-18 code for the value of the package mark, company or + bar code, free text, pallet code, etc. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#grossWeight: + description: Weight details + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#coload: + description: Coload indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#containedItems: + description: Reference to the item(s) contained in the piece + items: + $ref: '#/components/schemas/Item' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contentProductionCountry: + description: Goods production country, mandatory when there are no Items. + Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#slac: + description: Shipper's Load And Count ( total contained piece count as + provided by shipper) + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#specialHandlingCodes: + description: Three-letter special handling code (SPH) + items: + $ref: '#/components/schemas/SpecialHandlingCode' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#customsInformation: + description: Customs details + items: + $ref: '#/components/schemas/CustomsInformation' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#overpackCriticalitySafetyIndexNumeric: + description: 'Applies to fissile material only, other than fissile excepted. + A numeric value expressed to one decimal place preceded by the letters + CSI. ' + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#upid: + description: Unique Piece Identifier (UPID) of the piece. Refer IATA Recommended + Practice 1689 + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#turnable: + description: Turnable indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + type: object + DirectionType: + description: Restricted code list for the direction of a MovementTime + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#DirectionType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + StationRemarks: + description: StationRemarks details + properties: + https://onerecord.iata.org/ns/cargo#station: + description: 'Reference to the station (Airport), mandatory ' + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#StationRemarks + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#remarksText: + description: Details of the remarks, mandatory + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + ItemDg: + description: Dangerous Goods subtype of Item + properties: + https://onerecord.iata.org/ns/cargo#reportableQuantity: + description: Reportable quantities, To and from the USA only + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#weight: + description: Weight of the item + items: + $ref: '#/components/schemas/Value' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#supplementaryInfoPrefix: + description: Additional information that may be added in addition to the + proper shipping name to more fully describe the goods or to identify a + particular condition + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ItemDg + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#dimensions: + description: Dimensions details + items: + $ref: '#/components/schemas/Dimensions' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#netWeightMeasure: + description: The total net weight of dangerous goods transported of this + line item. For air transport the value must be the volume or mass in each + package. + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#ofProduct: + description: Reference to the Product describing the Item + items: + $ref: '#/components/schemas/Product' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#inPiece: + description: Reference to the Piece this Item or Piece is contained in + items: + $ref: '#/components/schemas/Piece' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#itemQuantity: + description: Quantity of the item when applicable, with associated units + of measure + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#unitPrice: + description: Product price per unit in the base + items: + $ref: '#/components/schemas/CurrencyValue' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#batchNumber: + description: Production batch number / reference + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#supplementaryInfoSuffix: + description: Additional information that may be added in addition to the + proper shipping to more fully describe the goods or to identify a particular + condition + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#productionDate: + description: Production date + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#targetCountry: + description: Item target country. Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#emergencyContact: + description: Contains the Emergency contact name (e.g. the name of the agency) + and phone number (min required) + items: + $ref: '#/components/schemas/Person' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#productionCountry: + description: Production country details. Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#quantityForUnitPrice: + description: Product quantity for unit price - e.g. 12 (eggs for one USD + 1) + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#lotNumber: + description: Production lot number / reference + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#expiryDate: + description: Product expiry date - e.g. for perishables goods or goods with + programmed obsolescence + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + type: object + ULDBasicPiece: + description: ULDBasicPiece details + properties: + https://onerecord.iata.org/ns/cargo#pieceGroupGrossWeight: + description: Total gross weight of the piece group + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uldLoadingIndicator: + description: Indicator related to ULD loading (e.g. Main deck only) + items: + $ref: '#/components/schemas/ULDLoadingIndicator' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dryIceWeight: + description: Weight of dry ice + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieceGroupId: + description: Identifier of the piece group, increasing integers + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ULDBasicPiece + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#slac: + description: Shipper's Load And Count ( total contained piece count as + provided by shipper) + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#pieceGroupCount: + description: Number of pieces in the piece group + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + type: object + ParticipantIdentifier: + description: Open code list corresponding to cXML code list 1.36 Participant + Identifiers + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ParticipantIdentifier + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + BookingShipment: + description: Simplified shipment object that is to be used only for the distribution + scope where only a subset of data is known priori to operational phase. + properties: + https://onerecord.iata.org/ns/cargo#forBookingOptionRequest: + description: Reference to the BookingOptionRequest the information of the + LogisticsObject is detailling + items: + $ref: '#/components/schemas/BookingOptionRequest' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#temperatureInstructions: + description: Temperature instructions if a specific range + items: + $ref: '#/components/schemas/TemperatureInstructions' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#BookingShipment + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#pieceGroups: + description: Reference to the Piece groups of the shipment + items: + $ref: '#/components/schemas/PieceGroup' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#consolidationIndicator: + description: Indication if the shipment is a consolidation + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#specialServiceRequests: + description: Special service requests + items: + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#expectedCommodity: + description: Expected commodity of the shipment as per Commodity Code list. + Either this or expected HS code required + items: + $ref: '#/components/schemas/CommodityCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#specialHandlingCodes: + description: Three-letter special handling code (SPH) + items: + $ref: '#/components/schemas/SpecialHandlingCode' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#expectedHScode: + description: Expected commodity of the shipment as per HS code (at least + 6 digits). Either this or expectedCommodityCode required + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#textualHandlingInstructions: + description: Strings to provide free text handling instructions such as + SSR and OSI + items: + type: string + nullable: true + type: array + type: object + Person: + description: Person details + properties: + https://onerecord.iata.org/ns/cargo#employeeId: + description: Employee ID + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#middleName: + description: Middle name/ other name + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#firstName: + description: First name / given name + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#department: + description: Department / Division / Unit + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#jobTitle: + description: Job title / position + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Person + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#associatedOrganization: + description: Reference to the Organization the Actor is associated with + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#salutation: + description: 'Salutation ' + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#documents: + description: Linked documents to the person, e.g. driver's license, ID, + etc. + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactRole: + description: Contact type - e.g. Emergency contact, Customs contact, Customer + contact + items: + $ref: '#/components/schemas/ContactRole' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#lastName: + description: Last name / family name / surname + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + BookingOption: + description: Booking details + properties: + https://onerecord.iata.org/ns/cargo#additionalInformation: + description: Additional infromation related to the Booking Option, e.g. + sales details + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#bookingTimes: + description: Information about the Booking Times of a privded Booking Option + items: + $ref: '#/components/schemas/BookingTimes' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#forBookingOptionRequest: + description: Reference to the BookingOptionRequest the information of the + LogisticsObject is detailling + items: + $ref: '#/components/schemas/BookingOptionRequest' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#stationRemarks: + description: Remarks related to specific stations in the routing (e.g. Embargo + in XXX) + items: + $ref: '#/components/schemas/StationRemarks' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#requestMatch: + description: Indicates if the Booking Option is a match to the Booking Option + Request preferences + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#BookingOption + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#price: + description: Price of the Booking (if different from the offer) + items: + $ref: '#/components/schemas/Price' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#unitsPreference: + description: Reference to unit preferences of the request (e.g. kg or cm) + items: + $ref: '#/components/schemas/UnitsPreference' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#transportLegs: + description: Reference to the Transport Legs of the proposed routing + items: + $ref: '#/components/schemas/TransportLegs' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#forBookingRequest: + description: Reference to the Booking Request the of the Booking Option + items: + $ref: '#/components/schemas/BookingRequest' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#carrierProduct: + description: Reference to the Carrier product if known + items: + $ref: '#/components/schemas/CarrierProduct' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#statusBookingOption: + description: Status of the Booking Option + items: + $ref: '#/components/schemas/BookingOptionStatus' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#carrier: + description: Reference to the operating carrier + items: + $ref: '#/components/schemas/Carrier' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#offerValidFrom: + description: Date and time of beginning of offer validity + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#offerValidTo: + description: Date and time of end of offer validity + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#alternatives: + description: Description of the alternatives proposed that do not match + the Booking Option Request + items: + type: string + nullable: true + type: array + type: object + RaTypeCode: + description: Restricted code list based on cXML code list 1.84 Category Colour + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#RaTypeCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Organization: + description: 'Superclass: Organizations represent a kind of Agent corresponding + to social instititutions such as companies, societies, etc' + properties: + https://onerecord.iata.org/ns/cargo#parentOrganization: + description: Reference to the parent Organization + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#basedAtLocation: + description: Reference to the Location where the Organization is based at + or headquartered + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Organization + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#name: + description: Human-understandable name of object depending on the context + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#shortName: + description: Short name of the Organization if any + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#subOrganization: + description: References to all sub-Organizations + items: + $ref: '#/components/schemas/Organization' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + CheckTemplate: + description: | + CheckTemplate is the body of a check, holding links to multiple Question LOs and is provided by the party in charge of the template that is used + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#templatePurpose: + description: Purpose of the template + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#CheckTemplate + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#involvedParties: + description: Information about other Parties involved depending on the context + of use + items: + $ref: '#/components/schemas/Party' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#name: + description: Human-understandable name of object depending on the context + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#date: + description: DateTime on which the CheckTemplate was released + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#usedInCheck: + description: Reference to the Check the template was used in + items: + $ref: '#/components/schemas/Check' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#version: + description: Version of the template + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#questions: + description: References to all Questions that are part of this template + items: + $ref: '#/components/schemas/Question' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#legacyTemplate: + description: Reference to an ExternalReference holding a legacy templats + outside of ONE Record, such as a photo or pdf of a checksheet + items: + $ref: '#/components/schemas/ExternalReference' + maxItems: 1 + nullable: true + type: array + type: object + EventTimeType: + description: Restricted code list for acceptable event times + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#EventTimeType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ContactRole: + description: Open code list for roles of a contact + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ContactRole + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + LogisticsService: + description: 'Superclass: LogisticsService is a sequence of Activities provided + by one Party to another' + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LogisticsService + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#activitySequences: + description: Information about the Activities that are part of the Service + and their sequence + items: + $ref: '#/components/schemas/ActivitySequence' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + TemperatureInstructions: + description: TemperatureInstructions details + properties: + https://onerecord.iata.org/ns/cargo#minTemperature: + description: Minimum temperature of the range + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#maxTemperature: + description: Maximum temperature of the range + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#TemperatureInstructions + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + SecurityDeclaration: + description: Security declaration details + properties: + https://onerecord.iata.org/ns/cargo#issuedBy: + description: Name of person (or employee ID) who issued the security status + items: + $ref: '#/components/schemas/Person' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#receivedFrom: + description: Regulated entity that tendered the consignment + items: + $ref: '#/components/schemas/RegulatedEntity' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#SecurityDeclaration + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#regulatedEntityAcceptor: + description: Information about the accepting regulated entity of the Security + Declaration + items: + $ref: '#/components/schemas/RegulatedEntity' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#issuedOn: + description: Date and time when the security status was issued + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#screeningMethods: + description: "Screening methods which have been used to secure the cargo\n\ + PHS – Physical Inspection and/or hand search \nVCK - Visual check \nXRY-\ + \ X-ray equipment \nEDS - Explosive detection system \nEDD - Explosive\ + \ detection dogs\nETD - Explosive trace detection equipment - particles\ + \ or vapor \nCMD - Cargo metal detection\nAOM - Subjected to any other\ + \ means: this entry should be followed by free text specifying what other\ + \ mean was used to secure the cargo" + items: + $ref: '#/components/schemas/ScreeningMethod' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#securityStatus: + description: 'Security status indicator (CXML 1.13) - e.g. SPX- Cargo Secure + for Passenger and All-Cargo Aircraft ' + items: + $ref: '#/components/schemas/SecurityStatus' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#issuedForPiece: + description: Reference to the Piece the document was issued for + items: + $ref: '#/components/schemas/Piece' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#additionalSecurityInformation: + description: Any additional information that may be required by an ICAO + Member State + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#groundsForExemption: + description: "Exemption code - e.g. BIOM- Bio-Medical Samples \nSMUS - small\ + \ undersized shipments MAIL - mail\nBIOM - bio-medical samples\nDIPL -\ + \ diplomatic bags or diplomatic mail\nLFSM - life-saving materials NUCL\ + \ - nuclear materials\nTRNS - transfer or transshipment" + items: + $ref: '#/components/schemas/ScreeningExemption' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#regulatedEntityIssuer: + description: Regulated entity issuing the Security Declaration + items: + $ref: '#/components/schemas/RegulatedEntity' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherRegulatedEntities: + description: Any other regulated entity that accepts custody of the cargo + and accepts the security status originally issued + items: + $ref: '#/components/schemas/RegulatedEntity' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherScreeningMethods: + description: Other methods used to secure the cargo + items: + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + Party: + description: Refers to a Company and its role in a specific context, e.g Company + A as shipper. Cargo-XML Code List 1.15 can be used as a reference with the + addition of "Notify Party" + properties: + https://onerecord.iata.org/ns/cargo#partyDetails: + description: Reference to the Agent described by the role of the Party + items: + $ref: '#/components/schemas/LogisticsAgent' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#partyRole: + description: Role fo the Company in the context. Can refer to Code List + 1.36 in the CXML Toolkit + items: + $ref: '#/components/schemas/ParticipantIdentifier' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Party + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + ServiceCode: + description: Restricted code list corresponding to cXML code list 1.38 Service + Codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ServiceCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + BookingRequest: + description: A party, usually the freight forwarder, creates the BookingRequest + in order to confirm the booking to the Carrier + properties: + https://onerecord.iata.org/ns/cargo#forBookingOption: + description: Reference to the BookingOption the LogisticsObject is detailling + items: + $ref: '#/components/schemas/BookingOption' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#booking: + description: Reference to the Booking + items: + $ref: '#/components/schemas/Booking' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#BookingRequest + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#waybillPrefix: + description: Prefix used for the Waybill Number. Refer to IATA Airlines + Codes + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#waybillNumber: + description: House or Master Waybill unique identifier + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + Loading: + description: Action to describe onloading or offloading TransportMeans + properties: + https://onerecord.iata.org/ns/cargo#onTransportMeans: + description: Reference to the TransportMeans that is being onloaded or offloaded + items: + $ref: '#/components/schemas/TransportMeans' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Loading + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionTimeType: + description: Enum stating the type of the Action + items: + $ref: '#/components/schemas/ActionTimeType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionStartTime: + description: DateTime holding the start time of the Action; Type is indicated + through ActionType property + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadedUnits: + description: References to LoadingUnits onloaded or offloaded + items: + $ref: '#/components/schemas/LoadingUnit' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadedPieces: + description: References to Pieces onloaded or offloaded + items: + $ref: '#/components/schemas/Piece' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#performedAt: + description: Reference to the Location the Action was performed at + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadedMaterials: + description: References to Materials onloaded or offloaded + items: + $ref: '#/components/schemas/LoadingMaterial' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#servedActivity: + description: Reference to the Activity the Action was performed for + items: + $ref: '#/components/schemas/LogisticsActivity' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionEndTime: + description: DateTime holding the end time of the Action; Type is indicated + through ActionType property + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadingType: + description: Enum stating whether the LoadingAction describes onloading + or offloading + items: + $ref: '#/components/schemas/LoadingType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadingPositionIdentifier: + description: Short text stating the loading position in the TransportMeans + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + Piece: + description: Individual piece or virtual grouping of pieces + properties: + https://onerecord.iata.org/ns/cargo#goodsDescription: + description: Description of goods, for the BookingShipment the commodity + list defined by Modernizing Cargo Distribution MCD working group can be + used as a referential. + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Piece + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contentProducts: + description: Reference to the Products describing the content of the Piece, + mandatory if no data on Item level is used + items: + $ref: '#/components/schemas/Product' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dimensions: + description: Dimensions details + items: + $ref: '#/components/schemas/Dimensions' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#ofShipment: + description: Reference to the Shipment the Piece is assigned to + items: + $ref: '#/components/schemas/Shipment' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#containedPieces: + description: Details of contained piece(s) + items: + $ref: '#/components/schemas/Piece' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#packageMarkCoded: + description: Reference identifying how the package is marked. Field is hardcode + to "SSCC-18", "UPC" or "Other" + items: + $ref: '#/components/schemas/PackageMarkCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#volumetricWeight: + description: Volumetric weight details + items: + $ref: '#/components/schemas/VolumetricWeight' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#inPiece: + description: Reference to the Piece this Item or Piece is contained in + items: + $ref: '#/components/schemas/Piece' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#packagingType: + description: 'Packaging details ' + items: + $ref: '#/components/schemas/PackagingType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#nvdForCustoms: + description: When no value is declared for Customs, this field may be completed + with the value TRUE otherwise FALSE + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#shippingMarks: + description: Shipping marks + items: + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#fulfillsUldTypeCode: + description: Text holding an ULD Type Code if the Piece fulfills it before + UnitComposition + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#nvdForCarriage: + description: When no value is declared for Carriage, this field may be completed + with the value TRUE otherwise FALSE + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#securityDeclarations: + description: Security details of the piece + items: + $ref: '#/components/schemas/SecurityDeclaration' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadType: + description: Load type of the shipment or piece (Bulk, ULD, Pallet, Loose) + items: + $ref: '#/components/schemas/LoadType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedParties: + description: Information about other Parties involved depending on the context + of use + items: + $ref: '#/components/schemas/Party' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#stackable: + description: Stackable indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#packagedeIdentifier: + description: SSCC-18 code for the value of the package mark, company or + bar code, free text, pallet code, etc. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#grossWeight: + description: Weight details + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#coload: + description: Coload indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#containedItems: + description: Reference to the item(s) contained in the piece + items: + $ref: '#/components/schemas/Item' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contentProductionCountry: + description: Goods production country, mandatory when there are no Items. + Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#slac: + description: Shipper's Load And Count ( total contained piece count as + provided by shipper) + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#specialHandlingCodes: + description: Three-letter special handling code (SPH) + items: + $ref: '#/components/schemas/SpecialHandlingCode' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#customsInformation: + description: Customs details + items: + $ref: '#/components/schemas/CustomsInformation' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#upid: + description: Unique Piece Identifier (UPID) of the piece. Refer IATA Recommended + Practice 1689 + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#turnable: + description: Turnable indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + type: object + LoadingUnit: + description: Common loading unit/container details + properties: + https://onerecord.iata.org/ns/cargo#inUnitComposition: + description: Description not available + items: + $ref: '#/components/schemas/UnitComposition' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#tareWeight: + description: Tare weight of the empty ULD + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#remarks: + description: Remarks or Supplement Information + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LoadingUnit + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + CommodityCode: + description: Restricted code list of accepted commodities in carrier bookings + when no HS code available + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#CommodityCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + DangerousGoodsCode: + description: 'Source: Dangerous Goods Regulations, 46th Edition' + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#DangerousGoodsCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Question: + description: Question holds one question and a link to an Answer The Question + is provided by the party in charge of the template used + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Question + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#shortText: + description: Short text of the Question + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#answerOptionsText: + description: Text restrictions to the Answer + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#answer: + description: Reference to the Answer to the Question + items: + $ref: '#/components/schemas/Answer' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#questionNumber: + description: Number of the Question within the template (alphanumeric) + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checkTemplate: + description: Reference to the CheckTemplate the Question is from + items: + $ref: '#/components/schemas/CheckTemplate' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#answerOptionsValue: + description: Value restrictions to the answer + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#longText: + description: Long text of the question + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#questionSection: + description: Section of the CheckTemplate this Question is part of + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + MovementTime: + description: Times refering to Transport Movements, used to describe specfic + times such as Actual Departure time, etc. + properties: + https://onerecord.iata.org/ns/cargo#movementTimeType: + description: The type of time can be Actual, Estimated ot Scheduled + items: + $ref: '#/components/schemas/MovementTimeType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#direction: + description: Direction to indicate if it's Inbound or Outbound + items: + $ref: '#/components/schemas/DirectionType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#movementTimestamp: + description: Timestamp (date and time) of the movement time. If the movement + time is recorded asynchronously, the timestamp should reflect the actual + time, not when the data was created. + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#MovementTime + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#movementMilestone: + description: The milestone list still needs to be defined, it includes elements + from CXML Code List 1.92 but is not limited to those values, e.g. block-on + and block-off times might be added as a comparison to wheels off and touchdown. + items: + $ref: '#/components/schemas/MovementIndicator' + maxItems: 1 + nullable: true + type: array + type: object + WaybillType: + description: Restricted code list for Waybill types + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#WaybillType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ChargeIdentifier: + description: Restricted code list corresponding to cXML code list 1.33 Charge + Identifiers + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ChargeIdentifier + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ULDSpecificPiece: + description: ULDSpecificPiece details + properties: + https://onerecord.iata.org/ns/cargo#pieceGroupGrossWeight: + description: Total gross weight of the piece group + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uldContourCode: + description: Contour code as per IATA ULD Regulation + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uldType: + description: Type of ULD as per IATA ULD Regulation + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dryIceWeight: + description: Weight of dry ice + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieceGroupId: + description: Identifier of the piece group, increasing integers + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ULDSpecificPiece + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#slac: + description: Shipper's Load And Count ( total contained piece count as + provided by shipper) + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uldSerialNumber: + description: Serial number that allows to uniquely identify the ULD + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#pieceGroupCount: + description: Number of pieces in the piece group + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + type: object + ULDChargeCode: + description: Restricted code list corresponding to cXML code list 1.44 ULD Charge + Codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ULDChargeCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + WeightUnitCode: + description: Restricted sub-code list of weight units from MeasurementUnitCode + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#WeightUnitCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + UnitsPreference: + description: UnitsPreference details + properties: + https://onerecord.iata.org/ns/cargo#weightUnit: + description: Preferred unit for weight + items: + $ref: '#/components/schemas/WeightUnitCode' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#UnitsPreference + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#temperatureUnit: + description: Preferred unit for temperature + items: + $ref: '#/components/schemas/TemperatureUnitCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dimensionsUnit: + description: Preferred unit for measurement and dimensions + items: + $ref: '#/components/schemas/DimensionsUnitCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#volumeUnit: + description: Preferred unit for volume + items: + $ref: '#/components/schemas/VolumeUnitCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#currency: + description: Preferred unit for currency + items: + $ref: '#/components/schemas/CurrencyCode' + maxItems: 1 + nullable: true + type: array + type: object + MovementIndicator: + description: NOT FINAL YET - Open code list corresponding to cXML code list + 1.92 Movement Indicators + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#MovementIndicator + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Dimensions: + description: Dimension details + properties: + https://onerecord.iata.org/ns/cargo#width: + description: Width + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Dimensions + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#height: + description: Height + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#length: + description: Length + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#volume: + description: Volume + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + type: object + LoosePiece: + description: LoosePiece details + properties: + https://onerecord.iata.org/ns/cargo#pieceGroupGrossWeight: + description: Total gross weight of the piece group + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieceWeight: + description: Weight of a single piece + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieceWidth: + description: Width of a single piece + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieceLength: + description: Length of a single piece + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dryIceWeight: + description: Weight of dry ice + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieceGroupId: + description: Identifier of the piece group, increasing integers + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LoosePiece + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#pieceGroupCount: + description: Number of pieces in the piece group + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#stackable: + description: Stackable indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieceHeight: + description: Height of a single piece + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#turnable: + description: Turnable indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + type: object + DimensionsUnitCode: + description: Restricted sub-code list of length units from MeasurementUnitCode + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#DimensionsUnitCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + BookingOptionStatus: + description: Restricted code list containing the statuses of a booking option + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#BookingOptionStatus + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ContactDetail: + description: Contact details + properties: + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ContactDetail + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#textualValue: + description: Textual value filled on use context (eg. characteristic colour, + contactDetail mail adress, etc.) + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#contactDetailType: + description: Type of the contact details, e.g. Phone number, Mail address + items: + $ref: '#/components/schemas/ContactDetailType' + maxItems: 1 + nullable: true + type: array + type: object + ProductDg: + description: Dangerous Goods subtype of Product + properties: + https://onerecord.iata.org/ns/cargo#manufacturer: + description: Manufacturing company details and contacts + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherCharacteristics: + description: Charateristics of the product + items: + $ref: '#/components/schemas/Characteristic' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#hazardClassificationId: + description: Identifies the hazard class / division identification containing + a numeric field separated by a decimal + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#packagingDangerLevelCode: + description: Packing group, If used must reference I, II or III + items: + $ref: '#/components/schemas/PackagingDangerLevelCode' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ProductDg + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#describedObjects: + description: Reference to the Items or Pieces in which the product can be + found. + items: + $ref: '#/components/schemas/PhysicalLogisticsObject' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#description: + description: Natural language description if required + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#additionalHazardClassificationId: + description: 'Identifies the subsidiary hazard class / division identification + containing a numeric field separated by a decimal. There may be , 1 or + 2 subsidiary risk classes or divisions. If there is more than one, each + should be separated by a comma. The subsidiary risk must be shown in parentheses. ' + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#explosiveCompatibilityGroupCode: + description: Specifies the reference to the group which identifies the kind + of substances and articles that are deemed to be compatible. Mandatory + field in case of transport of explosive articles or substances + items: + $ref: '#/components/schemas/ExplosiveCompatibilityGroupCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#hsCode: + description: Harmonized Commodity code, refer to hsType used. 6 minimum + digits are expected. + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#commodityItemNumber: + description: Indicates the specific commodity on which the rate class code + is applied + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uniqueIdentifier: + description: Manufacturer's unique product identifier + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#authorizationInformation: + description: 'Contains additional information relating to an approval, permission + or other specific detail applicable to the commodity (e.g. Dangerous Goods + in excepted quantities) ' + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#properShippingName: + description: The name used to describe the particular article or substance + as shown in the UN Model Regulations Dangerous Goods List + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#hsCommodityDescription: + description: Commodity description + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dgRadioactiveMaterial: + description: Dg Radioactive Material + items: + $ref: '#/components/schemas/DgProductRadioactive' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#hsCommodityName: + description: If no Code provided, name of commodity + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#technicalName: + description: 'This is additional chemical name(s) required for some proper + shipping names. When added the technical must be shown in parentheses + immediately following the proper shipping name. ' + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#specialProvisionId: + description: 'For Air Mode: Special Provision may show a single, double + or triple digit number preceded by the letter A, against appropriate entries + in the List of Dangerous Goods' + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#unNumber: + description: Reference identifying the United Nations Dangerous Goods serial + number assigned within the UN to substances and articles contained in + a list of the dangerous goods most commonly carried. e.g. 1189 - Ethylene + glycol monomethyl ether acetate + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#hsType: + description: Reference identifying the type of standard code to be used + for the Commodity Classification (Brussels Tariff Nomenclature, EU Harmonized + System Code, UN Standard International Trade Classification). Mandatory + if the commodity code is more than 6 digits + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#packingInstructionNumber: + description: 'The packing instruction number applicable to the UN number + / proper shipping name entry. A three-numeric value which may be preceded + by the letter Y. Mandatory field for air transport (Air) ' + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + MeasurementUnitCode: + description: 'Source: UNECE Rec. 20 Rev. 17e-2021' + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#MeasurementUnitCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Insurance: + description: Insurance details + properties: + https://onerecord.iata.org/ns/cargo#coveringOrganization: + description: 'Party covering the insurance ' + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#insuredShipments: + description: Reference to the shipments insured + items: + $ref: '#/components/schemas/Organization' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Insurance + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#insuredAmount: + description: Insured amount - amount covered by the insurance policy + items: + $ref: '#/components/schemas/CurrencyValue' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + LogisticsActivity: + description: 'Superclass: LogisticsActivity is a scheduled set of tasks that + is executed as part of one or more Services' + properties: + https://onerecord.iata.org/ns/cargo#checkActions: + description: References to CheckActions performed for the Activity + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LogisticsActivity + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#servedServices: + description: Reference to Services this Activity is executed for + items: + $ref: '#/components/schemas/LogisticsService' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#executionStatus: + description: Enum stating the status of the Activity + items: + $ref: '#/components/schemas/ExecutionStatus' + maxItems: 1 + nullable: true + type: array + type: object + WaybillLineItem: + description: Information from AWB Rate Description section as per bullet point + 18 - data elements 22A - 22Z from AWB + properties: + https://onerecord.iata.org/ns/cargo#grossWeightForRate: + description: Gross weight for which the rate description details apply + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#rateClassCodeBasic: + description: Rate Surcharge/Reduction - Basic Rate Class Code + items: + $ref: '#/components/schemas/BasicRateClassCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uldType: + description: Type of ULD as per IATA ULD Regulation + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uldTareWeightForRate: + description: Information about the ULD tare weight used for the rate descbribed + by the Line Item + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#WaybillLineItem + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#dimensionsForRate: + description: Information about the Dimensions used for the rate descbribed + by the Line Item + items: + $ref: '#/components/schemas/Dimensions' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#volumetricWeightForRate: + description: Volumetric weight used for the rate described by this line + item + items: + $ref: '#/components/schemas/VolumetricWeight' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#productionCountryForRate: + description: Production country for the rate described by this Line Item. + Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#rcp: + description: IATA 3-letter city code of the rate combination point as defined + in TACT + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uldSerialNumber: + description: Serial number that allows to uniquely identify the ULD + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#slacForRate: + description: Slac used for the rate described by the Line item + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieceCountForRate: + description: Number of pieces for which the rate description details apply + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#hsCodeForRate: + description: Harmonized Commodity code, refer to hsType used. 6 minimum + digits are expected. + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#rateCharge: + description: TACT Rate for rate description details + items: + $ref: '#/components/schemas/CurrencyValue' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#goodsDescriptionForRate: + description: Goods description used in the rate described by the Line Item + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#commodityItemNumberForRate: + description: commodityItemNumberForRate + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#uldOwnerCode: + description: Information about the ULD owner code described in a ULD specific + piece or used for a rate in a Line Item + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#rateClassCode: + description: Rate class code e.g. Q. Refer to CXML Code List 1.4 Rate Class + Codes + items: + $ref: '#/components/schemas/RateClassCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#chargeableWeightForRate: + description: Chargeable weight for which the rate description details apply + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uldRateClassType: + description: ULD Rate information - ULD Rate Class Type + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#lineItemNumber: + description: Number of the line item + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#ratePercentage: + description: Rate Surcharge/Reduction - Percebtage of red. / surcharge + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + type: object + OtherChargeCode: + description: Restricted code list corresponding to cXML code list 1.2 Other + Charge Codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#OtherChargeCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Ranges: + description: Ranges details + properties: + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Ranges + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#maximumQuantity: + description: Maximum quantity + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#minimumQuantity: + description: Minimum quantity + items: + maxItems: 1 + type: number + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#rateClassCode: + description: Rate class code e.g. Q. Refer to CXML Code List 1.4 Rate Class + Codes + items: + $ref: '#/components/schemas/RateClassCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uldRateClassType: + description: ULD Rate information - ULD Rate Class Type + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#unitBasis: + description: Specific commodity code linked to commodity + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Company: + description: Company details + properties: + https://onerecord.iata.org/ns/cargo#parentOrganization: + description: Reference to the parent Organization + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#basedAtLocation: + description: Reference to the Location where the Organization is based at + or headquartered + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Company + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#name: + description: Human-understandable name of object depending on the context + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#iataCargoAgentLocationIdentifier: + description: IATA CASS cargo agent 4 digit branch number / location identifier + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#shortName: + description: Short name of the Organization if any + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#iataCargoAgentCode: + description: IATA accredited cargo agent 7 digit number + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#subOrganization: + description: References to all sub-Organizations + items: + $ref: '#/components/schemas/Organization' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + GoodsTypeExtensionCode: + description: Restricted code list referring to the CITES source codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#GoodsTypeExtensionCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Geolocation: + description: Geolocation details - e.g. for drones, automated vehicles + properties: + https://onerecord.iata.org/ns/cargo#longitude: + description: Location longitude decimal + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#latitude: + description: Location latitude decimal + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#elevation: + description: Elevation from sea level - Change of data type to Value as + of ontology v1.1 + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Geolocation + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + OtherCharge: + description: Other Charge details from AWB as per bullet point 19 - data element + 23 from AWB + properties: + https://onerecord.iata.org/ns/cargo#otherChargeAmount: + description: Other Charge amount + items: + $ref: '#/components/schemas/CurrencyValue' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#chargePaymentType: + description: Indicates if charge is prepaid or collect (P, C) + items: + $ref: '#/components/schemas/PrepaidCollectIndicator' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#OtherCharge + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#otherChargeCode: + description: Refer to CargoXML Code List 1.2 for Other Charges + items: + $ref: '#/components/schemas/OtherChargeCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#entitlement: + description: Entitlement code to define if charges are Due carrier (C) or + Due agent (A). Refer to CXML Code List 1.3 + items: + $ref: '#/components/schemas/EntitlementCode' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + VolumeUnitCode: + description: Restricted sub-code list of volume units from MeasurementUnitCode + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#VolumeUnitCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + LogisticsAgent: + description: 'Superclass: LogisticsAgents describe acting entities in the logistics + supply chain such as persons and organizations' + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LogisticsAgent + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + LoadingMaterial: + description: LoadingMaterial describes transportable, complementary non-Piece + objects such as dry ice or nets + properties: + https://onerecord.iata.org/ns/cargo#manufacturer: + description: Manufacturing company details and contacts + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LoadingMaterial + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#description: + description: Natural language description if required + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#serialNumber: + description: Serial number that allows to uniquely identify the object + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#materialModel: + description: Model of the LoadingMaterial if any + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#materialType: + description: Type of the LoadingMaterial + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + CompositionType: + description: Restricted code list for Composing subtypes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#CompositionType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ULD: + description: Unit Load Device details + properties: + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ULD + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#ownerCode: + description: Owner code of the ULD in aa, an or na format - owner can be + an airline or leasing company + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#serviceabilityCode: + description: 'Designator of serviceablity condition e.g. SER or DAM ' + items: + $ref: '#/components/schemas/ULDConditionCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uldSerialNumber: + description: Serial number that allows to uniquely identify the ULD + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#odlnCode: + description: Contains two designator codes of ODLN or Operational Damage + Limit Notices. ODLN code is used to define type of damage after visually + check the serviceability of ULDs section 7, Standard Specifications 4/3 + or 4/4 in ULD Regulations + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#numberOfFittings: + description: Number of fittings + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#tareWeight: + description: Tare weight of the empty ULD + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#remarks: + description: Remarks or Supplement Information + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#ataDesignator: + description: US / ATA Unit Load Device type code e.g. M2 + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#damageFlag: + description: Indicates if the ULD is Damaged + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#demurrageCode: + description: Contains three designator of demurrage code, refer to RP 1654 + (BCC, HHH, XXX, ZZZ) + items: + $ref: '#/components/schemas/DemurrageCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#uldTypeCode: + description: Standard Unit Load Device type code e.g. AKE - Certified Container + - Contoured. Refer to IATA ULD Technical Manual + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#numberOfNets: + description: Number of nets + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#numberOfDoors: + description: Number of doors + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#inUnitComposition: + description: Description not available + items: + $ref: '#/components/schemas/UnitComposition' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#numberOfStraps: + description: Number of straps + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadingIndicator: + description: ULD height or loading limitation code. Refer CXML Code List + 1.47, e.g. R - ULD Height above 244 centimetres + items: + $ref: '#/components/schemas/ULDLoadingIndicator' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#sealNumber: + description: ULD seal number if applicable + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ActionTimeType: + description: Restricted code list for acceptable action times + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ActionTimeType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + StatusCode: + description: Restricted code list corresponding to cXML code list 1.18 Status + Codes, including DIS discrepancy codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#StatusCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + CustomsInformation: + description: Customs information details + properties: + https://onerecord.iata.org/ns/cargo#otherCustomsInformation: + description: Supplementary Customs, Security and Regulatory Control Information + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#country: + description: Country details. Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contentCode: + description: |- + Customs, Security and Regulatory Control Information Identifier. Coded indicator qualifying Customs related information: Item Number "I", Exemption Legend "L", System Downtime Reference "S", Unique Consignment Reference Number "U", Movement Reference Number "M" . + Refers to Code List 1.1 + Condition: At least one of the three elements (Country Code, Information Identifier or Customs, Security and Regulatory Control Information Identifier) must be completed + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#CustomsInformation + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#subjectCode: + description: "Information Identifier. Code identifying a piece of information/entity\ + \ e.g. \"IMP\" for import, \"EXP\" for export, \"AGT\" for Agent, \"ISS\"\ + \ for The Regulated Agent Issuing the Security Status for a Consignment\ + \ etc. \nCondition: At least one of the three elements (Country Code,\ + \ Information Identifier or Customs, Security and Regulatory Control Information\ + \ Identifier) must be completed" + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#issuedForPiece: + description: Reference to the Piece the document was issued for + items: + $ref: '#/components/schemas/Piece' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#note: + description: Free text for customs remarks, not used in OCI Composition + Rules Table + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#issuedForShipment: + description: Reference to the shipment the document was issued for + items: + $ref: '#/components/schemas/Shipment' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + Ratings: + description: Ratings details + properties: + https://onerecord.iata.org/ns/cargo#ranges: + description: Reference to the ranges + items: + $ref: '#/components/schemas/Ranges' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#chargePaymentType: + description: Indicates if charge is prepaid or collect (P, C) + items: + $ref: '#/components/schemas/PrepaidCollectIndicator' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Ratings + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#forPrices: + description: Reference to the Prices based on this Ratings + items: + $ref: '#/components/schemas/Price' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#subTotal: + description: Subtotal of the charge + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#quantity: + description: Quantity for the charge if applicable + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#priceReferenceId: + description: Reference to a price reference if existing (e.g. Allotment + number, contract reference, etc.) + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#rcp: + description: IATA 3-letter city code of the rate combination point as defined + in TACT + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#entitlement: + description: Entitlement code to define if charges are Due carrier (C) or + Due agent (A). Refer to CXML Code List 1.3 + items: + $ref: '#/components/schemas/EntitlementCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#chargeDescription: + description: Description of the charge e.g. Airfreight, fuel, etc. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherChargeCode: + description: Refer to CargoXML Code List 1.2 for Other Charges + items: + $ref: '#/components/schemas/OtherChargeCode' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#priceSpecification: + description: Specification of the price e.g. Street, Group, Spot, etc. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#billingChargeIdentifier: + description: Billing charge identifiers to be used for CASS. Refer to CargoXML + Code List 1.33 + items: + $ref: '#/components/schemas/ChargeIdentifier' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#chargeType: + description: Charge type related to amount total as per bullet points 2/21 + - data elements 24A - 3B from AWB + items: + $ref: '#/components/schemas/ChargeIdentifier' + maxItems: 1 + nullable: true + type: array + type: object + ScreeningMethod: + description: Restricted code list corresponding to cXML code list 1.102 Screening + Methods + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ScreeningMethod + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + LiveAnimalsEpermit: + description: Epermit for Live Animals details + properties: + https://onerecord.iata.org/ns/cargo#signatures: + description: List of all the signatures of the Epermit (applicant box 4, + issuing authority box 6, issuer box 13 and examining authority box 14) + items: + $ref: '#/components/schemas/EpermitSignature' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#permitTypeOtherDescription: + description: Description if TypeCode is Other (box 1) + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#transactionPurposeCode: + description: Code indicating the purpose of the transaction (box 5a) + items: + $ref: '#/components/schemas/TransactionPurposeCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#validUntil: + description: Validity end date (date of expiry) based on usage context + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LiveAnimalsEpermit + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#transportContractTypeCode: + description: Code specifying the transport document name (box 15) + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#copyIndicator: + description: Indicates if the permit is a copy (true) or an original (false) + (box 1) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#epermitNumber: + description: The original number is a unique number allocated to each document + by the relevant Management Authority. (box 1) + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#transportContractId: + description: Reference to the Air Waybill or other transport contract document + (box 15) + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#consignee: + description: Reference to the Organization that fulfills the role of the + consignee, for a LiveAnimalsEpermit it has to include complete name and + address (box 3) + items: + $ref: '#/components/schemas/Company' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#specialConditions: + description: Special conditions (box 5) + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#consignments: + description: Reference to the pieces and properties linked to the Permit + (box 7 to 12) + items: + $ref: '#/components/schemas/EpermitConsignment' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#transactionPurpose: + description: Purpose of the transaction in free text (box 5a) + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#permitTypeCode: + description: Code specifying the document name. (box 1) + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#validFrom: + description: Validity start date based on usage context + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + type: object + TransportMovement: + description: Activity to describe transports, replaces the TransportSegment + in v1.1 and above + properties: + https://onerecord.iata.org/ns/cargo#checkActions: + description: References to CheckActions performed for the Activity + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#co2Emissions: + description: References to CO2Emissions + items: + $ref: '#/components/schemas/CO2Emissions' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#seal: + description: Seal identifier + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#TransportMovement + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#executionStatus: + description: Enum stating the status of the Activity + items: + $ref: '#/components/schemas/ExecutionStatus' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#fuelType: + description: e.g. Kerosene, Diesel, SAF, Electricity [renewable], Electricity + [non-renewable] + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#distanceMeasured: + description: Information about the measured distance + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#modeCode: + description: Mode of transport code, refer to UNECE Rec. 19 https://unece.org/fileadmin/DAM/cefact/recommendations/rec19/rec19_1cf19e.pdf + items: + $ref: '#/components/schemas/ModeCode' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#fuelAmountMeasured: + description: Information about the measured fuel amount + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#servedServices: + description: Reference to Services this Activity is executed for + items: + $ref: '#/components/schemas/LogisticsService' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#movementTimes: + description: Information about times related to the movement (milestone + list to be defined) + items: + $ref: '#/components/schemas/MovementTime' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#fuelAmountCalculated: + description: Information about the calculated fuel amount + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#modeQualifier: + description: Pre-Carriage, Main-Carriage or On-Carriage + items: + $ref: '#/components/schemas/ModeQualifier' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#departureLocation: + description: Reference to the depature Location + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#distanceCalculated: + description: Information about the calculated distance + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#arrivalLocation: + description: Reference to the arrival Location + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadingActions: + description: References to all actions of type Loading performed for the + TransportMovement + items: + $ref: '#/components/schemas/Loading' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#transportIdentifier: + description: Airline flight number, or rail/truck/maritime line id + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#operatingTransportMeans: + description: Reference to the TransportMeans operating the TransportMovement + items: + $ref: '#/components/schemas/TransportMeans' + maxItems: 1 + nullable: true + type: array + type: object + Carrier: + description: Company details of carriers + properties: + https://onerecord.iata.org/ns/cargo#parentOrganization: + description: Reference to the parent Organization + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#airlineCode: + description: IATA two-character airline code + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#basedAtLocation: + description: Reference to the Location where the Organization is based at + or headquartered + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Carrier + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#prefix: + description: IATA three-numeric airline prefix number + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#name: + description: Human-understandable name of object depending on the context + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#iataCargoAgentLocationIdentifier: + description: IATA CASS cargo agent 4 digit branch number / location identifier + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#shortName: + description: Short name of the Organization if any + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#iataCargoAgentCode: + description: IATA accredited cargo agent 7 digit number + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#subOrganization: + description: References to all sub-Organizations + items: + $ref: '#/components/schemas/Organization' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + PackageMarkCode: + description: Open code list of indicators of how a package is marked + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#PackageMarkCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ScreeningExemption: + description: Restricted code list corresponding to cXML code list 1.104 Screening + Exemptions + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ScreeningExemption + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ExplosiveCompatibilityGroupCode: + description: 'Source: DGR Table 3.1.A Compatibility group for explosives' + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ExplosiveCompatibilityGroupCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + SignatureTypeCode: + description: 'Source: CITES' + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#SignatureTypeCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + AWBUseIndicator: + description: Restricted code list to describe Revenue, Service and Void AWBs + based on CASS 2.0 + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#AWBUseIndicator + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + VolumetricWeight: + description: Volumetric weight details + properties: + https://onerecord.iata.org/ns/cargo#conversionFactor: + description: Volume to weight conversion factor + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#chargeableWeight: + description: Chargeable weight + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#VolumetricWeight + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + Characteristic: + description: Product additional details + properties: + https://onerecord.iata.org/ns/cargo#characteristicType: + description: Product characteristics code - e.g. CLR - Color. Not restricted + to a list. + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Characteristic + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#textualValue: + description: Textual value filled on use context (eg. characteristic colour, + contactDetail mail adress, etc.) + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + TransportMeansServiceType: + description: Restricted code list of possible transport means in transport legs + in carrier bookings + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#TransportMeansServiceType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + EpermitSignature: + description: Signature details of the Epermit for Live Animals + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#EpermitSignature + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#signatoryRole: + description: 'Role of the signatory with regards to the ePermit: Applicant, + Permit issuer, Issuing Authority or Examining authority' + items: + $ref: '#/components/schemas/SignatoryRole' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#securityStampId: + description: Security Stamp ID + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#signatureStatement: + description: Signatory signature authentication text + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#signatoryCompany: + description: Signatory company name + items: + $ref: '#/components/schemas/Company' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#forEpermit: + description: Reference to the LiveAnimalsEpermit this Signature applies + to + items: + $ref: '#/components/schemas/LiveAnimalsEpermit' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#signatureDate: + description: Date and time of the signature + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#signatureTypeCode: + description: Code specifying a type of government action such as inspection, + detention, fumigation, security. + items: + $ref: '#/components/schemas/SignatureTypeCode' + maxItems: 1 + nullable: true + type: array + type: object + Shipment: + description: Shipment details + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#totalVolumetricWeight: + description: Volumetric weight of the whole shipment + items: + $ref: '#/components/schemas/VolumetricWeight' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#goodsDescription: + description: Description of goods, for the BookingShipment the commodity + list defined by Modernizing Cargo Distribution MCD working group can be + used as a referential. + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Shipment + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#waybill: + description: Reference to the Waybill of the shipment + items: + $ref: '#/components/schemas/Waybill' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedParties: + description: Information about other Parties involved depending on the context + of use + items: + $ref: '#/components/schemas/Party' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#totalDimensions: + description: Dimensions of the whole shipment + items: + $ref: '#/components/schemas/Dimensions' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#incoterms: + description: Standard codes as defined by UNCEFACT and ICC that correspond + to international rules for the interpretation of the most commonly used + trade terms in different countries. UNECE recommendation n. 5 Incoterms + 2. + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieces: + description: References to the Pieces that are part of this Shipment + items: + $ref: '#/components/schemas/Piece' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#specialHandlingCodes: + description: Three-letter special handling code (SPH) + items: + $ref: '#/components/schemas/SpecialHandlingCode' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#totalGrossWeight: + description: Total gross weight of the whole shipment + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#customsInformation: + description: Customs details + items: + $ref: '#/components/schemas/CustomsInformation' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#insurance: + description: Insurance details + items: + $ref: '#/components/schemas/Insurance' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#textualHandlingInstructions: + description: Strings to provide free text handling instructions such as + SSR and OSI + items: + type: string + nullable: true + type: array + type: object + TransactionPurposeCode: + description: Restricted code list of purpose-of-transaction-codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#TransactionPurposeCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ActivitySequence: + description: Embedded object to create a sequence of Activities in the context + of a Service + properties: + https://onerecord.iata.org/ns/cargo#sequenceNumber: + description: Short text to detail sequence number (alphanumeric) + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ActivitySequence + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#activity: + description: Reference to the Activity that is performed as part of a Service + items: + $ref: '#/components/schemas/LogisticsActivity' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + UnitComposition: + description: Activity to describe composition and decomposition of LoadingUnits + properties: + https://onerecord.iata.org/ns/cargo#checkActions: + description: References to CheckActions performed for the Activity + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#UnitComposition + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#servedServices: + description: Reference to Services this Activity is executed for + items: + $ref: '#/components/schemas/LogisticsService' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#compositionIdentifier: + description: Short text holding the process number if necessary + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#executionStatus: + description: Enum stating the status of the Activity + items: + $ref: '#/components/schemas/ExecutionStatus' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#compositionActions: + description: References to all CompositionActions performed for the UnitComposition + items: + $ref: '#/components/schemas/Composing' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadingUnit: + description: Reference to the LoadingUnit composed in the Unit Composition + or referenced in Composing actions + items: + $ref: '#/components/schemas/LoadingUnit' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#slac: + description: Shipper's Load And Count ( total contained piece count as + provided by shipper) + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + TemperatureUnitCode: + description: Restricted sub-code list of temperature units from MeasurementUnitCode + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#TemperatureUnitCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Composing: + description: Action to describe build-up or break-down of LoadingUnits + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#composedPieces: + description: References to the Pieces being built-up or broken-down + items: + $ref: '#/components/schemas/Piece' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Composing + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionTimeType: + description: Enum stating the type of the Action + items: + $ref: '#/components/schemas/ActionTimeType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionStartTime: + description: DateTime holding the start time of the Action; Type is indicated + through ActionType property + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#performedAt: + description: Reference to the Location the Action was performed at + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#compositionType: + description: Enum stating whether the CompositionAction describes build-up + or break-down + items: + $ref: '#/components/schemas/CompositionType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#servedActivity: + description: Reference to the Activity the Action was performed for + items: + $ref: '#/components/schemas/LogisticsActivity' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadingUnit: + description: Reference to the LoadingUnit composed in the Unit Composition + or referenced in Composing actions + items: + $ref: '#/components/schemas/LoadingUnit' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#composedMaterials: + description: References to the Materials being built-up or broken-down + items: + $ref: '#/components/schemas/LoadingMaterial' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionEndTime: + description: DateTime holding the end time of the Action; Type is indicated + through ActionType property + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + IotDevice: + description: IoT Device details + properties: + https://onerecord.iata.org/ns/cargo#manufacturer: + description: Manufacturing company details and contacts + items: + $ref: '#/components/schemas/Company' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#IotDevice + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#description: + description: Natural language description if required + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#name: + description: Human-understandable name of object depending on the context + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#connectedSensors: + description: Reference to the sensors linked to the device + items: + $ref: '#/components/schemas/Sensor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#deviceModel: + description: Commercial denomination of the device + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#serialNumber: + description: Serial number that allows to uniquely identify the object + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedToObject: + description: Reference to the PhysicalLogisticsObject the IotDevice is attached + to + items: + $ref: '#/components/schemas/PhysicalLogisticsObject' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + BookingOptionRequest: + description: 'Request object, refers to the Quote request or Booking request ' + properties: + https://onerecord.iata.org/ns/cargo#bookingShipmentDetails: + description: Reference to the BookingShipment if required + items: + $ref: '#/components/schemas/BookingShipment' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#BookingOptionRequest + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#involvedParties: + description: Information about other Parties involved depending on the context + of use + items: + $ref: '#/components/schemas/Party' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#timePreferences: + description: Schedule preferences of the request + items: + $ref: '#/components/schemas/BookingTimes' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#bookingToUpdate: + description: Reference to the Booking to update + items: + $ref: '#/components/schemas/Booking' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#unitsPreference: + description: Reference to unit preferences of the request (e.g. kg or cm) + items: + $ref: '#/components/schemas/UnitsPreference' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#transportLegs: + description: Reference to the Transport Legs of the proposed routing + items: + $ref: '#/components/schemas/TransportLegs' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#carrierProduct: + description: Reference to the Carrier product if known + items: + $ref: '#/components/schemas/CarrierProduct' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#bookingPreference: + description: Reference to the Booking preferences + items: + $ref: '#/components/schemas/BookingPreferences' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#bookingOptions: + description: Reference to all Booking Options + items: + $ref: '#/components/schemas/BookingOption' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#knownShipper: + description: Indication if shipper is a Known Shipper as per TSA grant + items: + maxItems: 1 + type: boolean + nullable: true + type: array + type: object + EntitlementCode: + description: Restricted code list corresponding to cXML code list 1.3 Entitlement + Codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#EntitlementCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + AircraftPossibilityCode: + description: Restricted code list corresponding to cXML code list 1.46 Aircraft + Possibility Codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#AircraftPossibilityCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ChargeCode: + description: Restricted code list corresponding to cXML code list 1.1 Charge + Codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ChargeCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + SignatoryRole: + description: Restricted code list indicating the role of the signatory in CITES + context + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#SignatoryRole + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ModeCode: + description: Restricted Code List of mode codes, UNECE Recommendation No. 19 + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ModeCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Storage: + description: Activity to describe storing processes + properties: + https://onerecord.iata.org/ns/cargo#checkActions: + description: References to CheckActions performed for the Activity + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Storage + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#servedServices: + description: Reference to Services this Activity is executed for + items: + $ref: '#/components/schemas/LogisticsService' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#storingIdentifier: + description: Short text holding the process number if necessary + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#executionStatus: + description: Enum stating the status of the Activity + items: + $ref: '#/components/schemas/ExecutionStatus' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#storingActions: + description: References to all StoringActions performed for the Storing + Activity + items: + $ref: '#/components/schemas/Storing' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + Price: + description: Price associated to the offer/booking + properties: + https://onerecord.iata.org/ns/cargo#forBookingOption: + description: Reference to the BookingOption the LogisticsObject is detailling + items: + $ref: '#/components/schemas/BookingOption' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#chargeCode: + description: Charge code, refer to CargoXML Code List 1.1 + items: + $ref: '#/components/schemas/ChargeCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Price + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#ratings: + description: Rating used for pricing + items: + $ref: '#/components/schemas/Ratings' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#grandTotal: + description: Total price + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + Value: + description: Unit of measurement details + properties: + https://onerecord.iata.org/ns/cargo#unit: + description: Unit of measurement as per MeasurementUnitCode codelist. If + the code is not present, create an instance of MeasurementUnitCode based + on UNECE Rec. 20 Rev. 17e-2021 + items: + $ref: '#/components/schemas/MeasurementUnitCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#numericalValue: + description: Numerical value + items: + maxItems: 1 + type: number + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Value + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + type: object + ULDLoadingIndicator: + description: Restricted code list corresponding to cXML code list 1.47 ULD Loading + Indicators + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ULDLoadingIndicator + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + TransportLegs: + description: TransportLegs details + properties: + https://onerecord.iata.org/ns/cargo#departureDate: + description: Departure date and time of the leg + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#co2Emissions: + description: References to CO2Emissions + items: + $ref: '#/components/schemas/CO2Emissions' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#TransportLegs + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#arrivalDate: + description: Arrival date and time of the leg + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#transportMeansServiceType: + description: Type of transport means service, e.g. Aircraftor Truck + items: + $ref: '#/components/schemas/TransportMeansServiceType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#legNumber: + description: Leg number + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#departureLocation: + description: Reference to the depature Location + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#transportMeansType: + description: Type of transport means, e.g. 744, RFS + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#arrivalLocation: + description: Reference to the arrival Location + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#transportIdentifier: + description: Airline flight number, or rail/truck/maritime line id + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + LoadType: + description: Restricted code list for the Load Type of a piece or shipment + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LoadType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + CheckTotalResult: + description: CheckTotalResult holds the result of a Check and should be provided + by the party executing and accounting for the check result + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#resultOfCheck: + description: Description not available + items: + $ref: '#/components/schemas/Check' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checkRemark: + description: Free text remarks to the check result + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#certifiedByActor: + description: Reference to the Actor certifying the result of the Check if + required + items: + $ref: '#/components/schemas/Person' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#CheckTotalResult + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#passed: + description: Boolean indicating whether the Check was passed + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#resultValue: + description: Information about a result Value of any kind of the Check + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + Sensor: + description: Sensor details and measurements, linked to Connected Devices + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#measurements: + description: Reference to the Measurements recorded by the Sensor + items: + $ref: '#/components/schemas/Measurement' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Sensor + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#description: + description: Natural language description if required + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#name: + description: Human-understandable name of object depending on the context + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#partOfIotDevice: + description: Reference to the IoT Device to which the sensor is linked + items: + $ref: '#/components/schemas/IotDevice' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#serialNumber: + description: Serial number that allows to uniquely identify the object + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#sensorType: + description: Type of sensor as described in Interactive Cargo Recommended + Practice + items: + $ref: '#/components/schemas/SensorType' + maxItems: 1 + nullable: true + type: array + type: object + Measurement: + description: Measurements details for Sensors, either generic or geolocation + measurements are recorded + properties: + https://onerecord.iata.org/ns/cargo#measurementTimestamp: + description: Timestamp for the measurement + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#measurementValue: + description: Information about all non-Geolocation values of the measurement + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Measurement + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#recordedGeolocation: + description: Reference to the Geolocation recorded of the measurement + items: + $ref: '#/components/schemas/Geolocation' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + DgRadioactiveIsotope: + description: Details of the radioactive isotope contained in the product + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contentOfDgProductRadioactive: + description: Reference to the DgProductRadioactive this Isotope is contained + in + items: + $ref: '#/components/schemas/DgProductRadioactive' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#DgRadioactiveIsotope + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#specialFormIndicator: + description: A notation that the material is special form + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#isotopeId: + description: Id of each radionuclide or for mixtures of radionuclides. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#physicalChemicalForm: + description: A description of the physical and chemical form of the material. + items: + $ref: '#/components/schemas/RadioactiveMaterialClassification' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#activityLevelMeasure: + description: Numeric expression of the activity of a radioactive Item + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#criticalitySafetyIndexNumeric: + description: Applies to fissile material only, other than fissile excepted. + A numeric value expressed to one decimal place preceded by the letters + CSI. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#lowDispersibleIndicator: + description: A notation that the material is low dispersible radioactive + material. + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#isotopeName: + description: 'The name or symbol of each radionuclide or for mixtures of + radionuclides, an appropriate general description, or a list of the most + restrictive radionuclides. ' + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + PackagingDangerLevelCode: + description: Restricted code lists for indication of the relative degree of + danger presented by substances within a class or division + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#PackagingDangerLevelCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + RadioactiveMaterialClassification: + description: Restricted code list based on DGR 10.3.3 + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#RadioactiveMaterialClassification + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + BookingTimes: + description: Previsouly called Schedule. This object refers to times used for + the Booking Option Request (preferences part of the request) or the Booking + Option (times sur as LAT where there is a commitment from the carrier) + properties: + https://onerecord.iata.org/ns/cargo#latestAcceptanceTime: + description: Latest Acceptance time as per CargoIQ definition (requested, + proposed or actual) + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#totalTransitTime: + description: Total transit time as per CargoIQ definition, expressed as + a duration + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#latestArrivalTime: + description: Latest arrival time at destination + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#timeOfAvailability: + description: Time of availability of the shipment as per CargoIQ definition + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#BookingTimes + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#earliestAcceptanceTime: + description: Earliest acceptance date time (requested or proposed) + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + type: object + ContactDetailType: + description: Open code list for types of contact details + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ContactDetailType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + CO2Emissions: + description: CO2 Calculation + properties: + https://onerecord.iata.org/ns/cargo#methodName: + description: Name of the CO2 calculation method + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#CO2Emissions + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#calculationFor: + description: Reference to the TransportMovement or TransportLegs the CO2Emissions + have been calculated for + items: + $ref: '#/components/schemas/LogisticsObject' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#calculatedEmissions: + description: CO2 emissions calculated + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#methodVersion: + description: Version used for the calculation + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + LogisticsObject: + description: Logistics Object parent class, containing all common properties + for logistics objects. + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LogisticsObject + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + Waybill: + description: Waybill details + properties: + https://onerecord.iata.org/ns/cargo#declaredValueForCarriage: + description: The value of a shipment declared for carriage purposes + items: + $ref: '#/components/schemas/CurrencyValue' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#shipment: + description: Reference to the Shipment + items: + $ref: '#/components/schemas/Shipment' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Waybill + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#destinationCurrencyRate: + description: Conversion rate applied + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#billingDetails: + description: Reference to the BillingDetails of the Waybill + items: + $ref: '#/components/schemas/BillingDetails' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#shippingRefNo: + description: Optional shipping reference number if any + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#shippingInfo: + description: The shipper or its Agent may enter the appropriate optional + shipping + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherCharges: + description: Information about Other Charges applying to this Waybill + items: + $ref: '#/components/schemas/OtherCharge' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#customsOriginCode: + description: "Code indicating the origin of goods for Customs purposes (e.g.\ + \ For goods in free circulation in the EU) \nList to be provided by local\ + \ authorities" + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#carrierDeclarationPlace: + description: Location of individual or company involved in the movement + of a consignment or Coded representation of a specific airport/city code + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#accountingInformation: + description: Indicates the details of accounting information. Free text + e.g. PAYMENT BY CERTIFIED CHEQUE etc. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#declaredValueForCustoms: + description: The value of a shipment declared for customs purposes + items: + $ref: '#/components/schemas/CurrencyValue' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#carrierDeclarationDate: + description: Date upon which the certification is made by the carrier + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#destinationCharges: + description: Charges levied at destination accruing to the last carrier, + in destination currency + items: + $ref: '#/components/schemas/CurrencyValue' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#carrierChargeCode: + description: One letter charge code as per bullet point 12 - data element + 13 from AWB + items: + $ref: '#/components/schemas/ChargeCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#houseWaybills: + description: Refers to the Waybill(s) contained + items: + $ref: '#/components/schemas/Waybill' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#consignorDeclarationSignature: + description: Name of consignor signatory + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedParties: + description: Information about other Parties involved depending on the context + of use + items: + $ref: '#/components/schemas/Party' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#weightValuationIndicator: + description: Indicator whether the payment for the Weight/Valuation is to + be made at origin (prepaid) or at destination (collect) as per bullet + point 13 - data element 14a/14b from AWB + items: + $ref: '#/components/schemas/PrepaidCollectIndicator' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherChargesIndicator: + description: Indicator whether the payment of Other Charges is to be made + at origin (prepaid) or at destination (collect) as per bullet point 13 + - data element 15a/15b from AWB + items: + $ref: '#/components/schemas/PrepaidCollectIndicator' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#modularCheckNumber: + description: The check is a Modular 7 validation on the AWB number, recorded + as a boolean. + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#waybillType: + description: 'Type of the Waybill: House, Direct or Master' + items: + $ref: '#/components/schemas/WaybillType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#departureLocation: + description: Reference to the depature Location + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#masterWaybill: + description: Reference to the master Waybill if it is contained in one + items: + $ref: '#/components/schemas/Waybill' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#arrivalLocation: + description: Reference to the arrival Location + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#waybillPrefix: + description: Prefix used for the Waybill Number. Refer to IATA Airlines + Codes + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#referredBookingOption: + description: Refers to the Booking + items: + $ref: '#/components/schemas/Booking' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#carrierDeclarationSignature: + description: Contains the authentication of the Carrier + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#serviceCode: + description: One letter service code as per bullet point 18.4 - data element + 22Z from AWB + items: + $ref: '#/components/schemas/ServiceCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#waybillNumber: + description: House or Master Waybill unique identifier + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#waybillLineItems: + description: Information about rates applying to this Waybill handled as + line item + items: + $ref: '#/components/schemas/WaybillLineItem' + nullable: true + type: array + type: object + StoringType: + description: Restricted code list for Storing subtypes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#StoringType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Storing: + description: Action to describe store-in or store-out + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Storing + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contactPersons: + description: References to Actors (Person, NonHumanActor) acting as contacts + items: + $ref: '#/components/schemas/Actor' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionTimeType: + description: Enum stating the type of the Action + items: + $ref: '#/components/schemas/ActionTimeType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionStartTime: + description: DateTime holding the start time of the Action; Type is indicated + through ActionType property + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contactDetails: + description: Information about contactDetails + items: + $ref: '#/components/schemas/ContactDetail' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#performedAt: + description: Reference to the Location the Action was performed at + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#storedObjects: + description: Reference to the Objects being stored in or stored out + items: + $ref: '#/components/schemas/PhysicalLogisticsObject' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#storingType: + description: Enum stating whether the StoringAction describes the store-in + or the store-out + items: + $ref: '#/components/schemas/StoringType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#servedActivity: + description: Reference to the Activity the Action was performed for + items: + $ref: '#/components/schemas/LogisticsActivity' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#actionEndTime: + description: DateTime holding the end time of the Action; Type is indicated + through ActionType property + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#storagePlaceIdentifier: + description: Short text stating the exact place of storage + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + type: object + SecurityStatus: + description: Restricted code list corresponding to cXML code list 1.103 Security + Statuses + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#SecurityStatus + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + BookingStatus: + description: Restricted code list containing the possible statuses of a booking + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#BookingStatus + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + VolumePieceGroup: + description: VolumePieceGroup details + properties: + https://onerecord.iata.org/ns/cargo#pieceGroupGrossWeight: + description: Total gross weight of the piece group + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#totalVolume: + description: Total volume fo the volume piece group + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dryIceWeight: + description: Weight of dry ice + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieceGroupId: + description: Identifier of the piece group, increasing integers + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#VolumePieceGroup + type: string + nullable: false + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#stackable: + description: Stackable indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#pieceGroupCount: + description: Number of pieces in the piece group + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + type: object + PieceLiveAnimals: + description: LiveAnimals subclass of Piece + properties: + https://onerecord.iata.org/ns/cargo#exportTradeCountry: + description: Country of last re-export (box 12a). Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#goodsDescription: + description: Description of goods, for the BookingShipment the commodity + list defined by Modernizing Cargo Distribution MCD working group can be + used as a referential. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#speciesScientificName: + description: Species scientific name (box 7) + items: + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#ofShipment: + description: Reference to the Shipment the Piece is assigned to + items: + $ref: '#/components/schemas/Shipment' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#volumetricWeight: + description: Volumetric weight details + items: + $ref: '#/components/schemas/VolumetricWeight' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#associatedEpermit: + description: Reference to the permits associated with the Live Animals + items: + $ref: '#/components/schemas/EpermitConsignment' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#packagingType: + description: 'Packaging details ' + items: + $ref: '#/components/schemas/PackagingType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#fulfillsUldTypeCode: + description: Text holding an ULD Type Code if the Piece fulfills it before + UnitComposition + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#goodsTypeCode: + description: Appendix number of the convention (I, II or III) (box 1) + items: + $ref: '#/components/schemas/GoodsTypeCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#specimenDescription: + description: Description of specimens, including age and sex if LA (box + 9) + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#originReferencePermitTypeCode: + description: Document type code of origin reference permit or re-export + reference Certificate (box 12/12a) + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#goodsTypeExtensionCode: + description: Appendix number of the convention (I, II or III) (box 1) + items: + $ref: '#/components/schemas/GoodsTypeExtensionCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#originTradeCountry: + description: country of origin (box 12). Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#originReferencePermitDateTime: + description: Issuing date for Origin reference permit or re-export reference + Certificate (box 12) + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#upid: + description: Unique Piece Identifier (UPID) of the piece. Refer IATA Recommended + Practice 1689 + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#PieceLiveAnimals + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#contentProducts: + description: Reference to the Products describing the content of the Piece, + mandatory if no data on Item level is used + items: + $ref: '#/components/schemas/Product' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#originReferencePermitId: + description: identifier of Origin reference permit or re-export reference + Certificate (box 12/12a) + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#dimensions: + description: Dimensions details + items: + $ref: '#/components/schemas/Dimensions' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#quantityAnimals: + description: Quantity including units (box 11) + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#containedPieces: + description: Details of contained piece(s) + items: + $ref: '#/components/schemas/Piece' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#packageMarkCoded: + description: Reference identifying how the package is marked. Field is hardcode + to "SSCC-18", "UPC" or "Other" + items: + $ref: '#/components/schemas/PackageMarkCode' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#inPiece: + description: Reference to the Piece this Item or Piece is contained in + items: + $ref: '#/components/schemas/Piece' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#nvdForCustoms: + description: When no value is declared for Customs, this field may be completed + with the value TRUE otherwise FALSE + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#speciesCommonName: + description: Species common name (box 8) + items: + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#shippingMarks: + description: Shipping marks + items: + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#categoryCode: + description: Operations code ID. Refers to the number of the registered + captive-breeding or artifical propagation operation (box 12b) + items: + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#acquisitionDateTime: + description: Defined in Resolution Conf. 13.6 and is required for pre-Convention + specimens (box 12b) + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#nvdForCarriage: + description: When no value is declared for Carriage, this field may be completed + with the value TRUE otherwise FALSE + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#securityDeclarations: + description: Security details of the piece + items: + $ref: '#/components/schemas/SecurityDeclaration' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#loadType: + description: Load type of the shipment or piece (Bulk, ULD, Pallet, Loose) + items: + $ref: '#/components/schemas/LoadType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedParties: + description: Information about other Parties involved depending on the context + of use + items: + $ref: '#/components/schemas/Party' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#stackable: + description: Stackable indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#packagedeIdentifier: + description: SSCC-18 code for the value of the package mark, company or + bar code, free text, pallet code, etc. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#grossWeight: + description: Weight details + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#coload: + description: Coload indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#containedItems: + description: Reference to the item(s) contained in the piece + items: + $ref: '#/components/schemas/Item' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#contentProductionCountry: + description: Goods production country, mandatory when there are no Items. + Refer ISO 3166-2 + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#slac: + description: Shipper's Load And Count ( total contained piece count as + provided by shipper) + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#specialHandlingCodes: + description: Three-letter special handling code (SPH) + items: + $ref: '#/components/schemas/SpecialHandlingCode' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#specimenTypeCode: + description: Description of specimens, CITES type code (box 9) + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#customsInformation: + description: Customs details + items: + $ref: '#/components/schemas/CustomsInformation' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#annualQuotaQuantity: + description: total number of specimens exported in the current calendar + year and the current annuela quota for the species concerned (box 11a) + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#otherIdentifiers: + description: Details about any other identifier, depending on the context + of use + items: + $ref: '#/components/schemas/OtherIdentifier' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#turnable: + description: Turnable indicator for the pieces (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + type: object + RateClassCode: + description: Restricted code list corresponding to cXML code list 1.4 Rate Class + Codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#RateClassCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + PackagingType: + description: 'Packaging details ' + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#PackagingType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#description: + description: Natural language description if required + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#appliedOnPieces: + description: Piece on which the Packaging type is applicable + items: + $ref: '#/components/schemas/Piece' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#typeCode: + description: 'Packaging type identifier as per UNECE Rec 21 Annex V and + VI e.g. 1A - Drum, steel - Packaging material code. Identifies the Logistic + Unit package type. UN Recommendation on Transport of Dangerous Goods, + Model Regulations ' + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + PhysicalLogisticsObject: + description: 'Superclass: PhysicalLogisticObjects represent the digital twin + of an object in the logistics suppy chain that physically exist' + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#PhysicalLogisticsObject + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + LoadingType: + description: Restricted code list for Loading subtypes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LoadingType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + SensorType: + description: Open code list for sensor types + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#SensorType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ShipmentSecurityStatus: + description: Restricted code list indicating whether a shipment is secured or + not secured + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ShipmentSecurityStatus + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + ModeQualifier: + description: Open code list for transport modes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#ModeQualifier + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + GoodsTypeCode: + description: 'Source: CITES' + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#GoodsTypeCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + BasicRateClassCode: + description: Restricted sub-code list corresponding to elements of cXML code + list 1.4 Rate Class Codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#BasicRateClassCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + TransportMeans: + description: Transport means details + properties: + https://onerecord.iata.org/ns/cargo#typicalFuelConsumption: + description: Typical fuel comsumption (e.g. 2 L / 1 nm) + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#TransportMeans + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#typicalCo2Coefficient: + description: Required for some CO2 calculations + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#transportOrganization: + description: Company operating the transport means + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#vehicleType: + description: Vehicle or container type. Refer UNECE28, e.g. 4.. - Aircraft, + type unknown.For Air refer to IATA Standard Schedules Information Manua + in section ATA/IATA Aircraft Types + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#operatedTransportMovement: + description: Transport Movement on which the Transport Means is used + items: + $ref: '#/components/schemas/TransportMovement' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#vehicleRegistration: + description: Vehicle identification - e.g. aircraft registration number + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#vehicleModel: + description: Model or make of the vehicle (e.g. A33-3) + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#vehicleSize: + description: Size of the vehicle - free text + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + BillingDetails: + description: In the context of CASS2. process, BillingDetails object is used + to integrate specific Billing and Settlement data requirements + properties: + https://onerecord.iata.org/ns/cargo#nbCorrections: + description: Number of corrections to CASS records + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#vatIndicator: + description: Indicate if subject to VAT (boolean) + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#awbUseIndicator: + description: It must either contain the values of R for Revenue AWB, V for + Void AWB or S for Service AWB. + items: + $ref: '#/components/schemas/AWBUseIndicator' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#awbDeliveryDate: + description: The Date AWB Delivery is also used as the AWB Execution date + which will determine which billing period it will be processed and billed + in. + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#adjustments: + description: Information about Adjustments performed on the BillingDetails + items: + $ref: '#/components/schemas/Adjustments' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#commissionIndicator: + description: Indicates if commission is applied. Boolean + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#discount: + description: This is used as a discount to the “official” transportation + charge on AWB to arrive at actual selling price + items: + maxItems: 1 + type: number + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#BillingDetails + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#exchangeRate: + description: The Rate at which the Air Waybill Amount has been multiplied + to arrive at the amount of settlement. + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#taxDueAirline: + description: Tax due Airline (as per AWB, or VAT/GST as per invoice). Total + VAT/TAX amount payable by agent to airline + items: + $ref: '#/components/schemas/CurrencyValue' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#awbAcceptanceDate: + description: The Date AWB Acceptance should be the same as the Date AWB + Delivery. (beginning of the process) + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#taxDueAgent: + description: Tax due Agent (VAT/GST on Commission). Total VAT/TAX amount + payable by airline to agent + items: + $ref: '#/components/schemas/CurrencyValue' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#awbExecutionDate: + description: The AWB execution date determines which billing period the + document will be processed and billed in. + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#commission: + description: The commission amount in favour of the Cargo Agent/Associate, + applicable for the shipment concerned + items: + maxItems: 1 + type: number + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#detailedWaybill: + description: Reference to the Waybill + items: + $ref: '#/components/schemas/Waybill' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#commissionPercentage: + description: The commission percentage in favour of the Cargo Agent/Associate, + applicable for the shipment concerned + items: + maxItems: 1 + type: number + nullable: true + type: array + type: object + NonHumanActor: + description: Non-human actors are actors which are not a person, such as robots + properties: + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#NonHumanActor + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#associatedOrganization: + description: Reference to the Organization the Actor is associated with + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + MovementTimeType: + description: Restricted code list for MovementTime subtypes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#MovementTimeType + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Answer: + description: Answer holds the answer to one Question and is provided by the + executioner of the check + properties: + https://onerecord.iata.org/ns/cargo#answerValue: + description: Information about an answer Value of any kind of the Answer + items: + $ref: '#/components/schemas/Value' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Answer + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#text: + description: Text for the Answer + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#question: + description: Reference to the Question the Answer is for + items: + $ref: '#/components/schemas/Question' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#givenAtLocation: + description: Reference to the Location from which the Question was answered, + relevant for split checks with documentary and physical elements + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#answerActor: + description: Reference to the Actor giving the Answer + items: + $ref: '#/components/schemas/Actor' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + type: object + CodeListElement: + description: Embedded object to transmit codes from non-RDF code lists in 1R + in a semi-structured way. Code lists may be externally maintained codes (such + as HS codes) or carrier-specific codes. If a code is present in RDF-form as + Named Individual (like in the 1R core code lists ontology), it suffices to + put in its IRI + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Integer indicating the level of a code if a codelists is hierarchical, + for example HS-Codes + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Official name of the code list without version number when + direct reference is not possible, for example "UN/LOCODE" when referring + to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#CodeListElement + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Version of the code list, for example "223-1" for UN/LOCODE. + Used if the property codeListName is used or the version is not apparent + from the resource referred to in property codeListReference. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description or long version of the code, for example "Switzerland" + for Switzerland when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: URL to access the code list the code is taken from, for example + "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" + for UN/LOCODE. + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Code or short version of a code, for example "CH" for Switzerland + when referring to the UN/LOCODE code list + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + LogisticsEvent: + description: Event details + properties: + https://onerecord.iata.org/ns/cargo#eventFor: + description: Refers to the URI of the linked object(s) + items: + $ref: '#/components/schemas/LogisticsObject' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#eventLocation: + description: Location of event + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#eventDate: + description: Date and time of the event + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#eventCode: + description: Movement or milestone code. Can hold a named individual of + the StatusCode core code list (corresponding to cXML code list 1.18), + but can also be referring to different code lists. + items: + $ref: '#/components/schemas/CodeListElement' + maxItems: 1 + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#LogisticsEvent + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#creationDate: + description: DateTime at which the LogisticsEvent was posted + items: + format: date-time + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#recordingOrganization: + description: Organization recording the LogisticsEvent + items: + $ref: '#/components/schemas/Organization' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#eventName: + description: If no EventCode provided, event name - e.g. Security clearance + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#eventTimeType: + description: Indicates type of event e.g. Scheduled, Estimated, Actual + items: + $ref: '#/components/schemas/EventTimeType' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#partialEventIndicator: + description: Boolean indicating that the LogisticsEvent is only applicable + for parts of the LogisticObject it was recorded for, for example for some + Pieces of a Shipment + items: + maxItems: 1 + type: boolean + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#recordingActor: + description: Reference to the Actor recording the LogisticsEvent + items: + $ref: '#/components/schemas/Actor' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + CurrencyValue: + description: Embedded object to transmit currencies + properties: + https://onerecord.iata.org/ns/cargo#numericalValue: + description: Numerical value + items: + maxItems: 1 + type: number + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#CurrencyValue + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#currencyUnit: + description: Information about the currency used in a CurrencyValue. Create + an instance of CurrencyCode based on ISO 4217 + items: + $ref: '#/components/schemas/CurrencyCode' + maxItems: 1 + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + type: object + ULDConditionCode: + description: Restricted code list corresponding to cXML code list 1.21 ULD Condition + Codes + properties: + https://onerecord.iata.org/ns/cargo#codeLevel: + description: Description not available + items: + format: int32 + maxItems: 1 + type: integer + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeListName: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/coreCodeLists#ULDConditionCode + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#codeListVersion: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#codeDescription: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#codeListReference: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#code: + description: Description not available + items: + maxItems: 1 + type: string + nullable: true + type: array + type: object + Location: + description: Location describes a physical location, e.g. an airport, a warehouse + or a truck deck + properties: + https://onerecord.iata.org/ns/cargo#address: + description: Address details + items: + $ref: '#/components/schemas/Address' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#onsiteActions: + description: References to the Actions happening at the Location + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#skeletonIndicator: + description: Indicator whether a logistics object is a skeleton object + items: + maxItems: 1 + type: boolean + nullable: true + type: array + '@type': + description: Type of the resource + items: + enum: + - https://onerecord.iata.org/ns/cargo#Location + type: string + nullable: false + type: array + https://onerecord.iata.org/ns/cargo#events: + description: Events object + items: + $ref: '#/components/schemas/LogisticsEvent' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#involvedInActions: + description: References to the Actions the object is involved in + items: + $ref: '#/components/schemas/LogisticsAction' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#locationCodes: + description: Location code of airport, freight terminal, seaport, rail station. + UN/LOCODE city code (5 letter) or IATA airport code (3 letter) + items: + $ref: '#/components/schemas/CodeListElement' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#checks: + description: References to the CheckActions performed on the object + items: + $ref: '#/components/schemas/Check' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#locationType: + description: Location type - e.g. Airport, Freight terminal, Rail station, + Seaport, etc + items: + maxItems: 1 + type: string + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#geolocation: + description: Geolocation details + items: + $ref: '#/components/schemas/Geolocation' + maxItems: 1 + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#externalReferences: + description: References to all associated ExternalReferences + items: + $ref: '#/components/schemas/ExternalReference' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#attachedIotDevices: + description: References to all connected IotDevices + items: + $ref: '#/components/schemas/IotDevice' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#locationName: + description: Full name of the location + items: + maxItems: 1 + type: string + nullable: true + type: array + '@id': + description: Resource Identifier + type: string + https://onerecord.iata.org/ns/cargo#subLocations: + description: References to Sublocations that describe the Location in more + detail + items: + $ref: '#/components/schemas/Location' + nullable: true + type: array + https://onerecord.iata.org/ns/cargo#subLocationOf: + description: Reference to the Location this is a Sublocation of + items: + $ref: '#/components/schemas/Location' + maxItems: 1 + nullable: true + type: array + type: object diff --git a/development/API-Security/assets/unit-tests/1R_Unit_Tests.postman_collection b/development/API-Security/assets/unit-tests/1R_Unit_Tests.postman_collection new file mode 100644 index 00000000..9d955e88 --- /dev/null +++ b/development/API-Security/assets/unit-tests/1R_Unit_Tests.postman_collection @@ -0,0 +1,6309 @@ +{ + "info": { + "_postman_id": "d63160fd-dd69-453d-ac8e-64296de37007", + "name": "ONE Record API Unit Tests", + "description": "# ONE Record Example Collection\n\nThis collection contains all the examples described in the ONE Record API specification website([https://iata-cargo.github.io/ONE-Record/](https://))\n\n# Collection Variables\n\nA set of variables has been designed to ease the use of this collections. In order to run any call, please create an Environment and add the following variable:\n\n- baseUrl : the url of the ONE Record server (i.e. [https://1r.example.com](https://1r.example.com))\n \n\n# Authentication\n\nIf ONE Record Server implements the authentication, you should add a bearer token for each API call. For more information check the Security section on [https://iata-cargo.github.io/ONE-Record/](https://iata-cargo.github.io/ONE-Record/)", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "28309429", + "_collection_link": "https://crimson-crescent-500945.postman.co/workspace/One-Record-workspace~090d2458-3b0b-4449-8278-184b7711961d/collection/28309429-d63160fd-dd69-453d-ac8e-64296de37007?action=share&source=collection_link&creator=28309429" + }, + "item": [ + { + "name": "Server Information", + "item": [ + { + "name": "Server Information", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(jsonData, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "\r", + "// Test Status Code\r", + "pm.test(\"Status code is 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "// Test Response Headers\r", + "pm.test(\"Content-Type is present\", function () {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language is present\", function () {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Last-Modified is present\", function () {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "// Test Response Payload\r", + "var jsonData = pm.response.json();\r", + "\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + " pm.test(\"Response contains @id \", function () {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains @type \", function () {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response contains hasDataHolder \", function () {\r", + " pm.expect(jsonData).to.have.property(\"https://onerecord.iata.org/ns/api#hasDataHolder\");\r", + " });\r", + " pm.test(\"Response contains hasServerEndpoint \", function () {\r", + " pm.expect(jsonData).to.have.property(\"https://onerecord.iata.org/ns/api#hasServerEndpoint\");\r", + " });\r", + " pm.test(\"Response contains hasSupportedContentType\", function () {\r", + " pm.expect(jsonData).to.have.property(\"https://onerecord.iata.org/ns/api#hasSupportedContentType\");\r", + " });\r", + " pm.test(\"Response contains hasSupportedLanguage \", function () {\r", + " pm.expect(jsonData).to.have.property(\"https://onerecord.iata.org/ns/api#hasSupportedLanguage\");\r", + " });\r", + "});\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "" + ] + }, + "description": "This request retrieve the Server Information of the ONE Record server. For more information visit : [ONE Record Server Information](https://iata-cargo.github.io/ONE-Record/server-information/)" + }, + "response": [] + } + ], + "description": "This folder contains Unit tests for the server information endpoint. \nFor more information visit : [Server Information Endpoint](https://iata-cargo.github.io/ONE-Record/server-information/)" + }, + { + "name": "Logistics Objects", + "item": [ + { + "name": "Create", + "item": [ + { + "name": "Create a Piece", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Test Status Code\r", + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "// Test Response Headers\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Piece\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Piece\")){\r", + " pm.collectionVariables.set(\"pieceId\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + " pm.collectionVariables.set(\"pieceRevision\", 1);\r", + "\r", + " //Set creation date for historical object\r", + " isoTimestamp = pm.variables.replaceIn('{{$isoTimestamp}}')\r", + " date = isoTimestamp.replaceAll('-','').replaceAll(':',\"\").split(\".\").shift() + \"Z\";\r", + " pm.collectionVariables.set(\"historicalCreation\",date);\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": \"cargo:Piece\",\n \"cargo:coload\": false,\n \"cargo:handlingInstructions\": [\n {\n \"@type\": \"cargo:HandlingInstructions\",\n \"cargo:handlingInstructionsType\": \"SPH\",\n \"cargo:description\": \"Valuable Cargo\",\n \"cargo:handlingInstructionsTypeCode\": \"VAL\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + }, + { + "name": "Create a Company", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Company\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Company\")){\r", + " pm.collectionVariables.set(\"companyId\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + " pm.collectionVariables.set(\"companyRevision\", 1);\r", + " pm.collectionVariables.set(\"companyCreationTime\", Date.now());\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": [\n \"cargo:Company\"\n ],\n \"cargo:name\": \"Acme Corporation\",\n \"cargo:shortName\": \"ACME\",\n \"cargo:contactPersons\": [\n {\n \"@type\": [\n \"cargo:Person\",\n \"cargo:Actor\",\n \"cargo:LogisticsAgent\",\n \"cargo:LogisticsObject\"\n ],\n \"cargo:firstName\": \"Jane\",\n \"cargo:lastName\": \"Doe\",\n \"cargo:salutation\": \"Ms\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + }, + { + "name": "Create a Shipment", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Shipment\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Shipment\")){\r", + " pm.collectionVariables.set(\"shipmentId\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + " pm.collectionVariables.set(\"shipmentRevision\", 1);\r", + " pm.collectionVariables.set(\"shipmentCreationTime\", Date.now());\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": \"cargo:Shipment\",\n \"cargo:goodsDescription\": \"Lots of awesome ONE Record information materials\",\n \"cargo:shipmentOfPieces\": [{\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\n }]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Get", + "item": [ + { + "name": "Get created Piece", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "//Test response headers\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\", () => {\r", + " pm.expect(pm.response.headers.filter(header=>header.key.includes(\"Type\")).map(header=>header.value)).to.include(\"https://onerecord.iata.org/ns/cargo#Piece\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Revision\");\r", + "});\r", + "pm.test(\"Latest-Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Latest-Revision\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + " var handlingInstructions = \"https://onerecord.iata.org/ns/cargo#handlingInstructions\"\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response @id contains {{baseUrl}}/logistics-objects \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/logistics-objects/\";\r", + " pm.expect(jsonData['@id']).to.include(expectedValue);\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.includes(\"https://onerecord.iata.org/ns/cargo#Piece\");\r", + " });\r", + " var coload = \"https://onerecord.iata.org/ns/cargo#coload\"\r", + " pm.test(\"Response contains coload\", () => {\r", + " pm.expect(jsonData).to.have.property(coload);\r", + " });\r", + " pm.test(\"Response value coload \", () => {\r", + " pm.expect(jsonData[coload]['@type']).to.eql('http://www.w3.org/2001/XMLSchema#boolean');\r", + " pm.expect(jsonData[coload]['@value']).to.eql('false');\r", + " });\r", + " pm.test(\"Response contains handlingInstructions \", () => {\r", + " pm.expect(jsonData).to.have.property(handlingInstructions);\r", + " });\r", + "\r", + " pm.test(\"Response contains handlingInstructions-@id\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains handlingInstructions-@type\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(\"@type\");\r", + " });\r", + " var description = 'https://onerecord.iata.org/ns/cargo#description'\r", + " pm.test(\"Response contains handlingInstructions-description\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(description);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-description\", () => {\r", + " pm.expect(jsonData[handlingInstructions][description]).to.eql('Valuable Cargo');\r", + " });\r", + " var handlingInstructionsType = 'https://onerecord.iata.org/ns/cargo#handlingInstructionsType'\r", + " pm.test(\"Response contains handlingInstructions-handlingInstructionsType\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(handlingInstructionsType);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-handlingInstructionsType\", () => {\r", + " pm.expect(jsonData[handlingInstructions][handlingInstructionsType]).to.eql('SPH');\r", + " });\r", + " var handlingInstructionsTypeCode = 'https://onerecord.iata.org/ns/cargo#handlingInstructionsTypeCode'\r", + " pm.test(\"Response contains handlingInstructions-handlingInstructionsTypeCode\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(handlingInstructionsTypeCode);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-handlingInstructionsTypeCode\", () => {\r", + " pm.expect(jsonData[handlingInstructions][handlingInstructionsTypeCode]).to.eql('VAL');\r", + " });\r", + "})\r", + "\r", + "//Update variables\r", + "pm.collectionVariables.set(\"pieceRevision\", pm.response.headers.get(\"Latest-Revision\"));\r", + "\r", + "\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get a not Existing Logistics Object", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "const apiNS = 'https://onerecord.iata.org/ns/api#';\r", + "var self = {};\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 404\", () => {\r", + " pm.response.to.have.status(404);\r", + "});\r", + "\r", + "//Test Error response payload\r", + "var responseJson = pm.response.json();\r", + "const framedJson = frame(responseJson);\r", + "\r", + "framedJson.then(function (result) {\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@type'] == apiNS + \"Error\") {\r", + " responseJson = element;\r", + " }\r", + " })\r", + " } else {\r", + " responseJson = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Contain Error\", () => {\r", + " pm.expect(responseJson[\"@type\"]).to.eql(apiNS + \"Error\")\r", + " });\r", + "\r", + " pm.test(\"Response contains Error-hasTitle \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasTitle\");\r", + " });\r", + " pm.test(\"Response contains Error-hasErrorDetail \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasErrorDetail\");\r", + " });\r", + " var errorDetail = responseJson[apiNS + 'hasErrorDetail']\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasCode \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasCode\");\r", + " });\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasMessage \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasMessage\");\r", + " });\r", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "notExistingLO", + "description": "Simulate a not existing Logistics Object" + } + ] + } + }, + "response": [] + }, + { + "name": "Get created Shipment with Piece embedded", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "//Test response headers\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\", () => {\r", + " pm.expect(pm.response.headers.filter(header=>header.key.includes(\"Type\")).map(header=>header.value)).to.include(\"https://onerecord.iata.org/ns/cargo#Shipment\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Revision\");\r", + "});\r", + "pm.test(\"Latest-Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Latest-Revision\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString().split('?').shift()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " console.log(pm.request.url.toString().split('?')[0])\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response @id contains {{baseUrl}}/logistics-objects \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/logistics-objects/\";\r", + " pm.expect(jsonData['@id']).to.include(expectedValue);\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.contains(\"https://onerecord.iata.org/ns/cargo#Shipment\");\r", + " });\r", + " var goodsDesc = 'https://onerecord.iata.org/ns/cargo#goodsDescription'\r", + " pm.test(\"Response contains goodsDescription \", () => {\r", + " pm.expect(jsonData).to.have.property(goodsDesc);\r", + " });\r", + " pm.test(\"Response value goodsDescription \", () => {\r", + " pm.expect(jsonData[goodsDesc]).to.eql(\"Lots of awesome ONE Record information materials\");\r", + " });\r", + "\r", + " var shipmentOfPieces = 'https://onerecord.iata.org/ns/cargo#shipmentOfPieces'\r", + " pm.test(\"Response contains shipmentOfPieces\", () => {\r", + " pm.expect(jsonData).to.have.property(shipmentOfPieces);\r", + " });\r", + "\r", + " var piece = ''\r", + " if (Array.isArray(jsonData[shipmentOfPieces])) {\r", + " piece = jsonData[shipmentOfPieces][0]\r", + " } else {\r", + " piece = jsonData[shipmentOfPieces]\r", + " }\r", + " pm.test(\"Response contains shipmentOfPieces-@id\", () => {\r", + " pm.expect(piece).to.have.property('@id');\r", + " });\r", + "\r", + " pm.test(\"Response contains shipmentOfPieces-@type\", () => {\r", + " pm.expect(piece).to.have.property('@type');\r", + " });\r", + "\r", + " pm.test(\"Response value shipmentOfPieces-@type \", () => {\r", + " pm.expect(piece['@type']).to.contains('https://onerecord.iata.org/ns/cargo#Piece');\r", + " });\r", + "\r", + " var coload = \"https://onerecord.iata.org/ns/cargo#coload\"\r", + " pm.test(\"Response contains shipmentOfPieces-coload\", () => {\r", + " pm.expect(piece).to.have.property(coload);\r", + " });\r", + " pm.test(\"Response value shipmentOfPieces-coload \", () => {\r", + " pm.expect(piece[coload]['@type']).to.eql('http://www.w3.org/2001/XMLSchema#boolean');\r", + " pm.expect(piece[coload]['@value']).to.eql('false');\r", + " });\r", + " var handlingInstructions = \"https://onerecord.iata.org/ns/cargo#handlingInstructions\"\r", + " pm.test(\"Response contains shipmentOfPieces-handlingInstructions \", () => {\r", + " pm.expect(piece).to.have.property(handlingInstructions);\r", + " });\r", + "\r", + " pm.test(\"Response contains shipmentOfPieces-handlingInstructions-@id\", () => {\r", + " pm.expect(piece[handlingInstructions]).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains shipmentOfPieces-handlingInstructions-@type\", () => {\r", + " pm.expect(piece[handlingInstructions]).to.have.property(\"@type\");\r", + " });\r", + " var description = 'https://onerecord.iata.org/ns/cargo#description'\r", + " pm.test(\"Response contains shipmentOfPieces-handlingInstructions-description\", () => {\r", + " pm.expect(piece[handlingInstructions]).to.have.property(description);\r", + " });\r", + " pm.test(\"Response value shipmentOfPieces-handlingInstructions-description\", () => {\r", + " pm.expect(piece[handlingInstructions][description]).to.eql('Valuable Cargo');\r", + " });\r", + " var handlingInstructionsType = 'https://onerecord.iata.org/ns/cargo#handlingInstructionsType'\r", + " pm.test(\"Response contains shipmentOfPieces-handlingInstructions-handlingInstructionsType\", () => {\r", + " pm.expect(piece[handlingInstructions]).to.have.property(handlingInstructionsType);\r", + " });\r", + " pm.test(\"Response value shipmentOfPieces-handlingInstructions-handlingInstructionsType\", () => {\r", + " pm.expect(piece[handlingInstructions][handlingInstructionsType]).to.eql('SPH');\r", + " });\r", + " var handlingInstructionsTypeCode = 'https://onerecord.iata.org/ns/cargo#handlingInstructionsTypeCode'\r", + " pm.test(\"Response contains shipmentOfPieces-handlingInstructions-handlingInstructionsTypeCode\", () => {\r", + " pm.expect(piece[handlingInstructions]).to.have.property(handlingInstructionsTypeCode);\r", + " });\r", + " pm.test(\"Response value shipmentOfPieces-handlingInstructions-handlingInstructionsTypeCode\", () => {\r", + " pm.expect(piece[handlingInstructions][handlingInstructionsTypeCode]).to.eql('VAL');\r", + " });\r", + "});\r", + "//Update revision\r", + "pm.collectionVariables.set(\"shipmentRevision\", pm.response.headers.get(\"Latest-Revision\"));" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId?embedded=true", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "query": [ + { + "key": "embedded", + "value": "true" + } + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get created Shipment", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "//Test response headers\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\", () => {\r", + " pm.expect(pm.response.headers.filter(header=>header.key.includes(\"Type\")).map(header=>header.value)).to.include(\"https://onerecord.iata.org/ns/cargo#Shipment\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Revision\");\r", + "});\r", + "pm.test(\"Latest-Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Latest-Revision\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString().split('?').shift()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response @id contains {{baseUrl}}/logistics-objects \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/logistics-objects/\";\r", + " pm.expect(jsonData['@id']).to.include(expectedValue);\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.includes(\"https://onerecord.iata.org/ns/cargo#Shipment\");\r", + " });\r", + " var goodsDesc = 'https://onerecord.iata.org/ns/cargo#goodsDescription'\r", + " pm.test(\"Response contains goodsDescription \", () => {\r", + " pm.expect(jsonData).to.have.property(goodsDesc);\r", + " });\r", + " pm.test(\"Response value goodsDescription \", () => {\r", + " pm.expect(jsonData[goodsDesc]).to.eql(\"Lots of awesome ONE Record information materials\");\r", + " });\r", + "\r", + " var shipmentOfPieces = 'https://onerecord.iata.org/ns/cargo#shipmentOfPieces'\r", + " pm.test(\"Response contains shipmentOfPieces\", () => {\r", + " pm.expect(jsonData).to.have.property(shipmentOfPieces);\r", + " });\r", + "\r", + " var piece = ''\r", + " if (Array.isArray(jsonData[shipmentOfPieces])) {\r", + " piece = jsonData[shipmentOfPieces][0]\r", + " } else {\r", + " piece = jsonData[shipmentOfPieces]\r", + " }\r", + " pm.test(\"Response contains shipmentOfPieces-@id\", () => {\r", + " pm.expect(piece).to.have.property('@id');\r", + " });\r", + "\r", + "});\r", + "\r", + "//Update revision\r", + "pm.collectionVariables.set(\"shipmentRevision\", pm.response.headers.get(\"Latest-Revision\"));\r", + "\r", + "\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get created Company", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "//Test response headers\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\", () => {\r", + " pm.expect(pm.response.headers.filter(header=>header.key.includes(\"Type\")).map(header=>header.value)).to.include(\"https://onerecord.iata.org/ns/cargo#Company\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Revision\");\r", + "});\r", + "pm.test(\"Latest-Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Latest-Revision\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString().split('?').shift()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response @id contains {{baseUrl}}/logistics-objects \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/logistics-objects/\";\r", + " pm.expect(jsonData['@id']).to.include(expectedValue);\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + "\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.includes(\"https://onerecord.iata.org/ns/cargo#Company\");\r", + " });\r", + " var contactPersons = 'https://onerecord.iata.org/ns/cargo#contactPersons'\r", + " pm.test(\"Response contains contactPersons \", () => {\r", + " pm.expect(jsonData).to.have.property(contactPersons);\r", + " });\r", + "\r", + " var name = 'https://onerecord.iata.org/ns/cargo#name'\r", + " pm.test(\"Response contains name \", () => {\r", + " pm.expect(jsonData).to.have.property(name);\r", + " });\r", + "\r", + " pm.test(\"Response value name \", () => {\r", + " pm.expect(jsonData[name]).to.eql('Acme Corporation');\r", + " });\r", + "\r", + " var shortName = 'https://onerecord.iata.org/ns/cargo#shortName'\r", + " pm.test(\"Response contains shortName \", () => {\r", + " pm.expect(jsonData).to.have.property(shortName);\r", + " });\r", + "\r", + " pm.test(\"Response value name \", () => {\r", + " pm.expect(jsonData[shortName]).to.eql('ACME');\r", + " });\r", + "\r", + " var person = jsonData[contactPersons]\r", + "\r", + " var firstname = 'https://onerecord.iata.org/ns/cargo#firstName'\r", + " pm.test(\"Response contains firstname \", () => {\r", + " pm.expect(person).to.have.property(firstname);\r", + " });\r", + " pm.test(\"Response value firstname \", () => {\r", + " pm.expect(person[firstname]).to.eql(\"Jane\");\r", + " });\r", + "\r", + " var lastName = 'https://onerecord.iata.org/ns/cargo#lastName'\r", + " pm.test(\"Response contains lastName \", () => {\r", + " pm.expect(person).to.have.property(lastName);\r", + " });\r", + " pm.test(\"Response value lastName \", () => {\r", + " pm.expect(person[lastName]).to.eql(\"Doe\");\r", + " });\r", + "\r", + "\r", + " var salutation = 'https://onerecord.iata.org/ns/cargo#salutation'\r", + " pm.test(\"Response contains salutation \", () => {\r", + " pm.expect(person).to.have.property(salutation);\r", + " });\r", + " pm.test(\"Response value salutation \", () => {\r", + " pm.expect(person[salutation]).to.eql(\"Ms\");\r", + " });\r", + "});\r", + "//Update revision\r", + "pm.collectionVariables.set(\"companyRevision\", pm.response.headers.get(\"Latest-Revision\"));\r", + "\r", + "\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId?embedded=true", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "query": [ + { + "key": "embedded", + "value": "true" + } + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{companyId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Add description to Piece and change Coload", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "\r", + "\r", + "var reqUrl = pm.variables.replaceIn(pm.request.url.toString());\r", + "if (pm.response.code == 201 ) {\r", + " // Update revisions\r", + " if (reqUrl.includes(pm.collectionVariables.get(\"pieceId\"))){\r", + " pm.collectionVariables.set(\"pieceRevision\", Number(pm.collectionVariables.get(\"pieceRevision\"))+1);\r", + " }\r", + " pm.collectionVariables.set(\"changeRequest\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + "\r", + " //Set creation date for historical object\r", + " isoTimestamp = pm.variables.replaceIn('{{$isoTimestamp}}')\r", + " date = isoTimestamp.replaceAll('-','').replaceAll(':',\"\").split(\".\").shift() + \"Z\";\r", + " pm.collectionVariables.set(\"historicalChange\",date);\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\n \"api\": \"https://onerecord.iata.org/ns/api#\"\n },\n \"@type\": \"api:Change\",\n \"api:hasLogisticsObject\": {\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\n },\n \"api:hasDescription\": \"Update goods description and coload\",\n \"api:hasOperation\": [{\n \"@type\": \"api:Operation\",\n \"api:op\": { \"@id\": \"api:ADD\" },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#goodsDescription\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#string\",\n \"api:hasValue\": \"ONE Record Advertisement Materials\"\n }]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": { \"@id\": \"api:DELETE\" },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#coload\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#boolean\",\n \"api:hasValue\": \"false\"\n }]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": { \"@id\": \"api:ADD\" },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#coload\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#boolean\",\n \"api:hasValue\": \"true\"\n }]\n }\n ],\n \"api:hasRevision\": {\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\n \"@value\": \"{{pieceRevision}}\"\n }\n}\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Validate Change Request", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 204\", () => {\r", + " pm.response.to.have.status(204);\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\n \"api\": \"https://onerecord.iata.org/ns/api#\"\n },\n \"@type\": \"api:Change\",\n \"api:hasLogisticsObject\": {\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\n },\n \"api:hasDescription\": \"Update goods description and coload\",\n \"api:hasOperation\": [{\n \"@type\": \"api:Operation\",\n \"api:op\": { \"@id\": \"api:ADD\" },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#goodsDescription\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#string\",\n \"api:hasValue\": \"ONE Record Advertisement Materials\"\n }]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": { \"@id\": \"api:DELETE\" },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#coload\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#boolean\",\n \"api:hasValue\": \"false\"\n }]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": { \"@id\": \"api:ADD\" },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#coload\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#boolean\",\n \"api:hasValue\": \"true\"\n }]\n }\n ],\n \"api:hasRevision\": {\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\n \"@value\": \"{{pieceRevision}}\"\n }\n}\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/action-requests/:changeRequest?status=REQUEST_ACCEPTED", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":changeRequest" + ], + "query": [ + { + "key": "status", + "value": "REQUEST_ACCEPTED" + } + ], + "variable": [ + { + "key": "changeRequest", + "value": "{{changeRequest}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get Piece Audit Trail", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString().split('?').shift()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response contains hasLatestRevision \", () => {\r", + " pm.expect(jsonData).to.have.property(\"https://onerecord.iata.org/ns/api#hasLatestRevision\");\r", + " });\r", + "\r", + " if (jsonData['https://onerecord.iata.org/ns/api#hasLatestRevision']['@value'] != \"1\") {\r", + " pm.test(\"Response contains hasChangeRequest \", () => {\r", + " pm.expect(jsonData).to.have.property(\"https://onerecord.iata.org/ns/api#hasChangeRequest\");\r", + " });\r", + " }\r", + "});\r", + "\r", + "\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/ld+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/audit-trail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "audit-trail" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get Historical Logistics Object 404", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "const apiNS = 'https://onerecord.iata.org/ns/api#';\r", + "var self = {};\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 404\", () => {\r", + " pm.response.to.have.status(404);\r", + "});\r", + "//Test response header\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "\r", + "//Test Error response payload\r", + "var responseJson = pm.response.json();\r", + "const framedJson = frame(responseJson);\r", + "\r", + "framedJson.then(function (result) {\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@type'] == apiNS + \"Error\") {\r", + " responseJson = element;\r", + " }\r", + " })\r", + " } else {\r", + " responseJson = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@id\");\r", + " });\r", + "\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(responseJson['@type']).to.eql(apiNS + \"Error\");\r", + " });\r", + "\r", + " pm.test(\"Response contains hasTitle \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasTitle\");\r", + " });\r", + "\r", + " pm.test(\"Response contains Error-hasErrorDetail \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasErrorDetail\");\r", + " });\r", + " var errorDetail = responseJson[apiNS + 'hasErrorDetail']\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasCode \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasCode\");\r", + " });\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasMessage \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasMessage\");\r", + " });\r", + "});\r", + "\r", + "\r", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId?at=20190926T075830Z", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "query": [ + { + "key": "at", + "value": "20190926T075830Z" + } + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get Historical Logistics Object 200", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + " //Set creation date for historical object\r", + " isoTimestamp = pm.variables.replaceIn('{{$isoTimestamp}}')\r", + " date = isoTimestamp.replaceAll('-','').replaceAll(':',\"\").split(\".\").shift() + \"Z\";\r", + " pm.collectionVariables.set(\"historicalChange\",date);" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "//Test response type presence\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\", () => {\r", + " pm.expect(pm.response.headers.filter(header=>header.key.includes(\"Type\")).map(header=>header.value)).to.include(\"https://onerecord.iata.org/ns/cargo#Piece\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Revision\");\r", + "});\r", + "pm.test(\"Latest-Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Latest-Revision\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "\r", + "pm.test(\"Revision different from Latest revisions\",() => {\r", + " pm.expect(pm.response.headers.get(\"Revision\")).to.not.eql(\"Lastest-Revision\"); \r", + "});\r", + "\r", + "//Update revision\r", + "pm.collectionVariables.set(\"pieceRevision\", pm.response.headers.get(\"Latest-Revision\"));\r", + "\r", + "\r", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId?at={{historicalChange}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "query": [ + { + "key": "at", + "value": "{{historicalChange}}" + } + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{pieceId}}" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Patch", + "item": [ + { + "name": "Create a new Piece", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Test Status Code\r", + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "// Test Response Headers\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Piece\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Piece\")){\r", + " pm.collectionVariables.set(\"patchPieceId\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + " pm.collectionVariables.set(\"patchPieceRevision\", 1);\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": \"cargo:Piece\",\n \"cargo:coload\": true,\n \"cargo:handlingInstructions\": [\n {\n \"@type\": \"cargo:HandlingInstructions\",\n \"cargo:handlingInstructionsType\": \"SPH\",\n \"cargo:description\": \"Important Piece\",\n \"cargo:handlingInstructionsTypeCode\": \"VAL\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + }, + { + "name": "Add gross weight", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#ChangeRequest\"); \r", + "});\r", + "\r", + "\r", + "var reqUrl = pm.variables.replaceIn(pm.request.url.toString());\r", + "if (pm.response.code == 201 ) {\r", + " pm.collectionVariables.set(\"patchRequest1\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + " // Update revisions\r", + " if (reqUrl.includes(pm.collectionVariables.get(\"patchPieceId\"))){\r", + " pm.collectionVariables.set(\"patchPieceRevision\", Number(pm.collectionVariables.get(\"patchPieceRevision\"))+1);\r", + " }\r", + " pm.collectionVariables.set(\"addWeightCR\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\n \"api\": \"https://onerecord.iata.org/ns/api#\"\n },\n \"@type\": \"api:Change\",\n \"api:hasLogisticsObject\": {\n \"@id\": \"{{baseUrl}}/logistics-objects/{{patchPieceId}}\"\n },\n \"api:hasDescription\": \"Add grossWeight\",\n \"api:hasOperation\": [\n {\n \"@type\": \"api:Operation\",\n \"api:op\": {\n \"@id\": \"api:ADD\"\n },\n \"api:s\": \"_:b0\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#numericalValue\",\n \"api:o\": [\n {\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#double\",\n \"api:hasValue\": \"20.0\"\n }\n ]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": {\n \"@id\": \"api:ADD\"\n },\n \"api:s\": \"_:b0\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#unit\",\n \"api:o\": [\n {\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#string\",\n \"api:hasValue\": \"KGM\"\n }\n ]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": {\n \"@id\": \"api:ADD\"\n },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{patchPieceId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#grossWeight\",\n \"api:o\": [\n {\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"https://onerecord.iata.org/ns/cargo#Value\",\n \"api:hasValue\": \"_:b0\"\n }\n ]\n }\n ],\n \"api:hasRevision\": {\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\n \"@value\": \"{{patchPieceRevision}}\"\n }\n}\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{patchPieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get Patch Action Request", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "//Test response headers\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test response type\r", + "pm.test(\"Check response type\", () => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#ChangeRequest\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " pm.test(\"Response @id contains {{baseUrl}}/logistics-objects \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/action-requests/\";\r", + " pm.expect(jsonData['@id']).to.include(expectedValue);\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.eql(\"https://onerecord.iata.org/ns/api#ChangeRequest\");\r", + " });\r", + " var hasRequestStatus = \"https://onerecord.iata.org/ns/api#hasRequestStatus\"\r", + " pm.test(\"Response contains hasRequestStatus\", () => {\r", + " pm.expect(jsonData).to.have.property(hasRequestStatus);\r", + " });\r", + " var isRequestedAt = \"https://onerecord.iata.org/ns/api#isRequestedAt\"\r", + " pm.test(\"Response contains isRequestedAt\", () => {\r", + " pm.expect(jsonData).to.have.property(isRequestedAt);\r", + " });\r", + " var isRequestedBy = \"https://onerecord.iata.org/ns/api#isRequestedBy\"\r", + " pm.test(\"Response contains isRequestedBy\", () => {\r", + " pm.expect(jsonData).to.have.property(isRequestedBy);\r", + " });\r", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/action-requests/:actionRequestId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":actionRequestId" + ], + "query": [ + { + "key": "", + "value": "", + "disabled": true + } + ], + "variable": [ + { + "key": "actionRequestId", + "value": "{{addWeightCR}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Validate Change Request", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 204\", () => {\r", + " pm.response.to.have.status(204);\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/action-requests/:changeRequest?status=REQUEST_ACCEPTED", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":changeRequest" + ], + "query": [ + { + "key": "status", + "value": "REQUEST_ACCEPTED" + } + ], + "variable": [ + { + "key": "changeRequest", + "value": "{{addWeightCR}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get created Piece", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "//Test response headers\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\", () => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Piece\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Revision\");\r", + "});\r", + "pm.test(\"Latest-Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Latest-Revision\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "var grossWeight = 'https://onerecord.iata.org/ns/cargo#grossWeight';\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString().split('?').shift()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " var handlingInstructions = \"https://onerecord.iata.org/ns/cargo#handlingInstructions\"\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response @id contains {{baseUrl}}/logistics-objects \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/logistics-objects/\";\r", + " pm.expect(jsonData['@id']).to.include(expectedValue);\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.include(\"https://onerecord.iata.org/ns/cargo#Piece\");\r", + " });\r", + " var coload = \"https://onerecord.iata.org/ns/cargo#coload\"\r", + " pm.test(\"Response contains coload\", () => {\r", + " pm.expect(jsonData).to.have.property(coload);\r", + " });\r", + " pm.test(\"Response value coload \", () => {\r", + " pm.expect(jsonData[coload]['@type']).to.eql('http://www.w3.org/2001/XMLSchema#boolean');\r", + " pm.expect(jsonData[coload]['@value']).to.eql('true');\r", + " });\r", + " pm.test(\"Response contains handlingInstructions \", () => {\r", + " pm.expect(jsonData).to.have.property(handlingInstructions);\r", + " });\r", + "\r", + " pm.test(\"Response contains handlingInstructions-@id\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains handlingInstructions-@type\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(\"@type\");\r", + " });\r", + " var description = 'https://onerecord.iata.org/ns/cargo#description'\r", + " pm.test(\"Response contains handlingInstructions-description\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(description);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-description\", () => {\r", + " pm.expect(jsonData[handlingInstructions][description]).to.eql('Important Piece');\r", + " });\r", + " var handlingInstructionsType = 'https://onerecord.iata.org/ns/cargo#handlingInstructionsType'\r", + " pm.test(\"Response contains handlingInstructions-handlingInstructionsType\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(handlingInstructionsType);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-handlingInstructionsType\", () => {\r", + " pm.expect(jsonData[handlingInstructions][handlingInstructionsType]).to.eql('SPH');\r", + " });\r", + " var handlingInstructionsTypeCode = 'https://onerecord.iata.org/ns/cargo#handlingInstructionsTypeCode'\r", + " pm.test(\"Response contains handlingInstructions-handlingInstructionsTypeCode\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(handlingInstructionsTypeCode);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-handlingInstructionsTypeCode\", () => {\r", + " pm.expect(jsonData[handlingInstructions][handlingInstructionsTypeCode]).to.eql('VAL');\r", + " });\r", + "\r", + " pm.test(\"Response contains grossWeight \", () => {\r", + " pm.expect(jsonData).to.have.property(grossWeight);\r", + " });\r", + "\r", + " pm.test(\"Response contains grossWeight-id \", () => {\r", + " pm.expect(jsonData[grossWeight]).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains grossWeight-type \", () => {\r", + " pm.expect(jsonData[grossWeight]).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value grossWeight-type \", () => {\r", + " pm.expect(jsonData[grossWeight]['@type']).to.eql(\"https://onerecord.iata.org/ns/cargo#Value\");\r", + " });\r", + " var numericalValue = 'https://onerecord.iata.org/ns/cargo#numericalValue'\r", + " pm.test(\"Response contains grossWeight-numericalValue\", () => {\r", + " pm.expect(jsonData[grossWeight]).to.have.property(numericalValue);\r", + " });\r", + " pm.test(\"Response contains grossWeight-numericalValue-type\", () => {\r", + " pm.expect(jsonData[grossWeight][numericalValue]).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response contains grossWeight-numericalValue-value\", () => {\r", + " pm.expect(jsonData[grossWeight][numericalValue]).to.have.property(\"@value\");\r", + " });\r", + " pm.test(\"Response value grossWeight-numericalValue-value\", () => {\r", + " pm.expect(parseFloat(jsonData[grossWeight][numericalValue][\"@value\"])).to.eql(parseFloat(\"20.0\"));\r", + " });\r", + " var unit = 'https://onerecord.iata.org/ns/cargo#unit'\r", + " pm.test(\"Response contains grossWeight-unit\", () => {\r", + " pm.expect(jsonData[grossWeight]).to.have.property(unit);\r", + " });\r", + " pm.test(\"Response value grossWeight-unit\", () => {\r", + " pm.expect(jsonData[grossWeight][unit]).to.eql(\"KGM\");\r", + " });\r", + " if (jsonData[grossWeight] != null && jsonData[grossWeight]['@id'] != null) {\r", + " pm.collectionVariables.set(\"internalNodeId\", jsonData[grossWeight]['@id']);\r", + " }\r", + "});\r", + "\r", + "//Update variables\r", + "pm.collectionVariables.set(\"patchPieceRevision\", pm.response.headers.get(\"Latest-Revision\"));\r", + "\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId?embedded=true", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "query": [ + { + "key": "embedded", + "value": "true" + } + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{patchPieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Change gross weight", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#ChangeRequest\"); \r", + "});\r", + "\r", + "var reqUrl = pm.variables.replaceIn(pm.request.url.toString());\r", + "if (pm.response.code == 201 ) {\r", + " // Update revisions\r", + " if (reqUrl.includes(pm.collectionVariables.get(\"patchPieceId\"))){\r", + " pm.collectionVariables.set(\"patchPieceRevision\", Number(pm.collectionVariables.get(\"patchPieceRevision\"))+1);\r", + " }\r", + " pm.collectionVariables.set(\"changeWeightCR\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + "\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\n \"api\": \"https://onerecord.iata.org/ns/api#\"\n },\n \"@type\": \"api:Change\",\n \"api:hasLogisticsObject\": {\n \"@id\": \"{{baseUrl}}/logistics-objects/{{patchPieceId}}\"\n },\n \"api:hasDescription\": \"Change grossWeight\",\n \"api:hasOperation\": [{\n \"@type\": \"api:Operation\",\n \"api:op\": {\n \"@id\": \"api:DELETE\"\n },\n \"api:s\": \"{{internalNodeId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#numericalValue\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#double\",\n \"api:hasValue\": \"20.0\"\n }]\n },\n {\n \"@type\": \"api:Operation\",\n \"api:op\": {\n \"@id\": \"api:ADD\"\n },\n \"api:s\": \"{{internalNodeId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#numericalValue\",\n \"api:o\": [{\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#double\",\n \"api:hasValue\": \"25.0\"\n }]\n }\n ],\n \"api:hasRevision\": {\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\n \"@value\": \"{{patchPieceRevision}}\"\n }\n}\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{patchPieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Validate Change Request", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 204\", () => {\r", + " pm.response.to.have.status(204);\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/action-requests/:changeRequest?status=REQUEST_ACCEPTED", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":changeRequest" + ], + "query": [ + { + "key": "status", + "value": "REQUEST_ACCEPTED" + } + ], + "variable": [ + { + "key": "changeRequest", + "value": "{{changeWeightCR}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get modified Piece", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "//Test response headers\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\", () => {\r", + " pm.expect(pm.response.headers.filter(header=>header.key.includes(\"Type\")).map(header=>header.value)).to.include(\"https://onerecord.iata.org/ns/cargo#Piece\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Revision\");\r", + "});\r", + "pm.test(\"Latest-Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Latest-Revision\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "var grossWeight = 'https://onerecord.iata.org/ns/cargo#grossWeight';\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString().split('?').shift()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " var handlingInstructions = \"https://onerecord.iata.org/ns/cargo#handlingInstructions\"\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response @id contains {{baseUrl}}/logistics-objects \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/logistics-objects/\";\r", + " pm.expect(jsonData['@id']).to.include(expectedValue);\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.include(\"https://onerecord.iata.org/ns/cargo#Piece\");\r", + " });\r", + " var coload = \"https://onerecord.iata.org/ns/cargo#coload\"\r", + " pm.test(\"Response contains coload\", () => {\r", + " pm.expect(jsonData).to.have.property(coload);\r", + " });\r", + " pm.test(\"Response value coload \", () => {\r", + " pm.expect(jsonData[coload]['@type']).to.eql('http://www.w3.org/2001/XMLSchema#boolean');\r", + " pm.expect(jsonData[coload]['@value']).to.eql('true');\r", + " });\r", + " pm.test(\"Response contains handlingInstructions \", () => {\r", + " pm.expect(jsonData).to.have.property(handlingInstructions);\r", + " });\r", + "\r", + " pm.test(\"Response contains handlingInstructions-@id\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains handlingInstructions-@type\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(\"@type\");\r", + " });\r", + " var description = 'https://onerecord.iata.org/ns/cargo#description'\r", + " pm.test(\"Response contains handlingInstructions-description\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(description);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-description\", () => {\r", + " pm.expect(jsonData[handlingInstructions][description]).to.eql('Important Piece');\r", + " });\r", + " var handlingInstructionsType = 'https://onerecord.iata.org/ns/cargo#handlingInstructionsType'\r", + " pm.test(\"Response contains handlingInstructions-handlingInstructionsType\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(handlingInstructionsType);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-handlingInstructionsType\", () => {\r", + " pm.expect(jsonData[handlingInstructions][handlingInstructionsType]).to.eql('SPH');\r", + " });\r", + " var handlingInstructionsTypeCode = 'https://onerecord.iata.org/ns/cargo#handlingInstructionsTypeCode'\r", + " pm.test(\"Response contains handlingInstructions-handlingInstructionsTypeCode\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(handlingInstructionsTypeCode);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-handlingInstructionsTypeCode\", () => {\r", + " pm.expect(jsonData[handlingInstructions][handlingInstructionsTypeCode]).to.eql('VAL');\r", + " });\r", + "\r", + " pm.test(\"Response contains grossWeight \", () => {\r", + " pm.expect(jsonData).to.have.property(grossWeight);\r", + " });\r", + "\r", + " pm.test(\"Response contains grossWeight-id \", () => {\r", + " pm.expect(jsonData[grossWeight]).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains grossWeight-type \", () => {\r", + " pm.expect(jsonData[grossWeight]).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value grossWeight-type \", () => {\r", + " pm.expect(jsonData[grossWeight]['@type']).to.eql(\"https://onerecord.iata.org/ns/cargo#Value\");\r", + " });\r", + " var numericalValue = 'https://onerecord.iata.org/ns/cargo#numericalValue'\r", + " pm.test(\"Response contains grossWeight-numericalValue\", () => {\r", + " pm.expect(jsonData[grossWeight]).to.have.property(numericalValue);\r", + " });\r", + " pm.test(\"Response contains grossWeight-numericalValue-type\", () => {\r", + " pm.expect(jsonData[grossWeight][numericalValue]).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response contains grossWeight-numericalValue-value\", () => {\r", + " pm.expect(jsonData[grossWeight][numericalValue]).to.have.property(\"@value\");\r", + " });\r", + " pm.test(\"Response value grossWeight-numericalValue-value\", () => {\r", + " pm.expect(parseFloat(jsonData[grossWeight][numericalValue][\"@value\"])).to.eql(parseFloat(\"25.0\"));\r", + " });\r", + " var unit = 'https://onerecord.iata.org/ns/cargo#unit'\r", + " pm.test(\"Response contains grossWeight-unit\", () => {\r", + " pm.expect(jsonData[grossWeight]).to.have.property(unit);\r", + " });\r", + " pm.test(\"Response value grossWeight-unit\", () => {\r", + " pm.expect(jsonData[grossWeight][unit]).to.eql(\"KGM\");\r", + " });\r", + " if (jsonData[grossWeight] != null && jsonData[grossWeight]['@id'] != null) {\r", + " pm.collectionVariables.set(\"internalNodeId\", jsonData[grossWeight]['@id']);\r", + " }\r", + "});\r", + "\r", + "//Update variables\r", + "pm.collectionVariables.set(\"patchPieceRevision\", pm.response.headers.get(\"Latest-Revision\"));\r", + "\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId?embedded=true", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "query": [ + { + "key": "embedded", + "value": "true" + } + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{patchPieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Delete gross weight", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#ChangeRequest\"); \r", + "});\r", + "\r", + "var reqUrl = pm.variables.replaceIn(pm.request.url.toString());\r", + "if (pm.response.code == 201 ) {\r", + " // Update revisions\r", + " if (reqUrl.includes(pm.collectionVariables.get(\"patchPieceId\"))){\r", + " pm.collectionVariables.set(\"patchPieceRevision\", Number(pm.collectionVariables.get(\"patchPieceRevision\"))+1);\r", + " }\r", + " pm.collectionVariables.set(\"deleteWeightCR\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + "\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:Change\",\r\n \"api:hasLogisticsObject\": {\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{patchPieceId}}\"\r\n },\r\n \"api:hasDescription\": \"delete grossWeight\",\r\n \"api:hasOperation\": [\r\n {\r\n \"@type\": \"api:Operation\",\r\n \"api:op\": {\r\n \"@id\": \"api:DELETE\"\r\n },\r\n \"api:s\": \"{{internalNodeId}}\",\r\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#unit\",\r\n \"api:o\": [{\r\n \"@type\": \"api:OperationObject\",\r\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#string\",\r\n \"api:hasValue\": \"KGM\"\r\n }]\r\n },\r\n {\r\n \"@type\": \"api:Operation\",\r\n \"api:op\": {\r\n \"@id\": \"api:DELETE\"\r\n },\r\n \"api:s\": \"{{internalNodeId}}\",\r\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#numericalValue\",\r\n \"api:o\": [{\r\n \"@type\": \"api:OperationObject\",\r\n \"api:hasDatatype\": \"http://www.w3.org/2001/XMLSchema#double\",\r\n \"api:hasValue\": \"25.0\"\r\n }]\r\n },\r\n {\r\n \"@type\": \"api:Operation\",\r\n \"api:op\": {\r\n \"@id\": \"api:DELETE\"\r\n },\r\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{patchPieceId}}\",\r\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#grossWeight\",\r\n \"api:o\": [{\r\n \"@type\": \"api:OperationObject\",\r\n \"api:hasDatatype\": \"https://onerecord.iata.org/ns/cargo#Value\",\r\n \"api:hasValue\": \"{{internalNodeId}}\"\r\n }]\r\n }\r\n ],\r\n \"api:hasRevision\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\r\n \"@value\": \"{{patchPieceRevision}}\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{patchPieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Validate Change Request", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 204\", () => {\r", + " pm.response.to.have.status(204);\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/action-requests/:changeRequest?status=REQUEST_ACCEPTED", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":changeRequest" + ], + "query": [ + { + "key": "status", + "value": "REQUEST_ACCEPTED" + } + ], + "variable": [ + { + "key": "changeRequest", + "value": "{{deleteWeightCR}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Wrong Patch Operation", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test response code\r", + "//IMPORTANT: this test should not change the Logistics Object!!!\r", + "pm.test(\"Response Status code is 400\", () => {\r", + " pm.response.to.have.status(400);\r", + "});\r", + "\r", + "pm.test(\"Content-Type is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "\r", + "//Test response payload\r", + "\r", + "if (pm.response.code == 400) {\r", + " var jsonData = pm.response.json()\r", + " console.log(jsonData)\r", + "\r", + " const framedJson = frame(jsonData)\r", + " console.log(framedJson)\r", + " framedJson.then(function (result) {\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@type'] == 'https://onerecord.iata.org/ns/api#Error') {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + "\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.eql(\"https://onerecord.iata.org/ns/api#Error\");\r", + " });\r", + "\r", + " pm.test(\"Response contains hasTitle \", () => {\r", + " pm.expect(jsonData).to.have.property(\"https://onerecord.iata.org/ns/api#hasTitle\");\r", + " });\r", + "\r", + " pm.test(\"Response contains hasErrorDetail \", () => {\r", + " pm.expect(jsonData).to.have.property(\"https://onerecord.iata.org/ns/api#hasErrorDetail\");\r", + " });\r", + " });\r", + "}\r", + "\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "//Wrong construction of the JSON payload \r\n{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:Change\",\r\n \"api:hasLogisticsObject\": [\r\n {\r\n \"@type\": \"cargo:LogisticsObject\",\r\n \"@id\": \"https://1r.example.com/logistics-objects/{{patchPieceId}}\"\r\n }\r\n ], \r\n \"api:hasDescription\": \"add LogisticsEvent\",\r\n \"api:hasOperation\": [\r\n {\r\n \"@type\": \"api:Operation\",\r\n \"api:op\": { \"@id\": \"api:ADD\" },\r\n \"api:subject\": \"{{baseUrl}}/logistics-objects/{{patchPieceId}}\",\r\n \"api:predicate\": \"https://onerecord.iata.org/ns/cargo#hasLogisticsEvent\",\r\n \"api:obj\": [\r\n {\r\n \"@type\": \"api:OperationObject\",\r\n \"api:hasDatatype\": \"https://onerecord.iata.org/ns/cargo#LogisticsEvent\",\r\n \"api:hasValue\": \"{{baseUrl}}/logistics-objects/{{patchPieceId}}/logistics-events/c9ab534e-3246-48d3-b34d-bb380bd98af7\"\r\n }\r\n ]\r\n } \r\n ], \r\n \"api:hasRevision\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\r\n \"@value\": \"{{patchPieceRevision}}\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{patchPieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get final Piece", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "//Test response headers\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\", () => {\r", + " pm.expect(pm.response.headers.filter(header=>header.key.includes(\"Type\")).map(header=>header.value)).to.include(\"https://onerecord.iata.org/ns/cargo#Piece\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Revision\");\r", + "});\r", + "pm.test(\"Latest-Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Latest-Revision\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString().split('?').shift()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + "\r", + " var handlingInstructions = \"https://onerecord.iata.org/ns/cargo#handlingInstructions\"\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response @id contains {{baseUrl}}/logistics-objects \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/logistics-objects/\";\r", + " pm.expect(jsonData['@id']).to.include(expectedValue);\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.include(\"https://onerecord.iata.org/ns/cargo#Piece\");\r", + " });\r", + " var coload = \"https://onerecord.iata.org/ns/cargo#coload\"\r", + " pm.test(\"Response contains coload\", () => {\r", + " pm.expect(jsonData).to.have.property(coload);\r", + " });\r", + " pm.test(\"Response value coload \", () => {\r", + " pm.expect(jsonData[coload]['@type']).to.eql('http://www.w3.org/2001/XMLSchema#boolean');\r", + " pm.expect(jsonData[coload]['@value']).to.eql('true');\r", + " });\r", + " pm.test(\"Response contains handlingInstructions \", () => {\r", + " pm.expect(jsonData).to.have.property(handlingInstructions);\r", + " });\r", + "\r", + " pm.test(\"Response contains handlingInstructions-@id\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains handlingInstructions-@type\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(\"@type\");\r", + " });\r", + " var description = 'https://onerecord.iata.org/ns/cargo#description'\r", + " pm.test(\"Response contains handlingInstructions-description\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(description);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-description\", () => {\r", + " pm.expect(jsonData[handlingInstructions][description]).to.eql('Important Piece');\r", + " });\r", + " var handlingInstructionsType = 'https://onerecord.iata.org/ns/cargo#handlingInstructionsType'\r", + " pm.test(\"Response contains handlingInstructions-handlingInstructionsType\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(handlingInstructionsType);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-handlingInstructionsType\", () => {\r", + " pm.expect(jsonData[handlingInstructions][handlingInstructionsType]).to.eql('SPH');\r", + " });\r", + " var handlingInstructionsTypeCode = 'https://onerecord.iata.org/ns/cargo#handlingInstructionsTypeCode'\r", + " pm.test(\"Response contains handlingInstructions-handlingInstructionsTypeCode\", () => {\r", + " pm.expect(jsonData[handlingInstructions]).to.have.property(handlingInstructionsTypeCode);\r", + " });\r", + " pm.test(\"Response value handlingInstructions-handlingInstructionsTypeCode\", () => {\r", + " pm.expect(jsonData[handlingInstructions][handlingInstructionsTypeCode]).to.eql('VAL');\r", + " });\r", + "});\r", + "//Update variables\r", + "pm.collectionVariables.set(\"pieceRevision\", pm.response.headers.get(\"Latest-Revision\"));\r", + "\r", + "\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{patchPieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Create a new Shipment", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Test Status Code\r", + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "// Test Response Headers\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Shipment\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Shipment\")){\r", + " pm.collectionVariables.set(\"patchShipmentId\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + " pm.collectionVariables.set(\"patchShipmentRevision\", 1);\r", + "}" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": \"cargo:Shipment\",\n \"cargo:goodsDescription\": \"Valuable cargo\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + }, + { + "name": "Link shipment with piece", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#ChangeRequest\"); \r", + "});\r", + "\r", + "\r", + "var reqUrl = pm.variables.replaceIn(pm.request.url.toString());\r", + "if (pm.response.code == 201 ) {\r", + " pm.collectionVariables.set(\"patchRequestShipment\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + " // Update revisions\r", + " if (reqUrl.includes(pm.collectionVariables.get(\"patchShipmentId\"))){\r", + " pm.collectionVariables.set(\"patchShipmentRevision\", Number(pm.collectionVariables.get(\"patchPieceRevision\"))+1);\r", + " }\r", + "}" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\n \"api\": \"https://onerecord.iata.org/ns/api#\"\n },\n \"@type\": \"api:Change\",\n \"api:hasLogisticsObject\": {\n \"@id\": \"{{baseUrl}}/logistics-objects/{{patchShipmentId}}\"\n },\n \"api:hasDescription\": \"Link shipment with piece\",\n \"api:hasOperation\": [\n {\n \"@type\": \"api:Operation\",\n \"api:op\": {\n \"@id\": \"api:ADD\"\n },\n \"api:s\": \"{{baseUrl}}/logistics-objects/{{patchShipmentId}}\",\n \"api:p\": \"https://onerecord.iata.org/ns/cargo#pieces\",\n \"api:o\": [\n {\n \"@type\": \"api:OperationObject\",\n \"api:hasDatatype\": \"https://onerecord.iata.org/ns/cargo#Piece\",\n \"api:hasValue\": \"{{baseUrl}}/logistics-objects/{{patchPieceId}}\"\n }\n ]\n }\n ],\n \"api:hasRevision\": {\n \"@type\": \"http://www.w3.org/2001/XMLSchema#positiveInteger\",\n \"@value\": \"{{patchShipmentRevision}}\"\n }\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticObjectId" + ], + "variable": [ + { + "key": "logisticObjectId", + "value": "{{patchShipmentId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Validate Change Request", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 204\", () => {\r", + " pm.response.to.have.status(204);\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/action-requests/:changeRequest?status=REQUEST_ACCEPTED", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":changeRequest" + ], + "query": [ + { + "key": "status", + "value": "REQUEST_ACCEPTED" + } + ], + "variable": [ + { + "key": "changeRequest", + "value": "{{patchRequestShipment}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get final Shipment", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "//Test response headers\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\", () => {\r", + " pm.expect(pm.response.headers.filter(header=>header.key.includes(\"Type\")).map(header=>header.value)).to.include(\"https://onerecord.iata.org/ns/cargo#Shipment\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Revision\");\r", + "});\r", + "pm.test(\"Latest-Revision header is present\", () => {\r", + " pm.response.to.have.header(\"Latest-Revision\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString().split('?').shift()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response @id contains {{baseUrl}}/logistics-objects \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/logistics-objects/\";\r", + " pm.expect(jsonData['@id']).to.include(expectedValue);\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.include(\"https://onerecord.iata.org/ns/cargo#Shipment\");\r", + " });\r", + " var pieces = \"https://onerecord.iata.org/ns/cargo#pieces\"\r", + " pm.test(\"Response contains pieces\", () => {\r", + " pm.expect(jsonData).to.have.property(pieces);\r", + " });\r", + " pm.test(\"Response value Pieces\", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/logistics-objects/\" + pm.variables.get(\"patchPieceId\");\r", + " pm.expect(jsonData[pieces]['@id']).to.eql(expectedValue);\r", + " });\r", + "});\r", + "\r", + "\r", + "\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{patchShipmentId}}" + } + ] + } + }, + "response": [] + } + ] + } + ], + "description": "This folder contains all unit tests for Logistics Objects endpoint. For more information visit : [ONE Record Logistics Objects](https://iata-cargo.github.io/ONE-Record/logistics-objects/)\n\n**Important**: Tests should be run using the defined order as each test saves variable for the next one." + }, + { + "name": "Logistics Events", + "item": [ + { + "name": "Prerequisite", + "item": [ + { + "name": "Create a Company", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Create a company to be used in the Logistics Events Test\r", + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "\r", + "//Test type header\r", + "pm.test(\"Check type\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Company\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Company\")){\r", + " pm.collectionVariables.set(\"companyId\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + " pm.collectionVariables.set(\"companyRevision\", 1);\r", + " pm.collectionVariables.set(\"companyCreationTime\", Date.now());\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": [\n \"cargo:Company\"\n ],\n \"cargo:name\": \"Acme Corporation\",\n \"cargo:shortName\": \"ACME\",\n \"cargo:contactPersons\": [\n {\n \"@type\": [\n \"cargo:Person\",\n \"cargo:Actor\",\n \"cargo:LogisticsAgent\",\n \"cargo:LogisticsObject\"\n ],\n \"cargo:firstName\": \"Jane\",\n \"cargo:lastName\": \"Doe\",\n \"cargo:salutation\": \"Ms\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + }, + { + "name": "Create a Shipment", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Shipment\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Shipment\")){\r", + " pm.collectionVariables.set(\"shipmentId\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + " pm.collectionVariables.set(\"shipmentRevision\", 1);\r", + " pm.collectionVariables.set(\"shipmentCreationTime\", Date.now());\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "//Create a company to be used in the Logistics Events Test\n{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": \"cargo:Shipment\",\n \"cargo:goodsDescription\": \"Lots of awesome ONE Record information materials\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Create", + "item": [ + { + "name": "Add Shipment Test Event", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#LogisticsEvent\"); \r", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/ld+json", + "name": "Content-Type", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\r\n },\r\n \"@type\": \"cargo:LogisticsEvent\",\r\n \"cargo:creationDate\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\r\n \"@value\": \"2023-10-01T10:38:01.000Z\"\r\n },\r\n \"cargo:eventDate\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\r\n \"@value\": \"2023-10-01T10:38:01.000Z\"\r\n },\r\n \"cargo:eventCode\": {\r\n \"@type\": \"cargo:CodeListElement\",\r\n \"cargo:code\": \"TEST\",\r\n \"cargo:codeListName\": \"Test\"\r\n },\r\n \"cargo:eventName\": \"Test Event on shipment record\",\r\n \"cargo:eventTimeType\": {\r\n \"@type\": \"cargo:EventTimeType\",\r\n \"@id\": \"cargo:ACTUAL\"\r\n }, \"cargo:partialEventIndicator\": false,\r\n \"cargo:eventFor\": {\r\n \"@type\": \"cargo:Shipment\",\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{shipmentId}}\"\r\n },\r\n \"cargo:recordingOrganization\": {\r\n \"@type\": \"cargo:Company\",\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{companyId}}\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Add Shipment Departed Event", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#LogisticsEvent\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "pm.collectionVariables.set(\"LEId\", pm.response.headers.get(\"Location\").split(\"/\").pop());" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/ld+json", + "name": "Content-Type", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\r\n },\r\n \"@type\": \"cargo:LogisticsEvent\",\r\n \"cargo:creationDate\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\r\n \"@value\": \"2023-04-01T10:38:01.000Z\"\r\n },\r\n \"cargo:eventDate\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\r\n \"@value\": \"2023-04-01T10:38:01.000Z\"\r\n },\r\n \"cargo:eventCode\": {\r\n \"@type\": \"cargo:CodeListElement\",\r\n \"cargo:code\": \"DEP\",\r\n \"cargo:codeListName\": \"Departure\"\r\n },\r\n \"cargo:eventName\": \"Consignment departed on a specific flight\",\r\n \"cargo:eventTimeType\": {\r\n \"@type\": \"cargo:EventTimeType\",\r\n \"@id\": \"cargo:ACTUAL\"\r\n },\r\n \"cargo:partialEventIndicator\": false,\r\n \"cargo:eventFor\": {\r\n \"@type\": \"cargo:Shipment\",\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{shipmentId}}\"\r\n },\r\n \"cargo:recordingOrganization\": {\r\n \"@type\": \"cargo:Company\",\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{companyId}}\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Add event on a not existing Logistics Object", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "const apiNS = 'https://onerecord.iata.org/ns/api#';\r", + "var self = {};\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 404\", () => {\r", + " pm.response.to.have.status(404);\r", + "});\r", + "\r", + "//Test Error response payload\r", + "var responseJson = pm.response.json();\r", + "const framedJson = frame(responseJson);\r", + "\r", + "framedJson.then(function (result) {\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@type'] == apiNS + \"Error\") {\r", + " responseJson = element;\r", + " }\r", + " })\r", + " } else {\r", + " responseJson = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Contain Error\", () => {\r", + " pm.expect(responseJson[\"@type\"]).to.eql(apiNS + \"Error\")\r", + " });\r", + "\r", + " pm.test(\"Response contains Error-hasTitle \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasTitle\");\r", + " });\r", + " pm.test(\"Response contains Error-hasErrorDetail \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasErrorDetail\");\r", + " });\r", + " var errorDetail = responseJson[apiNS + 'hasErrorDetail']\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasCode \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasCode\");\r", + " });\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasMessage \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasMessage\");\r", + " });\r", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/ld+json", + "name": "Content-Type", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\r\n },\r\n \"@type\": \"cargo:LogisticsEvent\",\r\n \"cargo:creationDate\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\r\n \"@value\": \"2023-04-01T10:38:01.000Z\"\r\n },\r\n \"cargo:eventDate\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\r\n \"@value\": \"2023-04-01T10:38:01.000Z\"\r\n },\r\n \"cargo:eventCode\": {\r\n \"@type\": \"cargo:CodeListElement\",\r\n \"cargo:code\": \"DEP\",\r\n \"cargo:codeListName\": \"Departure\"\r\n },\r\n \"cargo:eventName\": \"Consignment departed on a specific flight\",\r\n \"cargo:eventTimeType\": {\r\n \"@type\": \"cargo:EventTimeType\",\r\n \"@id\": \"cargo:ACTUAL\"\r\n }, \"cargo:partialEventIndicator\": false,\r\n \"cargo:eventFor\": {\r\n \"@type\": \"cargo:Shipment\",\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{shipmentId}}\"\r\n },\r\n \"cargo:recordingOrganization\": {\r\n \"@type\": \"cargo:Company\",\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{companyId}}\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "NotExistingLO", + "description": "Setup to not existing logistics object" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Get", + "item": [ + { + "name": "Get a Logistics Event", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test response code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "//Test response type presence\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test response type\r", + "pm.test(\"Check type\", () => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#LogisticsEvent\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response @id contains {{baseUrl}}/logistics-objects/{{logisticsObject}}/logistics-events/{{logisticsEvent}}/ \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/logistics-objects/\" + pm.variables.get(\"shipmentId\") + \"/logistics-events/\" + pm.variables.get(\"LEId\");\r", + " pm.expect(jsonData['@id']).to.include(expectedValue);\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.eql(\"https://onerecord.iata.org/ns/cargo#LogisticsEvent\");\r", + " });\r", + " var creationDate = \"https://onerecord.iata.org/ns/cargo#creationDate\";\r", + " pm.test(\"Response contains creationDate\", () => {\r", + " pm.expect(jsonData).to.have.property(creationDate);\r", + " });\r", + " //Creation Date value is set by the server\r", + " pm.test(\"Response value creationDate \", () => {\r", + " pm.expect(jsonData[creationDate]['@type']).to.eql('http://www.w3.org/2001/XMLSchema#dateTime');\r", + " });\r", + " var eventDate = \"https://onerecord.iata.org/ns/cargo#eventDate\";\r", + " pm.test(\"Response contains eventDate\", () => {\r", + " pm.expect(jsonData).to.have.property(eventDate);\r", + " });\r", + " pm.test(\"Response value eventDate \", () => {\r", + " pm.expect(jsonData[eventDate]['@type']).to.eql('http://www.w3.org/2001/XMLSchema#dateTime');\r", + " pm.expect(jsonData[eventDate]['@value']).to.eql('2023-04-01T10:38:01Z');\r", + " });\r", + "\r", + " var eventCode = 'https://onerecord.iata.org/ns/cargo#eventCode';\r", + " pm.test(\"Response contains eventCode\", () => {\r", + " pm.expect(jsonData).to.have.property(eventCode);\r", + " });\r", + " pm.test(\"Response value eventCode\", () => {\r", + " if ('@type' in jsonData[eventCode]) {\r", + " pm.expect(jsonData[eventCode]['@type']).to.eql('https://onerecord.iata.org/ns/cargo#CodeListElement');\r", + " }\r", + " pm.expect(jsonData[eventCode]['https://onerecord.iata.org/ns/cargo#code']).to.eql('DEP');\r", + " pm.expect(jsonData[eventCode]['https://onerecord.iata.org/ns/cargo#codeListName']).to.eql('Departure');\r", + "\r", + " });\r", + " var eventName = 'https://onerecord.iata.org/ns/cargo#eventName';\r", + " pm.test(\"Response contains eventName\", () => {\r", + " pm.expect(jsonData).to.have.property(eventName);\r", + " });\r", + " pm.test(\"Response value eventName\", () => {\r", + " pm.expect(jsonData[eventName]).to.eql('Consignment departed on a specific flight');\r", + " });\r", + "\r", + " var eventTimeType = 'https://onerecord.iata.org/ns/cargo#eventTimeType';\r", + " pm.test(\"Response contains eventTimeType\", () => {\r", + " pm.expect(jsonData).to.have.property(eventTimeType);\r", + " });\r", + " pm.test(\"Response value eventTimeType \", () => {\r", + " if ('@type' in jsonData[eventTimeType]) {\r", + " pm.expect(jsonData[eventTimeType]['@type']).to.eql('https://onerecord.iata.org/ns/cargo#EventTimeType');\r", + " }\r", + " pm.expect(jsonData[eventTimeType]['@id']).to.eql('https://onerecord.iata.org/ns/cargo#ACTUAL');\r", + " });\r", + "\r", + " var eventFor = \"https://onerecord.iata.org/ns/cargo#eventFor\";\r", + " pm.test(\"Response contains eventFor\", () => {\r", + " pm.expect(jsonData).to.have.property(eventFor);\r", + " });\r", + " pm.test(\"Response value eventFor \", () => {\r", + " if ('@type' in jsonData[eventFor]) {\r", + " pm.expect(jsonData[eventFor]['@type']).to.eql('https://onerecord.iata.org/ns/cargo#Shipment');\r", + " }\r", + " pm.expect(jsonData[eventFor]['@id']).to.eql(pm.variables.get(\"baseUrl\") + \"/logistics-objects/\" + pm.variables.get(\"shipmentId\"));\r", + " });\r", + "\r", + " var recordingOrganization = \"https://onerecord.iata.org/ns/cargo#recordingOrganization\";\r", + " pm.test(\"Response contains recordingOrganization\", () => {\r", + " pm.expect(jsonData).to.have.property(recordingOrganization);\r", + " });\r", + " pm.test(\"Response value recordingOrganization \", () => {\r", + " if ('@type' in jsonData[recordingOrganization]) {\r", + " pm.expect(jsonData[recordingOrganization]['@type']).to.eql('https://onerecord.iata.org/ns/cargo#Company');\r", + " }\r", + " pm.expect(jsonData[recordingOrganization]['@id']).to.eql(pm.variables.get(\"baseUrl\") + \"/logistics-objects/\" + pm.variables.get(\"companyId\"));\r", + " });\r", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events/:logisticsEventId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events", + ":logisticsEventId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + }, + { + "key": "logisticsEventId", + "value": "{{LEId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get a not existing Logistics Event", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "const apiNS = 'https://onerecord.iata.org/ns/api#';\r", + "var self = {};\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 404\", () => {\r", + " pm.response.to.have.status(404);\r", + "});\r", + "\r", + "//Test Error response payload\r", + "var responseJson = pm.response.json();\r", + "const framedJson = frame(responseJson);\r", + "\r", + "framedJson.then(function (result) {\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@type'] == apiNS + \"Error\") {\r", + " responseJson = element;\r", + " }\r", + " })\r", + " } else {\r", + " responseJson = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Contain Error\", () => {\r", + " pm.expect(responseJson[\"@type\"]).to.eql(apiNS + \"Error\")\r", + " });\r", + "\r", + " pm.test(\"Response contains Error-hasTitle \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasTitle\");\r", + " });\r", + " pm.test(\"Response contains Error-hasErrorDetail \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasErrorDetail\");\r", + " });\r", + " var errorDetail = responseJson[apiNS + 'hasErrorDetail']\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasCode \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasCode\");\r", + " });\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasMessage \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasMessage\");\r", + " });\r", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events/:logisticsEventId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events", + ":logisticsEventId" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{pieceId}}" + }, + { + "key": "logisticsEventId", + "value": "notExisingLE", + "description": "Setup to not exiting Logistics Event" + } + ] + } + }, + "response": [] + }, + { + "name": "Get all Logistics Events of a Logistics Object", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test response code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "//Test response type presence\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test response type\r", + "pm.test(\"Check type\", () => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#Collection\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@type'] == 'https://onerecord.iata.org/ns/api#Collection') {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + "\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.eql(\"https://onerecord.iata.org/ns/api#Collection\");\r", + " });\r", + "\r", + " var hasTotalItems = 'https://onerecord.iata.org/ns/api#hasTotalItems';\r", + " pm.test(\"Response contains hasTotalItems\", () => {\r", + " pm.expect(jsonData).to.have.property(hasTotalItems);\r", + " });\r", + " if (jsonData[hasTotalItems]['@value']){\r", + " pm.test(\"Response value hasTotalItems\", () => {\r", + " pm.expect(parseInt(jsonData[hasTotalItems]['@value'])).to.eql(2);\r", + " });\r", + " } else {\r", + " pm.test(\"Response value hasTotalItems\", () => {\r", + " pm.expect(parseInt(jsonData[hasTotalItems])).to.eql(2);\r", + " });\r", + " }\r", + " \r", + " var hasItem = 'https://onerecord.iata.org/ns/api#hasItem';\r", + " pm.test(\"Response contains hasItem\", () => {\r", + " pm.expect(jsonData).to.have.property(hasItem);\r", + " });\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events/", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events", + "" + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get all Logistics Events DEP of a Logistics Object", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test response code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "//Test response type presence\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test response type\r", + "pm.test(\"Check type\", () => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#Collection\");\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@type'] == 'https://onerecord.iata.org/ns/api#Collection') {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + "\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.eql(\"https://onerecord.iata.org/ns/api#Collection\");\r", + " });\r", + "\r", + " var hasTotalItems = 'https://onerecord.iata.org/ns/api#hasTotalItems';\r", + " if (jsonData[hasTotalItems]['@value']){\r", + " pm.test(\"Response value hasTotalItems\", () => {\r", + " pm.expect(parseInt(jsonData[hasTotalItems]['@value'])).to.eql(1);\r", + " });\r", + " } else {\r", + " pm.test(\"Response value hasTotalItems\", () => {\r", + " pm.expect(parseInt(jsonData[hasTotalItems])).to.eql(1);\r", + " });\r", + " }\r", + "\r", + " var hasItem = 'https://onerecord.iata.org/ns/api#hasItem';\r", + " pm.test(\"Response contains hasItem\", () => {\r", + " pm.expect(jsonData).to.have.property(hasItem);\r", + " });\r", + "\r", + " var hasItem = 'https://onerecord.iata.org/ns/api#hasItem';\r", + " var eventCode = 'https://onerecord.iata.org/ns/cargo#eventCode';\r", + " var code = 'https://onerecord.iata.org/ns/cargo#code';\r", + " //The following test can fail according on how the return body is implemented.\r", + " //The test checks that the only returned event has eventCode=DEP.\r", + " //Please check the error and adjust the test.\r", + " pm.test(\"Eventcode=DEP inside hasItem\", () => {\r", + " pm.expect(jsonData[hasItem][eventCode][code]).to.eql('DEP');\r", + " });\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects/:logisticsObjectId/logistics-events/?eventType=DEP", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects", + ":logisticsObjectId", + "logistics-events", + "" + ], + "query": [ + { + "key": "eventType", + "value": "DEP" + } + ], + "variable": [ + { + "key": "logisticsObjectId", + "value": "{{shipmentId}}" + } + ] + } + }, + "response": [] + } + ] + } + ] + }, + { + "name": "Subscriptions", + "item": [ + { + "name": "Prerequisite", + "item": [ + { + "name": "Create a Company", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Create a company to be used in the Logistics Events Test\r", + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "\r", + "//Test type header\r", + "pm.test(\"Check type\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Company\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Company\")){\r", + " pm.collectionVariables.set(\"extCompany\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": [\n \"cargo:Company\"\n ],\n \"cargo:name\": \"GHA Company\",\n \"cargo:shortName\": \"GHA\",\n \"cargo:contactPersons\": [\n {\n \"@type\": [\n \"cargo:Person\",\n \"cargo:Actor\",\n \"cargo:LogisticsAgent\",\n \"cargo:LogisticsObject\"\n ],\n \"cargo:firstName\": \"Jane\",\n \"cargo:lastName\": \"Doe\",\n \"cargo:salutation\": \"Ms\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + }, + { + "name": "Create a Piece", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Test Status Code\r", + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "// Test Response Headers\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Piece\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Piece\")){\r", + " pm.collectionVariables.set(\"pieceId\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + " pm.collectionVariables.set(\"pieceRevision\", 1);\r", + "\r", + " //Set creation date for historical object\r", + " isoTimestamp = pm.variables.replaceIn('{{$isoTimestamp}}')\r", + " date = isoTimestamp.replaceAll('-','').replaceAll(':',\"\").split(\".\").shift() + \"Z\";\r", + " pm.collectionVariables.set(\"historicalCreation\",date);\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": \"cargo:Piece\",\n \"cargo:coload\": false,\n \"cargo:handlingInstructions\": [\n {\n \"@type\": \"cargo:HandlingInstructions\",\n \"cargo:handlingInstructionsType\": \"SPH\",\n \"cargo:description\": \"Valuable Cargo\",\n \"cargo:handlingInstructionsTypeCode\": \"VAL\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Get", + "item": [ + { + "name": "Get Subscription for a Logistics Object", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "pm.test(\"Content-Type is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@type'] == 'https://onerecord.iata.org/ns/api#Subscription') {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.eql(\"https://onerecord.iata.org/ns/api#Subscription\");\r", + " });\r", + "\r", + " var hasContentType = \"https://onerecord.iata.org/ns/api#hasContentType\";\r", + " if (jsonData[hasContentType]) {\r", + " pm.test(\"Response contains hasContentType\", () => {\r", + " pm.expect(jsonData).to.have.property(hasContentType);\r", + " });\r", + " pm.test(\"Response value hasContentType \", () => {\r", + " pm.expect(jsonData[hasContentType]).to.eql('application/ld+json');\r", + " });\r", + " }\r", + " var hasSubscriber = \"https://onerecord.iata.org/ns/api#hasSubscriber\";\r", + " pm.test(\"Response contains hasSubscriber\", () => {\r", + " pm.expect(jsonData).to.have.property(hasSubscriber);\r", + " });\r", + " pm.test(\"Response value hasSubscriber \", () => {\r", + " pm.expect(jsonData[hasSubscriber]).to.have.property('@id');\r", + " });\r", + "\r", + "\r", + " var hasTopicType = \"https://onerecord.iata.org/ns/api#hasTopicType\";\r", + " pm.test(\"Response contains hasTopicType\", () => {\r", + " pm.expect(jsonData).to.have.property(hasTopicType);\r", + " });\r", + " pm.test(\"Response value hasTopicType \", () => {\r", + " pm.expect(jsonData[hasTopicType]['@id']).to.eql('https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_IDENTIFIER');\r", + " });\r", + "\r", + " var includeSubscriptionEventType = \"https://onerecord.iata.org/ns/api#includeSubscriptionEventType\";\r", + " pm.test(\"Response contains includeSubscriptionEventType\", () => {\r", + " pm.expect(jsonData).to.have.property(includeSubscriptionEventType);\r", + " });\r", + " //Try to get the first includeSubscriptionEventType\r", + " var subEventTypes = ['https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_UPDATED', 'https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_CREATED', 'https://onerecord.iata.org/ns/api#LOGISTICS_EVENT_RECEIVED'];\r", + "\r", + " pm.test(\"Response value includeSubscriptionEventType \", () => {\r", + " pm.expect(jsonData[includeSubscriptionEventType][0]['@id']).to.be.oneOf(subEventTypes);\r", + " });\r", + "\r", + " var hasTopic = \"https://onerecord.iata.org/ns/api#hasTopic\";\r", + " pm.test(\"Response contains hasTopic\", () => {\r", + " pm.expect(jsonData).to.have.property(hasTopic);\r", + " });\r", + " pm.test(\"Response value hasTopic \", () => {\r", + " pm.expect(jsonData[hasTopic]['@value']).to.eql(pm.variables.get(\"baseUrl\") + '/logistics-objects/' + pm.variables.get(\"pieceId\"));\r", + " });\r", + "});\r", + "\r", + "\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_IDENTIFIER&topic={{baseUrl}}/logistics-objects/{{pieceId}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ], + "query": [ + { + "key": "topicType", + "value": "https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_IDENTIFIER" + }, + { + "key": "topic", + "value": "{{baseUrl}}/logistics-objects/{{pieceId}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Get Subscription for all Shipment Logistics Objects", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "pm.test(\"Content-Type is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@type'] == 'https://onerecord.iata.org/ns/api#Subscription') {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + "\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.eql(\"https://onerecord.iata.org/ns/api#Subscription\");\r", + " });\r", + "\r", + " var hasContentType = \"https://onerecord.iata.org/ns/api#hasContentType\";\r", + " if (jsonData[hasContentType]) {\r", + " pm.test(\"Response contains hasContentType\", () => {\r", + " pm.expect(jsonData).to.have.property(hasContentType);\r", + " });\r", + " pm.test(\"Response value hasContentType \", () => {\r", + " pm.expect(jsonData[hasContentType]).to.eql('application/ld+json');\r", + " });\r", + " }\r", + " var hasSubscriber = \"https://onerecord.iata.org/ns/api#hasSubscriber\";\r", + " pm.test(\"Response contains hasSubscriber\", () => {\r", + " pm.expect(jsonData).to.have.property(hasSubscriber);\r", + " });\r", + " pm.test(\"Response value hasSubscriber \", () => {\r", + " pm.expect(jsonData[hasSubscriber]).to.have.property('@id');\r", + " });\r", + "\r", + "\r", + " var hasTopicType = \"https://onerecord.iata.org/ns/api#hasTopicType\";\r", + " pm.test(\"Response contains hasTopicType\", () => {\r", + " pm.expect(jsonData).to.have.property(hasTopicType);\r", + " });\r", + " pm.test(\"Response value hasTopicType \", () => {\r", + " pm.expect(jsonData[hasTopicType]['@id']).to.eql('https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_TYPE');\r", + " });\r", + "\r", + " var includeSubscriptionEventType = \"https://onerecord.iata.org/ns/api#includeSubscriptionEventType\";\r", + " pm.test(\"Response contains includeSubscriptionEventType\", () => {\r", + " pm.expect(jsonData).to.have.property(includeSubscriptionEventType);\r", + " });\r", + " //Try to get the first includeSubscriptionEventType\r", + " var subEventTypes = ['https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_UPDATED', 'https://onerecord.iata.org/ns/api#LOGISTICS_OBJECT_CREATED', 'https://onerecord.iata.org/ns/api#LOGISTICS_EVENT_RECEIVED'];\r", + "\r", + " pm.test(\"Response value includeSubscriptionEventType \", () => {\r", + " pm.expect(jsonData[includeSubscriptionEventType][0]['@id']).to.be.oneOf(subEventTypes);\r", + " });\r", + "\r", + " var hasTopic = \"https://onerecord.iata.org/ns/api#hasTopic\";\r", + " pm.test(\"Response contains hasTopic\", () => {\r", + " pm.expect(jsonData).to.have.property(hasTopic);\r", + " });\r", + " pm.test(\"Response value hasTopicType \", () => {\r", + " pm.expect(jsonData[hasTopic]['@value']).to.eql('https://onerecord.iata.org/ns/cargo#Shipment');\r", + " });\r", + "});" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE&topic=https://onerecord.iata.org/ns/cargo%23Shipment", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ], + "query": [ + { + "key": "topicType", + "value": "https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE" + }, + { + "key": "topic", + "value": "https://onerecord.iata.org/ns/cargo%23Shipment" + } + ] + } + }, + "response": [] + }, + { + "name": "Get Subscription for a non Logistics Object", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "const apiNS = 'https://onerecord.iata.org/ns/api#';\r", + "var self = {};\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 400\", () => {\r", + " pm.response.to.have.status(400);\r", + "});\r", + "\r", + "//Test Error response payload\r", + "var responseJson = pm.response.json();\r", + "const framedJson = frame(responseJson);\r", + "\r", + "framedJson.then(function (result) {\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@type'] == apiNS + \"Error\") {\r", + " responseJson = element;\r", + " }\r", + " })\r", + " } else {\r", + " responseJson = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Contain Error\", () => {\r", + " pm.expect(responseJson[\"@type\"]).to.eql(apiNS + \"Error\")\r", + " });\r", + "\r", + " pm.test(\"Response contains Error-hasTitle \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasTitle\");\r", + " });\r", + " pm.test(\"Response contains Error-hasErrorDetail \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasErrorDetail\");\r", + " });\r", + " var errorDetail = responseJson[apiNS + 'hasErrorDetail']\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasCode \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasCode\");\r", + " });\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasMessage \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasMessage\");\r", + " });\r", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE&topic=https://onerecord.iata.org/ns/cargo%23Value", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ], + "query": [ + { + "key": "topicType", + "value": "https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE" + }, + { + "key": "topic", + "value": "https://onerecord.iata.org/ns/cargo%23Value" + } + ] + } + }, + "response": [] + }, + { + "name": "Get Subscription without a Logistics Object or Logistics object type", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "const apiNS = 'https://onerecord.iata.org/ns/api#';\r", + "var self = {};\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test status code\r", + "pm.test(\"Status code is 400\", () => {\r", + " pm.response.to.have.status(400);\r", + "});\r", + "\r", + "//Test Error response payload\r", + "var responseJson = pm.response.json();\r", + "const framedJson = frame(responseJson);\r", + "\r", + "framedJson.then(function (result) {\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@type'] == apiNS + \"Error\") {\r", + " responseJson = element;\r", + " }\r", + " })\r", + " } else {\r", + " responseJson = result;\r", + " }\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@id\");\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(responseJson).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Contain Error\", () => {\r", + " pm.expect(responseJson[\"@type\"]).to.eql(apiNS + \"Error\")\r", + " });\r", + "\r", + " pm.test(\"Response contains Error-hasTitle \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasTitle\");\r", + " });\r", + " pm.test(\"Response contains Error-hasErrorDetail \", () => {\r", + " pm.expect(responseJson).to.have.property(apiNS + \"hasErrorDetail\");\r", + " });\r", + " var errorDetail = responseJson[apiNS + 'hasErrorDetail']\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasCode \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasCode\");\r", + " });\r", + " pm.test(\"Response contains Error-hasErrorDetail-hasMessage \", () => {\r", + " pm.expect(errorDetail).to.have.property(apiNS + \"hasMessage\");\r", + " });\r", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{baseUrl}}/subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ], + "query": [ + { + "key": "topicType", + "value": "https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Create", + "item": [ + { + "name": "Subscribe to a Logistics Object", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#SubscriptionRequest\"); \r", + "});\r", + "//Test Location header\r", + "pm.test(\"Check Location contains {{baseUrl}}/action-requests/ \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\")+ \"/action-requests/\";\r", + " pm.expect(pm.response.headers.get(\"Location\")).to.include(expectedValue);\r", + "});\r", + "\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:Subscription\",\r\n \"api:hasContentType\": \"application/ld+json\",\r\n \"api:hasSubscriber\": {\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{companyId}}\"\r\n },\r\n \"api:hasTopicType\": {\r\n \"@id\": \"api:LOGISTICS_OBJECT_IDENTIFIER\"\r\n },\r\n \"api:subscribeToLogisticsEvents\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#boolean\",\r\n \"@value\": \"true\"\r\n },\r\n \"api:hasTopic\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#anyURI\",\r\n \"@value\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/subscriptions", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ] + } + }, + "response": [] + }, + { + "name": "Subscribe to Shipment Logistics Objects", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#SubscriptionRequest\"); \r", + "});\r", + "\r", + "//Test Location header\r", + "pm.test(\"Check Location contains {{baseUrl}}/action-requests/ \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\")+ \"/action-requests/\";\r", + " pm.expect(pm.response.headers.get(\"Location\")).to.include(expectedValue);\r", + "});\r", + "\r", + "pm.collectionVariables.set(\"ARId\", pm.response.headers.get(\"Location\").split(\"/\").pop());" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:Subscription\",\r\n \"api:hasContentType\": \"application/ld+json\",\r\n \"api:hasSubscriber\": {\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{companyId}}\"\r\n },\r\n \"api:hasTopicType\": {\r\n \"@id\": \"api:LOGISTICS_OBJECT_TYPE\"\r\n },\r\n \"api:subscribeToLogisticsEvents\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#boolean\",\r\n \"@value\": \"true\"\r\n },\r\n \"api:hasTopic\": {\r\n \"@type\": \"http://www.w3.org/2001/XMLSchema#anyURI\",\r\n \"@value\": \"https://onerecord.iata.org/ns/cargo#Shipment\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/subscriptions", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ] + } + }, + "response": [] + } + ] + } + ], + "description": "Note: Subscriptions uses a Piece and a Company object that must be created before running the test. Please use the calls in Logisitics Objects - Post" + }, + { + "name": "Access Delegations", + "item": [ + { + "name": "Prerequisite", + "item": [ + { + "name": "Create a Company", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Create a company to be used in the Logistics Events Test\r", + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "\r", + "//Test type header\r", + "pm.test(\"Check type\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Company\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Company\")){\r", + " pm.collectionVariables.set(\"extCompany\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": [\n \"cargo:Company\",\n \"cargo:Organization\",\n \"cargo:LogisticsAgent\",\n \"cargo:LogisticsObject\"\n ],\n \"cargo:name\": \"GHA Company\",\n \"cargo:shortName\": \"GHA\",\n \"cargo:contactPersons\": [\n {\n \"@type\": [\n \"cargo:Person\",\n \"cargo:Actor\",\n \"cargo:LogisticsAgent\",\n \"cargo:LogisticsObject\"\n ],\n \"cargo:firstName\": \"Jane\",\n \"cargo:lastName\": \"Doe\",\n \"cargo:salutation\": \"Ms\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + }, + { + "name": "Create a Piece", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Test Status Code\r", + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "// Test Response Headers\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Piece\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Piece\")){\r", + " pm.collectionVariables.set(\"pieceId\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + " pm.collectionVariables.set(\"pieceRevision\", 1);\r", + "\r", + " //Set creation date for historical object\r", + " isoTimestamp = pm.variables.replaceIn('{{$isoTimestamp}}')\r", + " date = isoTimestamp.replaceAll('-','').replaceAll(':',\"\").split(\".\").shift() + \"Z\";\r", + " pm.collectionVariables.set(\"historicalCreation\",date);\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": \"cargo:Piece\",\n \"cargo:coload\": false,\n \"cargo:handlingInstructions\": [\n {\n \"@type\": \"cargo:HandlingInstructions\",\n \"cargo:handlingInstructionsType\": \"SPH\",\n \"cargo:description\": \"Valuable Cargo\",\n \"cargo:handlingInstructionsTypeCode\": \"VAL\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Post", + "item": [ + { + "name": "Access delegation for holder company", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Content-Type is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#AccessDelegationRequest\"); \r", + "});\r", + "//Test Location header\r", + "pm.test(\"Check Location contains {{baseUrl}}/action-requests/ \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\")+ \"/action-requests/\";\r", + " pm.expect(pm.response.headers.get(\"Location\")).to.include(expectedValue);\r", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:AccessDelegation\",\r\n \"api:hasDescription\": \"Our GHA requires read access to Piece for handling\",\r\n \"api:hasPermission\": [{\r\n \"@id\": \"api:GET_LOGISTICS_OBJECT\"\r\n }\r\n ],\r\n \"api:isRequestedFor\": [{\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{companyId}}\"\r\n }],\r\n \"api:notifyRequestStatusChange\": false,\r\n \"api:hasLogisticsObject\": [{\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\r\n }]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/access-delegations", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "access-delegations" + ] + } + }, + "response": [] + }, + { + "name": "Access delegation for third party company", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//Test response code\r", + "pm.test(\"Response Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Content-Type is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#AccessDelegationRequest\"); \r", + "});\r", + "//Test Location header\r", + "pm.test(\"Check Location contains {{baseUrl}}/action-requests/ \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\")+ \"/action-requests/\";\r", + " pm.expect(pm.response.headers.get(\"Location\")).to.include(expectedValue);\r", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:AccessDelegation\",\r\n \"api:hasDescription\": \"Our GHA requires read access to Piece for handling\",\r\n \"api:hasPermission\": [{\r\n \"@id\": \"api:GET_LOGISTICS_OBJECT\"\r\n }\r\n ],\r\n \"api:isRequestedFor\": [{\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{extCompany}}\"\r\n }],\r\n \"api:notifyRequestStatusChange\": false,\r\n \"api:hasLogisticsObject\": [{\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceId}}\"\r\n }]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/access-delegations", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "access-delegations" + ] + } + }, + "response": [] + } + ] + } + ] + }, + { + "name": "Action Requests", + "item": [ + { + "name": "Prerequisite", + "item": [ + { + "name": "Create a Piece", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Test Status Code\r", + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "// Test Response Headers\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/cargo#Piece\"); \r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "if (req[\"@type\"].includes(\"cargo:Piece\")){\r", + " pm.collectionVariables.set(\"pieceSubscriptionId\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"@context\": {\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\"\n },\n \"@type\": \"cargo:Piece\",\n \"cargo:coload\": false,\n \"cargo:handlingInstructions\": [\n {\n \"@type\": \"cargo:HandlingInstructions\",\n \"cargo:handlingInstructionsType\": \"SPH\",\n \"cargo:description\": \"Valuable Cargo\",\n \"cargo:handlingInstructionsTypeCode\": \"VAL\"\n }\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/logistics-objects", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "logistics-objects" + ] + } + }, + "response": [] + }, + { + "name": "Create Action Request", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", () => {\r", + " pm.response.to.have.status(201);\r", + "});\r", + "pm.test(\"Location header is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.eql(\"https://onerecord.iata.org/ns/api#SubscriptionRequest\"); \r", + "});\r", + "//Test Location header\r", + "pm.test(\"Check Location contains {{baseUrl}}/action-requests/ \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\")+ \"/action-requests/\";\r", + " pm.expect(pm.response.headers.get(\"Location\")).to.include(expectedValue);\r", + "});\r", + "\r", + "//Save variables for running GET tests\r", + "var req = JSON.parse(request.data);\r", + "pm.collectionVariables.set(\"actionRequest\", pm.response.headers.get(\"Location\").split(\"/\").pop());\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"@context\": {\r\n \"cargo\": \"https://onerecord.iata.org/ns/cargo#\",\r\n \"api\": \"https://onerecord.iata.org/ns/api#\"\r\n },\r\n \"@type\": \"api:Subscription\",\r\n \"api:hasContentType\": \"application/ld+json\",\r\n \"api:hasSubscriber\": {\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{companyId}}\"\r\n },\r\n \"api:hasTopicType\": {\r\n \"@id\": \"api:LOGISTICS_OBJECT_IDENTIFIER\"\r\n },\r\n \"api:includeSubscriptionEventType\": [\r\n {\r\n \"@id\": \"api:LOGISTICS_OBJECT_UPDATED\"\r\n },\r\n {\r\n \"@id\": \"api:LOGISTICS_OBJECT_CREATED\"\r\n },\r\n {\r\n \"@id\": \"api:LOGISTICS_EVENT_RECEIVED\"\r\n }\r\n ],\r\n \"api:hasTopic\": {\r\n \"@id\": \"{{baseUrl}}/logistics-objects/{{pieceSubscriptionId}}\"\r\n }\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/subscriptions", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "subscriptions" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Get", + "item": [ + { + "name": "Get Action Request", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "// Inject jsonld.js\r", + "var self = {}\r", + "async function frame(json) {\r", + " return await jsonld.frame(json, {});\r", + "}\r", + "eval(pm.collectionVariables.get('jsonCode'));\r", + "\r", + "//Test response code\r", + "pm.test(\"Status code is 200\", () => {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "//Test response type presence\r", + "pm.test(\"Type header is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "\r", + "var actionTypes = ['https://onerecord.iata.org/ns/api#SubscriptionRequest', 'https://onerecord.iata.org/ns/api#AccessDelegationRequest', 'https://onerecord.iata.org/ns/api#ChangeRequest'];\r", + "//Test type header\r", + "pm.test(\"Check type header\", () => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.be.oneOf(actionTypes);\r", + "});\r", + "pm.test(\"Content-Type header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Type\");\r", + "});\r", + "pm.test(\"Content-Language header is present\", () => {\r", + " pm.response.to.have.header(\"Content-Language\");\r", + "});\r", + "pm.test(\"Last-Modified header is present\", () => {\r", + " pm.response.to.have.header(\"Last-Modified\");\r", + "});\r", + "\r", + "//Test response payload\r", + "var jsonData = pm.response.json();\r", + "\r", + "const framedJson = frame(jsonData);\r", + "framedJson.then(function (result) {\r", + "\r", + " if (result['@graph']) {\r", + " result['@graph'].forEach((element) => {\r", + " if (element['@id'] == pm.request.url.toString()) {\r", + " jsonData = element;\r", + " }\r", + " })\r", + " } else {\r", + " jsonData = result;\r", + " }\r", + "\r", + "\r", + " pm.test(\"Response contains @id \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@id\");\r", + " });\r", + "\r", + " pm.test(\"Response @id contains {{baseUrl}}/action-requests/\", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\") + \"/action-requests/\";\r", + " pm.expect(jsonData['@id']).to.include(expectedValue);\r", + " });\r", + " pm.test(\"Response contains @type \", () => {\r", + " pm.expect(jsonData).to.have.property(\"@type\");\r", + " });\r", + " pm.test(\"Response value @type \", () => {\r", + " pm.expect(jsonData['@type']).to.be.oneOf(actionTypes);\r", + " });\r", + " var hasSubscription = \"https://onerecord.iata.org/ns/api#hasSubscription\";\r", + " pm.test(\"Response contains hasSubscription\", () => {\r", + " pm.expect(jsonData).to.have.property(hasSubscription);\r", + " });\r", + "\r", + " var isRequestedBy = \"https://onerecord.iata.org/ns/api#isRequestedBy\";\r", + " pm.test(\"Response contains isRequestedBy\", () => {\r", + " pm.expect(jsonData).to.have.property(isRequestedBy);\r", + " });\r", + " //Cannot check the isRequestedBy as it's linked with the authentication \r", + "\r", + " var requestStatus = ['https://onerecord.iata.org/ns/api#REQUEST_ACCEPTED', 'https://onerecord.iata.org/ns/api#REQUEST_REJECTED', 'https://onerecord.iata.org/ns/api#REQUEST_PENDING', 'https://onerecord.iata.org/ns/api#REQUEST_FAILED', 'https://onerecord.iata.org/ns/api#REQUEST_REVOKED'];\r", + " var hasRequestStatus = \"https://onerecord.iata.org/ns/api#hasRequestStatus\";\r", + " pm.test(\"Response contains hasRequestStatus\", () => {\r", + " pm.expect(jsonData).to.have.property(hasRequestStatus);\r", + " });\r", + " pm.test(\"Response value hasRequestStatus \", () => {\r", + " pm.expect(jsonData[hasRequestStatus]['@id']).to.be.oneOf(requestStatus);\r", + " });\r", + "\r", + " var isRequestedAt = \"https://onerecord.iata.org/ns/api#isRequestedAt\";\r", + " pm.test(\"Response contains isRequestedAt\", () => {\r", + " pm.expect(jsonData).to.have.property(isRequestedAt);\r", + " });\r", + " pm.test(\"Response value isRequestedAt \", () => {\r", + " pm.expect(jsonData[isRequestedAt]['@type']).to.eql('http://www.w3.org/2001/XMLSchema#dateTime');\r", + " pm.expect(jsonData[isRequestedAt]).to.have.property('@value');\r", + " });\r", + "});\r", + "\r", + "\r", + "\r", + "\r", + "\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/action-requests/:actionRequestId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":actionRequestId" + ], + "variable": [ + { + "key": "actionRequestId", + "value": "{{actionRequest}}" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Patch", + "item": [ + { + "name": "Approve Action Request", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "//NOTE: This test might fail as the action request must be in REQUEST_PENDING state.\r", + "//Solution: Set param :actionRquestId to a REQUEST_PENDING action request \r", + "//Test response code\r", + "pm.test(\"Response Status code is 204\", () => {\r", + " pm.response.to.have.status(204);\r", + "});\r", + "pm.test(\"Location is present\", () => {\r", + " pm.response.to.have.header(\"Location\");\r", + "});\r", + "pm.test(\"Type is present\", () => {\r", + " pm.response.to.have.header(\"Type\");\r", + "});\r", + "\r", + "var actionTypes = ['https://onerecord.iata.org/ns/api#SubscriptionRequest','https://onerecord.iata.org/ns/api#AccessDelegationRequest','https://onerecord.iata.org/ns/api#ChangeRequest'];\r", + "//Test type header\r", + "pm.test(\"Check type header\",() => {\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.be.oneOf(actionTypes); \r", + "});\r", + "//Test Location header\r", + "pm.test(\"Check Location contains {{baseUrl}}/action-requests/ \", () => {\r", + " var expectedValue = pm.variables.get(\"baseUrl\")+ \"/action-requests/\";\r", + " pm.expect(pm.response.headers.get(\"Type\")).to.include(expectedValue);\r", + "});\r", + "" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/ld+json; version=2.0.0-dev", + "name": "Content-Type", + "type": "text" + }, + { + "key": "Accept", + "value": "application/ld+json; version=2.0.0-dev", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/action-requests/:actionRequestId?status=REQUEST_ACCEPTED", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":actionRequestId" + ], + "query": [ + { + "key": "status", + "value": "REQUEST_ACCEPTED" + } + ], + "variable": [ + { + "key": "actionRequestId", + "value": "{{actionRequest}}" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Del", + "item": [ + { + "name": "Delete Action Request", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 204\", () => {\r", + " pm.response.to.have.status(204);\r", + "});" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{baseUrl}}/action-requests/:actionRequestId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "action-requests", + ":actionRequestId" + ], + "variable": [ + { + "key": "actionRequestId", + "value": "{{actionRequest}}" + } + ] + } + }, + "response": [] + } + ] + } + ] + } + ], + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "", + "type": "string" + } + ] + }, + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "jsonCode", + "value": "var jsonld=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"\",n(n.s=174)}([function(e,t,n){\"use strict\";(function(t){var n=function(e){return e&&e.Math===Math&&e};e.exports=n(\"object\"==typeof globalThis&&globalThis)||n(\"object\"==typeof window&&window)||n(\"object\"==typeof self&&self)||n(\"object\"==typeof t&&t)||n(\"object\"==typeof this&&this)||function(){return this}()||Function(\"return this\")()}).call(this,n(118))},function(e,t,n){\"use strict\";e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){\"use strict\";var r=n(68),o=Function.prototype,i=o.call,a=r&&o.bind.bind(i,i);e.exports=r?a:function(e){return function(){return i.apply(e,arguments)}}},function(e,t,n){\"use strict\";var r=n(0),o=n(42).f,i=n(31),a=n(27),s=n(87),c=n(126),u=n(93);e.exports=function(e,t){var n,l,d,f,p,h=e.target,v=e.global,g=e.stat;if(n=v?r:g?r[h]||s(h,{}):(r[h]||{}).prototype)for(l in t){if(f=t[l],d=e.dontCallGetSet?(p=o(n,l))&&p.value:n[l],!u(v?l:h+(g?\".\":\"#\")+l,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;c(f,d)}(e.sham||d&&d.sham)&&i(f,\"sham\",!0),a(n,l,f,e)}}},function(e,t,n){\"use strict\";var r=n(121),o=r.all;e.exports=r.IS_HTMLDDA?function(e){return\"function\"==typeof e||e===o}:function(e){return\"function\"==typeof e}},function(e,t,n){\"use strict\";var r=n(68),o=Function.prototype.call;e.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(e,t,n){\"use strict\";var r=n(54),o=n(141),i=n(62),a=n(36),s=n(22).f,c=n(201),u=n(204),l=n(26),d=n(11),f=a.set,p=a.getterFor(\"Array Iterator\");e.exports=c(Array,\"Array\",(function(e,t){f(this,{type:\"Array Iterator\",target:r(e),index:0,kind:t})}),(function(){var e=p(this),t=e.target,n=e.index++;if(!t||n>=t.length)return e.target=void 0,u(void 0,!0);switch(e.kind){case\"keys\":return u(n,!1);case\"values\":return u(t[n],!1)}return u([n,t[n]],!1)}),\"values\");var h=i.Arguments=i.Array;if(o(\"keys\"),o(\"values\"),o(\"entries\"),!l&&d&&\"values\"!==h.name)try{s(h,\"name\",{value:\"values\"})}catch(e){}},function(e,t,n){\"use strict\";var r=n(0),o=n(85),i=n(13),a=n(88),s=n(84),c=n(122),u=r.Symbol,l=o(\"wks\"),d=c?u.for||u:u&&u.withoutSetter||a;e.exports=function(e){return i(l,e)||(l[e]=s&&i(u,e)?u[e]:d(\"Symbol.\"+e)),l[e]}},function(e,t,n){\"use strict\";var r=n(0),o=n(205),i=n(206),a=n(6),s=n(31),c=n(7),u=c(\"iterator\"),l=c(\"toStringTag\"),d=a.values,f=function(e,t){if(e){if(e[u]!==d)try{s(e,u,d)}catch(t){e[u]=d}if(e[l]||s(e,l,t),o[t])for(var n in a)if(e[n]!==a[n])try{s(e,n,a[n])}catch(t){e[n]=a[n]}}};for(var p in o)f(r[p]&&r[p].prototype,p);f(i,\"DOMTokenList\")},function(e,t,n){\"use strict\";var r=n(39),o=String;e.exports=function(e){if(\"Symbol\"===r(e))throw new TypeError(\"Cannot convert a Symbol value to a string\");return o(e)}},function(e,t,n){\"use strict\";var r=n(15),o=String,i=TypeError;e.exports=function(e){if(r(e))return e;throw new i(o(e)+\" is not an object\")}},function(e,t,n){\"use strict\";var r=n(1);e.exports=!r((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){\"use strict\";n(180),n(193),n(195),n(196),n(197),n(198)},function(e,t,n){\"use strict\";var r=n(2),o=n(21),i=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return i(o(e),t)}},function(e,t,n){\"use strict\";var r=n(3),o=n(2),i=n(20),a=n(21),s=n(23),c=n(207),u=n(9),l=n(1),d=n(144),f=n(146),p=n(147),h=n(148),v=n(56),g=n(149),y=[],m=o(y.sort),x=o(y.push),b=l((function(){y.sort(void 0)})),w=l((function(){y.sort(null)})),j=f(\"sort\"),I=!l((function(){if(v)return v<70;if(!(p&&p>3)){if(h)return!0;if(g)return g<603;var e,t,n,r,o=\"\";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)y.push({k:t+r,v:n})}for(y.sort((function(e,t){return t.v-e.v})),r=0;ru(n)?1:-1}}(e)),n=s(o),r=0;r\"boolean\"==typeof e||\"[object Boolean]\"===Object.prototype.toString.call(e),r.isDouble=e=>r.isNumber(e)&&(-1!==String(e).indexOf(\".\")||Math.abs(e)>=1e21),r.isEmptyObject=e=>r.isObject(e)&&0===Object.keys(e).length,r.isNumber=e=>\"number\"==typeof e||\"[object Number]\"===Object.prototype.toString.call(e),r.isNumeric=e=>!isNaN(parseFloat(e))&&isFinite(e),r.isObject=e=>\"[object Object]\"===Object.prototype.toString.call(e),r.isString=e=>\"string\"==typeof e||\"[object String]\"===Object.prototype.toString.call(e),r.isUndefined=e=>void 0===e},function(e,t,n){\"use strict\";var r=n(38),o=TypeError;e.exports=function(e){if(r(e))throw new o(\"Can't call method on \"+e);return e}},function(e,t,n){\"use strict\";n(6),n(8),n(40),n(104),n(25),n(52),n(14);const r=n(32),o=n(16),i=n(105).IdentifierIssuer,a=n(19),s=/(?:<[^>]*?>|\"[^\"]*?\"|[^,])+/g,c=/\\s*<([^>]*?)>\\s*(?:;\\s*(.*))?/,u=/(.*?)=(?:(?:\"([^\"]*?)\")|([^\"]*?))\\s*(?:(?:;\\s*)|$)/g,l={accept:\"application/ld+json, application/json\"},d={};e.exports=d,d.IdentifierIssuer=i,d.REGEX_BCP47=/^[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*$/,d.REGEX_KEYWORD=/^@[a-zA-Z]+$/,d.clone=function(e){if(e&&\"object\"==typeof e){let t;if(o.isArray(e)){t=[];for(let n=0;n{if(Object.keys(e).some(e=>\"accept\"===e.toLowerCase()))throw new RangeError('Accept header may not be specified; only \"'+l.accept+'\" is supported.');return Object.assign({Accept:l.accept},e)},d.parseLinkHeader=e=>{const t={},n=e.match(s);for(let e=0;e{if(!(o.isString(e)||o.isArray(e)&&e.every(e=>o.isString(e)))){if(t&&o.isObject(e))switch(Object.keys(e).length){case 0:return;case 1:if(\"@default\"in e&&d.asArray(e[\"@default\"]).every(e=>o.isString(e)))return}throw new a('Invalid JSON-LD syntax; \"@type\" value must a string, an array of strings, an empty object, or a default object.',\"jsonld.SyntaxError\",{code:\"invalid type value\",value:e})}},d.hasProperty=(e,t)=>{if(e.hasOwnProperty(t)){const n=e[t];return!o.isArray(n)||n.length>0}return!1},d.hasValue=(e,t,n)=>{if(d.hasProperty(e,t)){let i=e[t];const a=r.isList(i);if(o.isArray(i)||a){a&&(i=i[\"@list\"]);for(let e=0;e{if(\"propertyIsArray\"in(r=r||{})||(r.propertyIsArray=!1),\"valueIsArray\"in r||(r.valueIsArray=!1),\"allowDuplicate\"in r||(r.allowDuplicate=!0),\"prependValue\"in r||(r.prependValue=!1),r.valueIsArray)e[t]=n;else if(o.isArray(n)){0===n.length&&r.propertyIsArray&&!e.hasOwnProperty(t)&&(e[t]=[]),r.prependValue&&(n=n.concat(e[t]),e[t]=[]);for(let o=0;o[].concat(e[t]||[]),d.removeProperty=(e,t)=>{delete e[t]},d.removeValue=(e,t,n,r)=>{\"propertyIsArray\"in(r=r||{})||(r.propertyIsArray=!1);const o=d.getValues(e,t).filter(e=>!d.compareValues(e,n));0===o.length?d.removeProperty(e,t):1!==o.length||r.propertyIsArray?e[t]=o:e[t]=o[0]},d.relabelBlankNodes=(e,t)=>function e(t,n){if(o.isArray(n))for(let r=0;re===t||(!(!r.isValue(e)||!r.isValue(t)||e[\"@value\"]!==t[\"@value\"]||e[\"@type\"]!==t[\"@type\"]||e[\"@language\"]!==t[\"@language\"]||e[\"@index\"]!==t[\"@index\"])||!!(o.isObject(e)&&\"@id\"in e&&o.isObject(t)&&\"@id\"in t)&&e[\"@id\"]===t[\"@id\"]),d.compareShortestLeast=(e,t)=>e.length0?o(r(e),9007199254740991):0}},function(e,t,n){\"use strict\";var r=n(3),o=n(80);r({target:\"RegExp\",proto:!0,forced:/./.exec!==o},{exec:o})},function(e,t,n){\"use strict\";e.exports=!1},function(e,t,n){\"use strict\";var r=n(4),o=n(22),i=n(125),a=n(87);e.exports=function(e,t,n,s){s||(s={});var c=s.enumerable,u=void 0!==s.name?s.name:t;if(r(n)&&i(n,u,s),s.global)c?e[t]=n:a(t,n);else{try{s.unsafe?e[t]&&(c=!0):delete e[t]}catch(e){}c?e[t]=n:o.f(e,t,{value:n,enumerable:!1,configurable:!s.nonConfigurable,writable:!s.nonWritable})}return e}},function(e,t,n){\"use strict\";var r=n(184);e.exports=function(e){var t=+e;return t!=t||0===t?0:r(t)}},function(e,t,n){\"use strict\";var r,o,i,a=n(152),s=n(11),c=n(0),u=n(4),l=n(15),d=n(13),f=n(39),p=n(44),h=n(31),v=n(27),g=n(58),y=n(35),m=n(78),x=n(45),b=n(7),w=n(88),j=n(36),I=j.enforce,O=j.get,S=c.Int8Array,E=S&&S.prototype,N=c.Uint8ClampedArray,A=N&&N.prototype,T=S&&m(S),D=E&&m(E),R=Object.prototype,k=c.TypeError,L=b(\"toStringTag\"),C=w(\"TYPED_ARRAY_TAG\"),_=a&&!!x&&\"Opera\"!==f(c.opera),P=!1,M={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},F={BigInt64Array:8,BigUint64Array:8},B=function(e){var t=m(e);if(l(t)){var n=O(t);return n&&d(n,\"TypedArrayConstructor\")?n.TypedArrayConstructor:B(t)}},J=function(e){if(!l(e))return!1;var t=f(e);return d(M,t)||d(F,t)};for(r in M)(i=(o=c[r])&&o.prototype)?I(i).TypedArrayConstructor=o:_=!1;for(r in F)(i=(o=c[r])&&o.prototype)&&(I(i).TypedArrayConstructor=o);if((!_||!u(T)||T===Function.prototype)&&(T=function(){throw new k(\"Incorrect invocation\")},_))for(r in M)c[r]&&x(c[r],T);if((!_||!D||D===R)&&(D=T.prototype,_))for(r in M)c[r]&&x(c[r].prototype,D);if(_&&m(A)!==D&&x(A,D),s&&!d(D,L))for(r in P=!0,g(D,L,{configurable:!0,get:function(){return l(this)?this[C]:void 0}}),M)c[r]&&h(c[r],C,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:_,TYPED_ARRAY_TAG:P&&C,aTypedArray:function(e){if(J(e))return e;throw new k(\"Target is not a typed array\")},aTypedArrayConstructor:function(e){if(u(e)&&(!x||y(T,e)))return e;throw new k(p(e)+\" is not a typed array constructor\")},exportTypedArrayMethod:function(e,t,n,r){if(s){if(n)for(var o in M){var i=c[o];if(i&&d(i.prototype,e))try{delete i.prototype[e]}catch(n){try{i.prototype[e]=t}catch(e){}}}D[e]&&!n||v(D,e,n?t:_&&E[e]||t,r)}},exportTypedArrayStaticMethod:function(e,t,n){var r,o;if(s){if(x){if(n)for(r in M)if((o=c[r])&&d(o,e))try{delete o[e]}catch(e){}if(T[e]&&!n)return;try{return v(T,e,n?t:_&&T[e]||t)}catch(e){}}for(r in M)!(o=c[r])||o[e]&&!n||v(o,e,t)}},getTypedArrayConstructor:B,isView:function(e){if(!l(e))return!1;var t=f(e);return\"DataView\"===t||d(M,t)||d(F,t)},isTypedArray:J,TypedArray:T,TypedArrayPrototype:D}},function(e,t,n){\"use strict\";e.exports=\"undefined\"!=typeof navigator&&String(navigator.userAgent)||\"\"},function(e,t,n){\"use strict\";var r=n(11),o=n(22),i=n(53);e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){\"use strict\";const r=n(16),o={};e.exports=o,o.isSubject=e=>{if(r.isObject(e)&&!(\"@value\"in e||\"@set\"in e||\"@list\"in e)){return Object.keys(e).length>1||!(\"@id\"in e)}return!1},o.isSubjectReference=e=>r.isObject(e)&&1===Object.keys(e).length&&\"@id\"in e,o.isValue=e=>r.isObject(e)&&\"@value\"in e,o.isList=e=>r.isObject(e)&&\"@list\"in e,o.isGraph=e=>r.isObject(e)&&\"@graph\"in e&&1===Object.keys(e).filter(e=>\"@id\"!==e&&\"@index\"!==e).length,o.isSimpleGraph=e=>o.isGraph(e)&&!(\"@id\"in e),o.isBlankNode=e=>{if(r.isObject(e)){if(\"@id\"in e){const t=e[\"@id\"];return!r.isString(t)||0===t.indexOf(\"_:\")}return 0===Object.keys(e).length||!(\"@value\"in e||\"@set\"in e||\"@list\"in e)}return!1}},function(e,t,n){\"use strict\";var r=n(2),o=r({}.toString),i=r(\"\".slice);e.exports=function(e){return i(o(e),8,-1)}},function(e,t,n){\"use strict\";var r=n(0),o=n(4),i=function(e){return o(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e]):r[e]&&r[e][t]}},function(e,t,n){\"use strict\";var r=n(2);e.exports=r({}.isPrototypeOf)},function(e,t,n){\"use strict\";var r,o,i,a=n(182),s=n(0),c=n(15),u=n(31),l=n(13),d=n(86),f=n(90),p=n(91),h=s.TypeError,v=s.WeakMap;if(a||d.state){var g=d.state||(d.state=new v);g.get=g.get,g.has=g.has,g.set=g.set,r=function(e,t){if(g.has(e))throw new h(\"Object already initialized\");return t.facade=e,g.set(e,t),t},o=function(e){return g.get(e)||{}},i=function(e){return g.has(e)}}else{var y=f(\"state\");p[y]=!0,r=function(e,t){if(l(e,y))throw new h(\"Object already initialized\");return t.facade=e,u(e,y,t),t},o=function(e){return l(e,y)?e[y]:{}},i=function(e){return l(e,y)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!c(t)||(n=o(t)).type!==e)throw new h(\"Incompatible receiver, \"+e+\" required\");return n}}}},function(e,t,n){\"use strict\";n(25),n(6),n(8),n(82),n(81);const r=n(16),o={};e.exports=o,o.parsers={simple:{keys:[\"href\",\"scheme\",\"authority\",\"path\",\"query\",\"fragment\"],regex:/^(?:([^:\\/?#]+):)?(?:\\/\\/([^\\/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?/},full:{keys:[\"href\",\"protocol\",\"scheme\",\"authority\",\"auth\",\"user\",\"password\",\"hostname\",\"port\",\"path\",\"directory\",\"file\",\"query\",\"fragment\"],regex:/^(([a-zA-Z][a-zA-Z0-9+-.]*):)?(?:\\/\\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?))?(?:(((?:[^?#\\/]*\\/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/}},o.parse=(e,t)=>{const n={},r=o.parsers[t||\"full\"],i=r.regex.exec(e);let a=r.keys.length;for(;a--;)n[r.keys[a]]=void 0===i[a]?null:i[a];return(\"https\"===n.scheme&&\"443\"===n.port||\"http\"===n.scheme&&\"80\"===n.port)&&(n.href=n.href.replace(\":\"+n.port,\"\"),n.authority=n.authority.replace(\":\"+n.port,\"\"),n.port=null),n.normalizedPath=o.removeDotSegments(n.path),n},o.prependBase=(e,t)=>{if(null===e)return t;if(o.isAbsolute(t))return t;e&&!r.isString(e)||(e=o.parse(e||\"\"));const n=o.parse(t),i={protocol:e.protocol||\"\"};if(null!==n.authority)i.authority=n.authority,i.path=n.path,i.query=n.query;else if(i.authority=e.authority,\"\"===n.path)i.path=e.path,null!==n.query?i.query=n.query:i.query=e.query;else{if(0===n.path.indexOf(\"/\"))i.path=n.path;else{let t=e.path;t=t.substr(0,t.lastIndexOf(\"/\")+1),(t.length>0||e.authority)&&\"/\"!==t.substr(-1)&&(t+=\"/\"),t+=n.path,i.path=t}i.query=n.query}\"\"!==n.path&&(i.path=o.removeDotSegments(i.path));let a=i.protocol;return null!==i.authority&&(a+=\"//\"+i.authority),a+=i.path,null!==i.query&&(a+=\"?\"+i.query),null!==n.fragment&&(a+=\"#\"+n.fragment),\"\"===a&&(a=\"./\"),a},o.removeBase=(e,t)=>{if(null===e)return t;e&&!r.isString(e)||(e=o.parse(e||\"\"));let n=\"\";if(\"\"!==e.href?n+=(e.protocol||\"\")+\"//\"+(e.authority||\"\"):t.indexOf(\"//\")&&(n+=\"//\"),0!==t.indexOf(n))return t;const i=o.parse(t.substr(n.length)),a=e.normalizedPath.split(\"/\"),s=i.normalizedPath.split(\"/\"),c=i.fragment||i.query?0:1;for(;a.length>0&&s.length>c&&a[0]===s[0];)a.shift(),s.shift();let u=\"\";if(a.length>0){a.pop();for(let e=0;e{if(0===e.length)return\"\";const t=e.split(\"/\"),n=[];for(;t.length>0;){const e=t.shift(),r=0===t.length;\".\"!==e?\"..\"!==e?n.push(e):(n.pop(),r&&n.push(\"\")):r&&n.push(\"\")}return\"/\"===e[0]&&n.length>0&&\"\"!==n[0]&&n.unshift(\"\"),1===n.length&&\"\"===n[0]?\"/\":n.join(\"/\")};const i=/^([A-Za-z][A-Za-z0-9+-.]*|_):[^\\s]*$/;o.isAbsolute=e=>r.isString(e)&&i.test(e),o.isRelative=e=>r.isString(e)},function(e,t,n){\"use strict\";e.exports=function(e){return null==e}},function(e,t,n){\"use strict\";var r=n(187),o=n(4),i=n(33),a=n(7)(\"toStringTag\"),s=Object,c=\"Arguments\"===i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=s(e),a))?n:c?i(t):\"Object\"===(r=i(t))&&o(t.callee)?\"Arguments\":r}},function(e,t,n){\"use strict\";var r=n(72).PROPER,o=n(27),i=n(10),a=n(9),s=n(1),c=n(160),u=RegExp.prototype.toString,l=s((function(){return\"/a/b\"!==u.call({source:\"a\",flags:\"b\"})})),d=r&&\"toString\"!==u.name;(l||d)&&o(RegExp.prototype,\"toString\",(function(){var e=i(this);return\"/\"+a(e.source)+\"/\"+a(c(e))}),{unsafe:!0})},function(e,t,n){\"use strict\";var r=n(66)(n(67));function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t0){const n=t.substr(0,a),s=t.substr(a+1);if(\"_\"===n||0===s.indexOf(\"//\"))return t;r&&r.hasOwnProperty(n)&&w.createTermDefinition({activeCtx:e,localCtx:r,term:n,defined:o,options:i});const c=e.mappings.get(n);if(c&&c._prefix)return c[\"@id\"]+s;if(f(t))return t}if(n.vocab&&\"@vocab\"in e){t=e[\"@vocab\"]+t}else if(n.base){let n,r;\"@base\"in e?e[\"@base\"]?(r=h(i.base,e[\"@base\"]),n=h(r,t)):(r=e[\"@base\"],n=t):(r=i.base,n=h(i.base,t)),t=n}return t}e.exports=w,w.process=async({activeCtx:e,localCtx:t,options:n,propagate:r=!0,overrideProtected:o=!1,cycles:a=new Set})=>{u(t)&&\"@context\"in t&&c(t[\"@context\"])&&(t=t[\"@context\"]);if(0===m(t).length)return e;const d=[],y=[({event:e,next:t})=>{d.push(e),t()}];n.eventHandler&&y.push(n.eventHandler);const x=n;n=i(i({},n),{},{eventHandler:y});const b=await n.contextResolver.resolve({activeCtx:e,context:t,documentLoader:n.documentLoader,base:n.base});u(b[0].document)&&\"boolean\"==typeof b[0].document[\"@propagate\"]&&(r=b[0].document[\"@propagate\"]);let I=e;r||I.previousContext||(I=I.clone(),I.previousContext=e);for(const r of b){let{document:i}=r;if(e=I,null===i){if(!o&&0!==Object.keys(e.protected).length)throw new s(\"Tried to nullify a context with protected terms outside of a term definition.\",\"jsonld.SyntaxError\",{code:\"invalid context nullification\"});I=e=w.getInitialContext(n).clone();continue}const c=r.getProcessed(e);if(c){if(x.eventHandler)for(const e of c.events)v({event:e,options:x});I=e=c.context;continue}if(u(i)&&\"@context\"in i&&(i=i[\"@context\"]),!u(i))throw new s(\"Invalid JSON-LD syntax; @context must be an object.\",\"jsonld.SyntaxError\",{code:\"invalid local context\",context:i});I=I.clone();const y=new Map;if(\"@version\"in i){if(1.1!==i[\"@version\"])throw new s(\"Unsupported JSON-LD version: \"+i[\"@version\"],\"jsonld.UnsupportedVersion\",{code:\"invalid @version value\",context:i});if(e.processingMode&&\"json-ld-1.0\"===e.processingMode)throw new s(\"@version: \"+i[\"@version\"]+\" not compatible with \"+e.processingMode,\"jsonld.ProcessingModeConflict\",{code:\"processing mode conflict\",context:i});I.processingMode=\"json-ld-1.1\",I[\"@version\"]=i[\"@version\"],y.set(\"@version\",!0)}if(I.processingMode=I.processingMode||e.processingMode,\"@base\"in i){let e=i[\"@base\"];if(null===e||f(e));else{if(!p(e))throw new s('Invalid JSON-LD syntax; the value of \"@base\" in a @context must be an absolute IRI, a relative IRI, or null.',\"jsonld.SyntaxError\",{code:\"invalid base IRI\",context:i});e=h(I[\"@base\"],e)}I[\"@base\"]=e,y.set(\"@base\",!0)}if(\"@vocab\"in i){const e=i[\"@vocab\"];if(null===e)delete I[\"@vocab\"];else{if(!l(e))throw new s('Invalid JSON-LD syntax; the value of \"@vocab\" in a @context must be a string or null.',\"jsonld.SyntaxError\",{code:\"invalid vocab mapping\",context:i});if(!f(e)&&w.processingMode(I,1))throw new s('Invalid JSON-LD syntax; the value of \"@vocab\" in a @context must be an absolute IRI.',\"jsonld.SyntaxError\",{code:\"invalid vocab mapping\",context:i});{const t=j(I,e,{vocab:!0,base:!0},void 0,void 0,n);f(t)||n.eventHandler&&v({event:{type:[\"JsonLdEvent\"],code:\"relative @vocab reference\",level:\"warning\",message:\"Relative @vocab reference found.\",details:{vocab:t}},options:n}),I[\"@vocab\"]=t}}y.set(\"@vocab\",!0)}if(\"@language\"in i){const e=i[\"@language\"];if(null===e)delete I[\"@language\"];else{if(!l(e))throw new s('Invalid JSON-LD syntax; the value of \"@language\" in a @context must be a string or null.',\"jsonld.SyntaxError\",{code:\"invalid default language\",context:i});e.match(g)||n.eventHandler&&v({event:{type:[\"JsonLdEvent\"],code:\"invalid @language value\",level:\"warning\",message:\"@language value must be valid BCP47.\",details:{language:e}},options:n}),I[\"@language\"]=e.toLowerCase()}y.set(\"@language\",!0)}if(\"@direction\"in i){const t=i[\"@direction\"];if(\"json-ld-1.0\"===e.processingMode)throw new s(\"Invalid JSON-LD syntax; @direction not compatible with \"+e.processingMode,\"jsonld.SyntaxError\",{code:\"invalid context member\",context:i});if(null===t)delete I[\"@direction\"];else{if(\"ltr\"!==t&&\"rtl\"!==t)throw new s('Invalid JSON-LD syntax; the value of \"@direction\" in a @context must be null, \"ltr\", or \"rtl\".',\"jsonld.SyntaxError\",{code:\"invalid base direction\",context:i});I[\"@direction\"]=t}y.set(\"@direction\",!0)}if(\"@propagate\"in i){const n=i[\"@propagate\"];if(\"json-ld-1.0\"===e.processingMode)throw new s(\"Invalid JSON-LD syntax; @propagate not compatible with \"+e.processingMode,\"jsonld.SyntaxError\",{code:\"invalid context entry\",context:i});if(\"boolean\"!=typeof n)throw new s(\"Invalid JSON-LD syntax; @propagate value must be a boolean.\",\"jsonld.SyntaxError\",{code:\"invalid @propagate value\",context:t});y.set(\"@propagate\",!0)}if(\"@import\"in i){const r=i[\"@import\"];if(\"json-ld-1.0\"===e.processingMode)throw new s(\"Invalid JSON-LD syntax; @import not compatible with \"+e.processingMode,\"jsonld.SyntaxError\",{code:\"invalid context entry\",context:i});if(!l(r))throw new s(\"Invalid JSON-LD syntax; @import must be a string.\",\"jsonld.SyntaxError\",{code:\"invalid @import value\",context:t});const o=await n.contextResolver.resolve({activeCtx:e,context:r,documentLoader:n.documentLoader,base:n.base});if(1!==o.length)throw new s(\"Invalid JSON-LD syntax; @import must reference a single context.\",\"jsonld.SyntaxError\",{code:\"invalid remote context\",context:t});const a=o[0].getProcessed(e);if(a)i=a;else{const n=o[0].document;if(\"@import\"in n)throw new s(\"Invalid JSON-LD syntax: imported context must not include @import.\",\"jsonld.SyntaxError\",{code:\"invalid context entry\",context:t});for(const e in n)i.hasOwnProperty(e)||(i[e]=n[e]);o[0].setProcessed(e,i)}y.set(\"@import\",!0)}y.set(\"@protected\",i[\"@protected\"]||!1);for(const e in i)if(w.createTermDefinition({activeCtx:I,localCtx:i,term:e,defined:y,options:n,overrideProtected:o}),u(i[e])&&\"@context\"in i[e]){const t=i[e][\"@context\"];let r=!0;if(l(t)){const e=h(n.base,t);a.has(e)?r=!1:a.add(e)}if(r)try{await w.process({activeCtx:I.clone(),localCtx:i[e][\"@context\"],overrideProtected:!0,options:n,cycles:a})}catch(t){throw new s(\"Invalid JSON-LD syntax; invalid scoped context.\",\"jsonld.SyntaxError\",{code:\"invalid scoped context\",context:i[e][\"@context\"],term:e})}}r.setProcessed(e,{context:I,events:d})}return I},w.createTermDefinition=({activeCtx:e,localCtx:t,term:n,defined:r,options:o,overrideProtected:i=!1})=>{if(r.has(n)){if(r.get(n))return;throw new s(\"Cyclical context definition detected.\",\"jsonld.CyclicalContext\",{code:\"cyclic IRI mapping\",context:t,term:n})}let a;if(r.set(n,!1),t.hasOwnProperty(n)&&(a=t[n]),\"@type\"===n&&u(a)&&\"@set\"===(a[\"@container\"]||\"@set\")&&w.processingMode(e,1.1)){const e=[\"@container\",\"@id\",\"@protected\"],r=Object.keys(a);if(0===r.length||r.some(t=>!e.includes(t)))throw new s(\"Invalid JSON-LD syntax; keywords cannot be overridden.\",\"jsonld.SyntaxError\",{code:\"keyword redefinition\",context:t,term:n})}else{if(w.isKeyword(n))throw new s(\"Invalid JSON-LD syntax; keywords cannot be overridden.\",\"jsonld.SyntaxError\",{code:\"keyword redefinition\",context:t,term:n});if(n.match(y))return void(o.eventHandler&&v({event:{type:[\"JsonLdEvent\"],code:\"reserved term\",level:\"warning\",message:'Terms beginning with \"@\" are reserved for future use and dropped.',details:{term:n}},options:o}));if(\"\"===n)throw new s(\"Invalid JSON-LD syntax; a term cannot be an empty string.\",\"jsonld.SyntaxError\",{code:\"invalid term definition\",context:t})}const d=e.mappings.get(n);e.mappings.has(n)&&e.mappings.delete(n);let p=!1;if((l(a)||null===a)&&(p=!0,a={\"@id\":a}),!u(a))throw new s(\"Invalid JSON-LD syntax; @context term values must be strings or objects.\",\"jsonld.SyntaxError\",{code:\"invalid term definition\",context:t});const h={};e.mappings.set(n,h),h.reverse=!1;const g=[\"@container\",\"@id\",\"@language\",\"@reverse\",\"@type\"];w.processingMode(e,1.1)&&g.push(\"@context\",\"@direction\",\"@index\",\"@nest\",\"@prefix\",\"@protected\");for(const e in a)if(!g.includes(e))throw new s(\"Invalid JSON-LD syntax; a term definition must not contain \"+e,\"jsonld.SyntaxError\",{code:\"invalid term definition\",context:t});const m=n.indexOf(\":\");if(h._termHasColon=m>0,\"@reverse\"in a){if(\"@id\"in a)throw new s(\"Invalid JSON-LD syntax; a @reverse term definition must not contain @id.\",\"jsonld.SyntaxError\",{code:\"invalid reverse property\",context:t});if(\"@nest\"in a)throw new s(\"Invalid JSON-LD syntax; a @reverse term definition must not contain @nest.\",\"jsonld.SyntaxError\",{code:\"invalid reverse property\",context:t});const i=a[\"@reverse\"];if(!l(i))throw new s(\"Invalid JSON-LD syntax; a @context @reverse value must be a string.\",\"jsonld.SyntaxError\",{code:\"invalid IRI mapping\",context:t});if(i.match(y))return o.eventHandler&&v({event:{type:[\"JsonLdEvent\"],code:\"reserved @reverse value\",level:\"warning\",message:'@reverse values beginning with \"@\" are reserved for future use and dropped.',details:{reverse:i}},options:o}),void(d?e.mappings.set(n,d):e.mappings.delete(n));const c=j(e,i,{vocab:!0,base:!1},t,r,o);if(!f(c))throw new s(\"Invalid JSON-LD syntax; a @context @reverse value must be an absolute IRI or a blank node identifier.\",\"jsonld.SyntaxError\",{code:\"invalid IRI mapping\",context:t});h[\"@id\"]=c,h.reverse=!0}else if(\"@id\"in a){let i=a[\"@id\"];if(i&&!l(i))throw new s(\"Invalid JSON-LD syntax; a @context @id value must be an array of strings or a string.\",\"jsonld.SyntaxError\",{code:\"invalid IRI mapping\",context:t});if(null===i)h[\"@id\"]=null;else{if(!w.isKeyword(i)&&i.match(y))return o.eventHandler&&v({event:{type:[\"JsonLdEvent\"],code:\"reserved @id value\",level:\"warning\",message:'@id values beginning with \"@\" are reserved for future use and dropped.',details:{id:i}},options:o}),void(d?e.mappings.set(n,d):e.mappings.delete(n));if(i!==n){if(i=j(e,i,{vocab:!0,base:!1},t,r,o),!f(i)&&!w.isKeyword(i))throw new s(\"Invalid JSON-LD syntax; a @context @id value must be an absolute IRI, a blank node identifier, or a keyword.\",\"jsonld.SyntaxError\",{code:\"invalid IRI mapping\",context:t});if(n.match(/(?::[^:])|\\//)){if(j(e,n,{vocab:!0,base:!1},t,new Map(r).set(n,!0),o)!==i)throw new s(\"Invalid JSON-LD syntax; term in form of IRI must expand to definition.\",\"jsonld.SyntaxError\",{code:\"invalid IRI mapping\",context:t})}h[\"@id\"]=i,h._prefix=p&&!h._termHasColon&&null!==i.match(/[:\\/\\?#\\[\\]@]$/)}}}if(!(\"@id\"in h))if(h._termHasColon){const i=n.substr(0,m);if(t.hasOwnProperty(i)&&w.createTermDefinition({activeCtx:e,localCtx:t,term:i,defined:r,options:o}),e.mappings.has(i)){const t=n.substr(m+1);h[\"@id\"]=e.mappings.get(i)[\"@id\"]+t}else h[\"@id\"]=n}else if(\"@type\"===n)h[\"@id\"]=n;else{if(!(\"@vocab\"in e))throw new s(\"Invalid JSON-LD syntax; @context terms must define an @id.\",\"jsonld.SyntaxError\",{code:\"invalid IRI mapping\",context:t,term:n});h[\"@id\"]=e[\"@vocab\"]+n}if((!0===a[\"@protected\"]||!0===r.get(\"@protected\")&&!1!==a[\"@protected\"])&&(e.protected[n]=!0,h.protected=!0),r.set(n,!0),\"@type\"in a){let n=a[\"@type\"];if(!l(n))throw new s(\"Invalid JSON-LD syntax; an @context @type value must be a string.\",\"jsonld.SyntaxError\",{code:\"invalid type mapping\",context:t});if(\"@json\"===n||\"@none\"===n){if(w.processingMode(e,1))throw new s(`Invalid JSON-LD syntax; an @context @type value must not be \"${n}\" in JSON-LD 1.0 mode.`,\"jsonld.SyntaxError\",{code:\"invalid type mapping\",context:t})}else if(\"@id\"!==n&&\"@vocab\"!==n){if(n=j(e,n,{vocab:!0,base:!1},t,r,o),!f(n))throw new s(\"Invalid JSON-LD syntax; an @context @type value must be an absolute IRI.\",\"jsonld.SyntaxError\",{code:\"invalid type mapping\",context:t});if(0===n.indexOf(\"_:\"))throw new s(\"Invalid JSON-LD syntax; an @context @type value must be an IRI, not a blank node identifier.\",\"jsonld.SyntaxError\",{code:\"invalid type mapping\",context:t})}h[\"@type\"]=n}if(\"@container\"in a){const n=l(a[\"@container\"])?[a[\"@container\"]]:a[\"@container\"]||[],r=[\"@list\",\"@set\",\"@index\",\"@language\"];let o=!0;const i=n.includes(\"@set\");if(w.processingMode(e,1.1)){if(r.push(\"@graph\",\"@id\",\"@type\"),n.includes(\"@list\")){if(1!==n.length)throw new s(\"Invalid JSON-LD syntax; @context @container with @list must have no other values\",\"jsonld.SyntaxError\",{code:\"invalid container mapping\",context:t})}else if(n.includes(\"@graph\")){if(n.some(e=>\"@graph\"!==e&&\"@id\"!==e&&\"@index\"!==e&&\"@set\"!==e))throw new s(\"Invalid JSON-LD syntax; @context @container with @graph must have no other values other than @id, @index, and @set\",\"jsonld.SyntaxError\",{code:\"invalid container mapping\",context:t})}else o&=n.length<=(i?2:1);if(n.includes(\"@type\")&&(h[\"@type\"]=h[\"@type\"]||\"@id\",![\"@id\",\"@vocab\"].includes(h[\"@type\"])))throw new s(\"Invalid JSON-LD syntax; container: @type requires @type to be @id or @vocab.\",\"jsonld.SyntaxError\",{code:\"invalid type mapping\",context:t})}else o&=!c(a[\"@container\"]),o&=n.length<=1;if(o&=n.every(e=>r.includes(e)),o&=!(i&&n.includes(\"@list\")),!o)throw new s(\"Invalid JSON-LD syntax; @context @container value must be one of the following: \"+r.join(\", \"),\"jsonld.SyntaxError\",{code:\"invalid container mapping\",context:t});if(h.reverse&&!n.every(e=>[\"@index\",\"@set\"].includes(e)))throw new s(\"Invalid JSON-LD syntax; @context @container value for a @reverse type definition must be @index or @set.\",\"jsonld.SyntaxError\",{code:\"invalid reverse property\",context:t});h[\"@container\"]=n}if(\"@index\"in a){if(!(\"@container\"in a)||!h[\"@container\"].includes(\"@index\"))throw new s(`Invalid JSON-LD syntax; @index without @index in @container: \"${a[\"@index\"]}\" on term \"${n}\".`,\"jsonld.SyntaxError\",{code:\"invalid term definition\",context:t});if(!l(a[\"@index\"])||0===a[\"@index\"].indexOf(\"@\"))throw new s(`Invalid JSON-LD syntax; @index must expand to an IRI: \"${a[\"@index\"]}\" on term \"${n}\".`,\"jsonld.SyntaxError\",{code:\"invalid term definition\",context:t});h[\"@index\"]=a[\"@index\"]}if(\"@context\"in a&&(h[\"@context\"]=a[\"@context\"]),\"@language\"in a&&!(\"@type\"in a)){let e=a[\"@language\"];if(null!==e&&!l(e))throw new s(\"Invalid JSON-LD syntax; @context @language value must be a string or null.\",\"jsonld.SyntaxError\",{code:\"invalid language mapping\",context:t});null!==e&&(e=e.toLowerCase()),h[\"@language\"]=e}if(\"@prefix\"in a){if(n.match(/:|\\//))throw new s(\"Invalid JSON-LD syntax; @context @prefix used on a compact IRI term\",\"jsonld.SyntaxError\",{code:\"invalid term definition\",context:t});if(w.isKeyword(h[\"@id\"]))throw new s(\"Invalid JSON-LD syntax; keywords may not be used as prefixes\",\"jsonld.SyntaxError\",{code:\"invalid term definition\",context:t});if(\"boolean\"!=typeof a[\"@prefix\"])throw new s(\"Invalid JSON-LD syntax; @context value for @prefix must be boolean\",\"jsonld.SyntaxError\",{code:\"invalid @prefix value\",context:t});h._prefix=!0===a[\"@prefix\"]}if(\"@direction\"in a){const e=a[\"@direction\"];if(null!==e&&\"ltr\"!==e&&\"rtl\"!==e)throw new s('Invalid JSON-LD syntax; @direction value must be null, \"ltr\", or \"rtl\".',\"jsonld.SyntaxError\",{code:\"invalid base direction\",context:t});h[\"@direction\"]=e}if(\"@nest\"in a){const e=a[\"@nest\"];if(!l(e)||\"@nest\"!==e&&0===e.indexOf(\"@\"))throw new s(\"Invalid JSON-LD syntax; @context @nest value must be a string which is not a keyword other than @nest.\",\"jsonld.SyntaxError\",{code:\"invalid @nest value\",context:t});h[\"@nest\"]=e}\n// disallow aliasing @context and @preserve\nconst x=h[\"@id\"];if(\"@context\"===x||\"@preserve\"===x)throw new s(\"Invalid JSON-LD syntax; @context and @preserve cannot be aliased.\",\"jsonld.SyntaxError\",{code:\"invalid keyword alias\",context:t});if(d&&d.protected&&!i&&(e.protected[n]=!0,h.protected=!0,!function e(t,n){if(!t||\"object\"!=typeof t||!n||\"object\"!=typeof n)return t===n;const r=Array.isArray(t);if(r!==Array.isArray(n))return!1;if(r){if(t.length!==n.length)return!1;for(let r=0;rj(e,t,n,void 0,void 0,r),w.getInitialContext=e=>{const t=JSON.stringify({processingMode:e.processingMode}),n=b.get(t);if(n)return n;const r={processingMode:e.processingMode,mappings:new Map,inverse:null,getInverse:function(){const e=this;if(e.inverse)return e.inverse;const t=e.inverse={},n=e.fastCurieMap={},r={},a=(e[\"@language\"]||\"@none\").toLowerCase(),s=e[\"@direction\"],c=e.mappings,u=[...c.keys()].sort(x);for(const e of u){const o=c.get(e);if(null===o)continue;let u=o[\"@container\"]||\"@none\";if(u=[].concat(u).sort().join(\"\"),null===o[\"@id\"])continue;const l=m(o[\"@id\"]);for(const c of l){let l=t[c];const d=w.isKeyword(c);if(l)d||o._termHasColon||r[c].push(e);else if(t[c]=l={},!d&&!o._termHasColon){r[c]=[e];const t={iri:c,terms:r[c]};c[0]in n?n[c[0]].push(t):n[c[0]]=[t]}if(l[u]||(l[u]={\"@language\":{},\"@type\":{},\"@any\":{}}),l=l[u],i(e,l[\"@any\"],\"@none\"),o.reverse)i(e,l[\"@type\"],\"@reverse\");else if(\"@none\"===o[\"@type\"])i(e,l[\"@any\"],\"@none\"),i(e,l[\"@language\"],\"@none\"),i(e,l[\"@type\"],\"@none\");else if(\"@type\"in o)i(e,l[\"@type\"],o[\"@type\"]);else if(\"@language\"in o&&\"@direction\"in o){const t=o[\"@language\"],n=o[\"@direction\"];i(e,l[\"@language\"],t&&n?`${t}_${n}`.toLowerCase():t?t.toLowerCase():n?\"_\"+n:\"@null\")}else\"@language\"in o?i(e,l[\"@language\"],(o[\"@language\"]||\"@null\").toLowerCase()):\"@direction\"in o?o[\"@direction\"]?i(e,l[\"@language\"],\"_\"+o[\"@direction\"]):i(e,l[\"@language\"],\"@none\"):s?(i(e,l[\"@language\"],\"_\"+s),i(e,l[\"@language\"],\"@none\"),i(e,l[\"@type\"],\"@none\")):(i(e,l[\"@language\"],a),i(e,l[\"@language\"],\"@none\"),i(e,l[\"@type\"],\"@none\"))}}for(const e in n)o(n,e,1);return t},clone:function(){const e={};e.mappings=a.clone(this.mappings),e.clone=this.clone,e.inverse=null,e.getInverse=this.getInverse,e.protected=a.clone(this.protected),this.previousContext&&(e.previousContext=this.previousContext.clone());e.revertToPreviousContext=this.revertToPreviousContext,\"@base\"in this&&(e[\"@base\"]=this[\"@base\"]);\"@language\"in this&&(e[\"@language\"]=this[\"@language\"]);\"@vocab\"in this&&(e[\"@vocab\"]=this[\"@vocab\"]);return e},revertToPreviousContext:function(){if(!this.previousContext)return this;return this.previousContext.clone()},protected:{}};return 1e4===b.size&&b.clear(),b.set(t,r),r;function o(e,t,n){const r=e[t],i=e[t]={};let a,s;for(const e of r)a=e.iri,s=n>=a.length?\"\":a[n],s in i?i[s].push(e):i[s]=[e];for(const e in i)\"\"!==e&&o(i,e,n+1)}function i(e,t,n){t.hasOwnProperty(n)||(t[n]=e)}},w.getContextValue=(e,t,n)=>{if(null===t){if(\"@context\"===n)return;return null}if(e.mappings.has(t)){const r=e.mappings.get(t);if(d(n))return r;if(r.hasOwnProperty(n))return r[n]}return\"@language\"===n&&n in e||\"@direction\"===n&&n in e?e[n]:\"@context\"!==n?null:void 0},w.processingMode=(e,t)=>t.toString()>=\"1.1\"?!e.processingMode||e.processingMode>=\"json-ld-\"+t.toString():\"json-ld-1.0\"===e.processingMode,w.isKeyword=e=>{if(!l(e)||\"@\"!==e[0])return!1;switch(e){case\"@base\":case\"@container\":case\"@context\":case\"@default\":case\"@direction\":case\"@embed\":case\"@explicit\":case\"@graph\":case\"@id\":case\"@included\":case\"@index\":case\"@json\":case\"@language\":case\"@list\":case\"@nest\":case\"@none\":case\"@omitDefault\":case\"@prefix\":case\"@preserve\":case\"@protected\":case\"@requireAll\":case\"@reverse\":case\"@set\":case\"@type\":case\"@value\":case\"@version\":case\"@vocab\":return!0}return!1}},function(e,t,n){\"use strict\";var r=n(11),o=n(5),i=n(119),a=n(53),s=n(54),c=n(69),u=n(13),l=n(123),d=Object.getOwnPropertyDescriptor;t.f=r?d:function(e,t){if(e=s(e),t=c(t),l)try{return d(e,t)}catch(e){}if(u(e,t))return a(!o(i.f,e,t),e[t])}},function(e,t,n){\"use strict\";var r=n(20),o=n(38);e.exports=function(e,t){var n=e[t];return o(n)?void 0:r(n)}},function(e,t,n){\"use strict\";var r=String;e.exports=function(e){try{return r(e)}catch(e){return\"Object\"}}},function(e,t,n){\"use strict\";var r=n(185),o=n(10),i=n(186);e.exports=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e,t=!1,n={};try{(e=r(Object.prototype,\"__proto__\",\"set\"))(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return o(n),i(r),t?e(n,r):n.__proto__=r,n}}():void 0)},function(e,t,n){\"use strict\";var r=n(68),o=Function.prototype,i=o.apply,a=o.call;e.exports=\"object\"==typeof Reflect&&Reflect.apply||(r?a.bind(i):function(){return a.apply(i,arguments)})},function(e,t,n){\"use strict\";var r=n(48),o=n(20),i=n(68),a=r(r.bind);e.exports=function(e,t){return o(e),void 0===t?e:i?a(e,t):function(){return e.apply(t,arguments)}}},function(e,t,n){\"use strict\";var r=n(33),o=n(2);e.exports=function(e){if(\"Function\"===r(e))return o(e)}},function(e,t,n){\"use strict\";var r=n(3),o=n(128).includes,i=n(1),a=n(141);r({target:\"Array\",proto:!0,forced:i((function(){return!Array(1).includes()}))},{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),a(\"includes\")},function(e,t,n){\"use strict\";var r=n(3),o=n(2),i=n(100),a=n(17),s=n(9),c=n(102),u=o(\"\".indexOf);r({target:\"String\",proto:!0,forced:!c(\"includes\")},{includes:function(e){return!!~u(s(a(this)),s(i(e)),arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){\"use strict\";var r,o=n(3),i=n(48),a=n(42).f,s=n(24),c=n(9),u=n(100),l=n(17),d=n(102),f=n(26),p=i(\"\".startsWith),h=i(\"\".slice),v=Math.min,g=d(\"startsWith\");o({target:\"String\",proto:!0,forced:!!(f||g||(r=a(String.prototype,\"startsWith\"),!r||r.writable))&&!g},{startsWith:function(e){var t=c(l(this));u(e);var n=s(v(arguments.length>1?arguments[1]:void 0,t.length)),r=c(e);return p?p(t,r,n):h(t,n,n+r.length)===r}})},function(e,t,n){\"use strict\";var r=n(5),o=n(110),i=n(10),a=n(38),s=n(24),c=n(9),u=n(17),l=n(43),d=n(111),f=n(112);o(\"match\",(function(e,t,n){return[function(t){var n=u(this),o=a(t)?void 0:l(t,e);return o?r(o,t,n):new RegExp(t)[e](c(n))},function(e){var r=i(this),o=c(e),a=n(t,r,o);if(a.done)return a.value;if(!r.global)return f(r,o);var u=r.unicode;r.lastIndex=0;for(var l,p=[],h=0;null!==(l=f(r,o));){var v=c(l[0]);p[h]=v,\"\"===v&&(r.lastIndex=d(o,s(r.lastIndex),u)),h++}return 0===h?null:p}]}))},function(e,t,n){\"use strict\";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){\"use strict\";var r=n(55),o=n(17);e.exports=function(e){return r(o(e))}},function(e,t,n){\"use strict\";var r=n(2),o=n(1),i=n(33),a=Object,s=r(\"\".split);e.exports=o((function(){return!a(\"z\").propertyIsEnumerable(0)}))?function(e){return\"String\"===i(e)?s(e,\"\"):a(e)}:a},function(e,t,n){\"use strict\";var r,o,i=n(0),a=n(30),s=i.process,c=i.Deno,u=s&&s.versions||c&&c.version,l=u&&u.v8;l&&(o=(r=l.split(\".\"))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\\/(\\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\\/(\\d+)/))&&(o=+r[1]),e.exports=o},function(e,t,n){\"use strict\";var r=n(0),o=n(33);e.exports=\"process\"===o(r.process)},function(e,t,n){\"use strict\";var r=n(125),o=n(22);e.exports=function(e,t,n){return n.get&&r(n.get,t,{getter:!0}),n.set&&r(n.set,t,{setter:!0}),o.f(e,t,n)}},function(e,t,n){\"use strict\";var r=n(0);e.exports=r.Promise},function(e,t,n){\"use strict\";var r=n(0),o=n(59),i=n(4),a=n(93),s=n(89),c=n(7),u=n(192),l=n(136),d=n(26),f=n(56),p=o&&o.prototype,h=c(\"species\"),v=!1,g=i(r.PromiseRejectionEvent),y=a(\"Promise\",(function(){var e=s(o),t=e!==String(o);if(!t&&66===f)return!0;if(d&&(!p.catch||!p.finally))return!0;if(!f||f<51||!/native code/.test(e)){var n=new o((function(e){e(1)})),r=function(e){e((function(){}),(function(){}))};if((n.constructor={})[h]=r,!(v=n.then((function(){}))instanceof r))return!0}return!t&&(u||l)&&!g}));e.exports={CONSTRUCTOR:y,REJECTION_EVENT:g,SUBCLASSING:v}},function(e,t,n){\"use strict\";var r=n(20),o=TypeError,i=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw new o(\"Bad Promise constructor\");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new i(e)}},function(e,t,n){\"use strict\";e.exports={}},function(e,t,n){\"use strict\";var r,o=n(10),i=n(200),a=n(92),s=n(91),c=n(132),u=n(71),l=n(90),d=l(\"IE_PROTO\"),f=function(){},p=function(e){return\" + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Bibliography

+ +
    +
  • Access Control Ontology: https://www.w3.org/ns/auth/acl
  • +
  • Web Access Control Specification from W3: https://www.w3.org/wiki/WebAccessControl
  • +
  • Web Access Control specifications by Solid project: https://github.com/solid/web-access-control-spec
  • +
  • WebSub specification by W3C: https://www.w3.org/TR/websub/
  • +
  • Fedora project: https://wiki.lyrasis.org/display/FEDORA51/WebAC+Authorizations
  • +
  • Access Control in Linked Data Using WebID: https://arxiv.org/pdf/1611.03019.pdf
  • +
  • VCard ontology: https://www.w3.org/2006/vcard/ns#%3E
  • +
  • Luca Costabello (2013) Context-aware access control and presentation of linked data. https://tel.archives-ouvertes.fr/tel-00934617/document
  • +
  • JSON-LD 1.1 A JSON-based Serialization for Linked Data. https://www.w3.org/TR/json-ld11/
  • +
  • JSON Web Token (JWT). https://jwt.io
  • +
  • What is x-hub-signature? https://repl.ca/what-is-x-hub-signature/
  • +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/changelog/index.html b/development/API-Security/changelog/index.html new file mode 100644 index 00000000..4f727d97 --- /dev/null +++ b/development/API-Security/changelog/index.html @@ -0,0 +1,3300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelog - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Changelog

+ +

All notable changes to this project will be documented in this file.

+

The format is based on Keep a Changelog, +and this project adheres to Semantic Versioning.

+

2.1.0-dev

+

Ideas

+
    +
  • Sorting/Pagination Logistics Events list
  • +
  • Add filters/triggers to Subscription information for server-side Notifications filtering
  • +
+

ONE Record API Specification

+

Changed

+
    +
  • Align documentation and ontology using always hasErrorDetail/ErrorDetail.
  • +
+

2.0.0

+
+

ONE Record API Specification

+

Changed

+
    +
  • restructured Introduction section
  • +
  • use Logistics Object instead of its abbreviation LO
  • +
  • use Logistics Object URI / Organization URI for the complete URI of a Logistics Object, i.e. https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c
  • +
  • use logisticsObjectID for the unique identifier part of the URI, i.e. 1a8ded38-1804-467c-a369-81a411416b7c
  • +
  • use Data Holder instead of Data Onwer
  • +
  • redesign the Update Action Requests section
  • +
  • use the Collection object to return a list of Logistics Events
  • +
+

Removed

+
    +
  • removed Memento (incl. TimeGate, Timemap)
  • +
  • removed implicit endpoints; define URI structure of Logistics Objects
  • +
  • removed Link HTTP header, because URI and endpoint structure is defined
  • +
  • removed required ttl/turtle as supported content-type
  • +
  • removed acl endpoint
  • +
+

Added

+
    +
  • added UTF-8 as default content encoding
  • +
  • added 1 as default revision number for AuditTrail and LogisticsObjects
  • +
  • added class diagram as supporting document
  • +
  • added overview of data classes and properties as CSV file to supporting documents,
  • +
  • added two reference OpenAPI specifications as supporting documents (minimum = to be ONE Record server compliant; recommended = for comfort features)
  • +
  • added Implementation Guidelines section to reduce ambiguity
  • +
  • added JSON files with examples mentioned in the API specification
  • +
  • added overview of permissions for Access Delegation
  • +
  • added ActionEnum to class diagram
  • +
  • added Authentication and Authorization with OpenID Connect
  • +
  • added security and endpoint information for all APIs
  • +
  • added allow subscription for third parties
  • +
  • added list of JSON-LD libraries in the Implementation Guidelines
  • +
+
+

ONE Record API Ontology

+

Changed

+
    +
  • changed IRI structure to follow best practice
  • +
  • renamed CompanyInformation to ServerInformation, because it mainly contains meta information about the ONE Record API and its configuration
  • +
  • replaced ServerInformation#company and ServerInformation#companyId (formerly CompanyInformation) with ServerInformation#dataOwner
  • +
  • merged PatchRequest into ChangeRequest
  • +
  • renamed Operation#op enums to UPPERCASE, e.g. changed del to DELETE
  • +
  • renamed Details to ErrorDetail
  • +
  • renamed ChangeRequest#requestingParty to ChangeRequest#requestedBy
  • +
  • renamed ChangeRequest#timestamp to ChangeRequest#requestedAt
  • +
  • changed ChangeRequest#requestingParty to ChangeRequest#requestedBy (https://onerecord.iata.org/ns/cargo#Organization)
  • +
  • renamed ErrorDetail#attribute to ErrorDetail#property
  • +
  • renamed ServerInformation#supportedLogisticsObjects to ServerInformation#supportedLogisticsObjectTypes
  • +
  • changed property type of Notification#topic, Notification#changedProperties, OperationObject#datatype, ServerInformation#serverEndpoint, ServerInformation#supportedLogisticsObjects, ErrorDetail#property, ErrorDetail#resource, Subscription#callbackUrl, Subscription#topic, Subscription#subscribedTo
  • +
  • renamed Subscription#myCompanyIdentifier to Subscription#subscriber
  • +
  • changed Subscription#cacheFor (xsd:int) to Subscription#expiresAt (xsd:dateTime)
  • +
  • renamed DelegationRequest#operations to DelegationRequest#permissions
  • +
  • renamed api#status (used in SubscriptionRequest, ChangeRequest DelegationRequest) to api#requestStatus
  • +
  • renamed ServerInformation#hasDataOnwer into ServerInformation#hasDataHolder
  • +
  • changed Subscription#notifyRequestStatusChange from mandatory to optional
  • +
  • changed Change#notifyRequestStatusChange from mandatory to optional
  • +
  • changed AccessDelegation#notifyRequestStatusChange from mandatory to optional
  • +
+

Removed

+
    +
  • removed not used classes, data properties, object properties
  • +
  • removed Memento (classes, data properties, object properties)
  • +
  • removed ServerInformation#companyId
  • +
  • removed AuditTrail#errors
  • +
  • removed AuditTrail#loInitialSnapshot
  • +
  • removed ChangeRequest#requestorCompanyIdentifier
  • +
  • removed ServerInformation#errors
  • +
  • removed Subscription#subscribedTo
  • +
  • replaced LogisticsObjectRef data class and use https://onerecord.iata.org/ns/cargo#LogisticsObject instead
  • +
  • removed Subscription#secret
  • +
  • removed DelegationRequest#action
  • +
  • removed Subscription#callbackUrl
  • +
  • removed cargo ontology data classes
  • +
  • removed ServerInformation#hasSupportedLogisticsObjectType
  • +
  • removed Subscription#subscribeToLogisticsEvents
  • +
+

Added

+
    +
  • added Notification#changedProperties
  • +
  • added further enums to notification#eventType, i.e. LOGISTICS_EVENT_RECEIVED, CHANGE_REQUEST_ACCEPTED, CHANGE_REQUEST_FAILED, CHANGE_REQUEST_PENDING, CHANGE_REQUEST_REJECTED, DELEGATION_REQUEST_PENDING, DELEGATION_REQUEST_ACCEPTED, DELEGATION_REQUEST_REJECTED, DELEGATION_REQUEST_FAILED, SUBSCRIPTION_REQUEST_PENDING, SUBSCRIPTION_REQUEST_ACCEPTED, SUBSCRIPTION_REQUEST_REJECTED, SUBSCRIPTION_REQUEST_FAILED
  • +
  • added PENDING enum to ChangeRequest#requestStatus
  • +
  • added Operation#s to enable updating not only properties of primitive types, e.g. int, string, but also embedded objects, e.g. Shipment#totalGrossWeight in LogisticsObjects
  • +
  • added Notification#triggeringChangeRequest
  • +
  • added SubscriptionRequest. Subscription is the response for the scenario where publisher initiates the Subscription and asks the subscribers for their Subscription information. SubscriptionRequest is used for scenario where the subscriber initiates a SubscriptionRequest towards the Publisher.
  • +
  • added Subscription#topicType to indicate if topic is a LogisticsObject type or a specific LogisticsObjectIdentifier
  • +
  • added ServerInformation#supportedApiVersion
  • +
  • added ActionRequest as superclass for SubscriptionRequest, ChangeRequest, and DelegationRequest
  • +
  • added providesNotificationsEndpoint (xsd:boolean) to ServerInformation
  • +
  • added AccessDelegation and Change for ActionRequests
  • +
  • import cargo ontology with owl:imports cargo
  • +
  • changed min/max cardinalities to exact cardinalities (qualifiedCardinality)
  • +
  • introduced Named Individuals to represent ENUMs
  • +
  • added Notification#hasLogisticsObjectType
  • +
  • added Subscription#includeSubscriptionEventType
  • +
  • added enumeration SubscriptionEventType
  • +
  • added Collection class
  • +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/community/index.html b/development/API-Security/community/index.html new file mode 100644 index 00000000..c9d90c72 --- /dev/null +++ b/development/API-Security/community/index.html @@ -0,0 +1,2992 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Community - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Community

+ +

Contribute

+

See Contributing for more details on how to contribute to ONE Record API specification.

+

Issues

+

Issues on the ONE Record API specification are tracked in GitHub:

+ +

Maintainers

+
+

A maintainer is a person who is responsible for the ongoing development of the ONE Record API specification and has commit access to the ONE Record main repository.

+
+ +

Contributors

+
+

A contributor can be anyone who actively contributes changes in order to improve the ONE Record API specification.

+
+ +

(sorted alphabetically)

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/concepts/index.html b/development/API-Security/concepts/index.html new file mode 100644 index 00000000..6fabe879 --- /dev/null +++ b/development/API-Security/concepts/index.html @@ -0,0 +1,3334 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Concepts - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Concepts

+ +

ONE Record API

+

The ONE Record API specifies the interface and interactions via standardized Web Application Programming Interface (API), which allows all participants in the network to connect their IT systems to the IT systems of their partners, using state of the art web technologies. +To achieve this, the ONE Record API specifies how data exchange between logistics and transport stakeholders can be achieved over HTTP. +The ONE Record API specification is associated with the ONE Record Data Model that specifies the models and relationships within the transport and logistics data domain as common "language" between all stakeholders.

+

ONE Record Data Model

+

The ONE Record data model is specified as an ontology which is also referred to as a semantic model. The ONE Record standard consists of two ontologies: the ONE Record cargo ontology and the ONE Record API ontology

+

The ONE Record cargo ontology contains industry concepts, their properties, and their relationships between them. This ontology can be used by analysts, developers, and users to understand the data classes in ONE Record and their relationship to each other.

+

The ONE Record API ontology contains the data classes and their relationship used for the ONE Record Web API.

+

Both ontologies are maintained on GitHub. +Furthermore, an online documentation based on the ontology can be found in the Tools section on the ONE Record Developer Portal.

+

ONE Record Node

+

Each participant is technically represented as an ONE Record node. +Such node can have capabilities of a ONE Record server and/or a ONE Record client.

+

Typically, a ONE Record node represents a single organization. +However, there might exist scenarios where an ONE Record node is shared between (sub-)organizations.

+

A single organization can also operate multiple ONE Record nodes, such as IoT devices that implement ONE Record clients to transmit data to ONE Record servers using the ONE Record standard.

+

ONE Record Server

+

A ONE Record server - also called a ONE Record REST API implementation - is a web server that provides some or all of the specified ONE Record REST API endpoints and some or all of the data model specifications. +Technically, it could be just a simple HTTP web server or existing Web API. Therefore, the ONE Record API and data model specifications may be added to existing (server) software implementations that also provide other web services.

+

In this document, the term ONE Record server is used when referring to an actual software implementation of the ONE Record REST API specification that responds to HTTP requests from a ONE Record client.

+

ONE Record Client

+

A ONE Record client is a technical representation of a stakeholder using ONE Record to exchange data in the network. +Unlike a ONE Record server that responses to API requests, a ONE Record Client initiates interaction with a ONE Record server.

+

Each ONE Record server can also include a ONE Record client implementation in order to interact with other ONE Record server, i.e. by sending HTTP requests.

+

However, not every ONE Record client MUST contain a ONE Record server implementation. +Nevertheless, it is useful for pub-sub interactions, for example.

+

In this document, the term ONE Record client is used when referring to an software program that sends HTTP requests to a ONE Record server.

+

Base URL

+

The term Base URL stands for "Base Uniform Resource Locator" in the context of web development and URLs (Uniform Resource Locators). A URL is a web address that specifies the location of a resource, such as a webpage or a file, on the internet. The base URL serves as a foundation or starting point for constructing complete URLs within a particular context.

+

In simpler terms, the base URL provides the common part of a URL that remains consistent for a set of related web pages or resources. This can be especially useful when you're working on a website with multiple pages or dealing with resources organized in a specific directory structure.

+

For instance, consider the ONE Record scenario where you have multiple endpoints, such as "logistics-objects" "action-requests" and "notifications." The base URL in this case might be:

+
https://1r.example.com
+
+

Then, you can append specific paths to the base URL to access different ONE Record endpoints:

+
    +
  • Logistics Objects: https://1r.example.com/logistics-objects
  • +
  • Action Requests: https://1r.example.com/action-requests
  • +
  • Contact page: https://1r.example.com/notifications
  • +
+

Here, the base URL https://1r.example.com/ remains constant for all the pages, and you simply extend it with the unique paths for each API. +In every endpoint, the idea of a Base URL will be denoted as {{baseURL}}.

+

Logistics Objects

+

The ONE Record cargo ontology is organized as a set of data classes that represent real world concepts in transport and logistics, also referred to as digital twins. +These generic data classes are referred to as Logistics Objects in the world of ONE Record. +Each digital twin is an instance of a data classes that inherits from the Logistics Object data class. +The data exchange that is facilitated by the ONE Record API is mainly the exchange of Logistics Objects. +This is transition from the traditional logistics and transport EDI systems that only exchanged messages and documents. +The concept of Logistics Objects is far more extensive since Logistics Objects can be more granular and have very specific usage in different use cases within the logistics and transport domain. +Examples of a Logistics Object are a Piece, an IotDevice, a Sensor or a BookingOptionRequest and many more.

+

Holder of a Logistics Object

+

The holder of a Logistics Object is the one who created it and thus has control over it. The holder may also control the ONE Record server on which the Logistics Object is accessible via HTTP requests, but this is not a requirement. +Instead, the holder may use a 3rd party IT solution provider that implements, operates, and provisions the ONE Record API and will provide suitable access to the holder to manage and control the Logistics Objects, including its creation, any changes, authorization and access rights, etc.

+

In a publisher-subscriber scenario, the holder of a Logistics Object is also referred to as Publisher.
+In an access delegation scenario, the holder of a Logistics Object is also referred to as the Delegator.

+
+

Note

+

In this ONE Record API specification document, the term holder describes a technical holder of a logistics object data object. +The holder of a Logistics Object might be even the owner of the data. The term holder does not include legal topics such as data governance, ownership, data stewardship or data custodian.

+
+

User of a Logistics Object

+

A user of a Logistics Object is anyone other than the holder and who has an interest in the Logistics Object. +Most likely the user will have a role in the logistics and transport of a shipment. +The user of a Logistics Objet MAY be from another organization than the holder or from the same organization but with a different function within that organization.

+

In a publisher-subscriber scenario, the user of a Logistics Object is also referred to as Requestor or Subscriber.
+In an access delegation scenario, the user of a Logistics Object is also referred to as the Requestor or Delegate.
+In a PATCH scenario, the user of a Logistics Object is also referred to as the Requestor.

+

Logistics Object URI

+

Every Logistics Object MUST have a globally unique identifier, a so-called Uniform Resource Identifier (URI). This Logistics Object URI MUST NOT be changed as it is the permanent identifier of a specific Logistics Object.

+

The actual generation of Logistics Object URIs and thus the design of a unique URI structure is left to each ONE Record API implementer as long as it complies with the valid Logistics Object URI. A valid Logistics Object URI MUST follow RFC 3986 and MUST look like:

+
{scheme}://{host}[:port]/[basePath]/logistics-objects/{logisticsObjectId}
+
+

The URI components are described below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
URI ComponentDescriptionExamples
schemeTransfer protocol used by the API
  • http
  • https
hostHost name, domain name or IP address (and port) of the host that serves the ONE Record API
  • 127.0.0.1:8080
  • 1r.example.com
  • api.airline.com
basePathOptional URL prefix for all API paths, relative to the host root. The basePath is NOT mandatory.
  • /tenants/
  • /api/
  • /onerecord/
  • /rest/public/
logisticsObjectIdAn identifier for the Logistics Object that is unique for this ONE Record server (and thus globally). This logisticsObjectId to identify the Logistics Object may be meaningful or obscure. A meaningful logisticsObjectId might include a reference to the type of the Logistics Object itself. An obscure logisticsObjectId could be a UUID.
  • e17502db-9b2d-46cc-a06c-efb24aeca49b
  • waybill-123-12345678
+

Examples of valid Logistics Object URIs:

+
https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c
+https://api.airline.com/handling/onerecord/logistics-objects/waybill-123-12345678-1
+https://onerecordcloud.com/organizations/airline/logistics-objects/6596bb81-f5a0-46d0-81be-c4d39531fc6a
+https://api.airline.com/rest/public/onerecord/logistics-objects/6596bb81-f5a0-46d0-81be-c4d39531fc6a
+
+

Organization URI

+

In ONE Record, each party in the ONE Record network, e.g., a shipper, airline, or public authorities like customs that acts as an holder or user of Logistics Objects, requires a globally unique identifier, a so-called Organization URI. +This MUST have a URI that points to a data object that inherits from Organization which inherits from LogisticsObject. Therefore, the same URI structure as for Logistics Objects MUST be applied.

+

This data object can be a Company, a Carrier, or a PublicAuthority. +It MUST uniquely identifies an organization in its data exchanges with other organizations that use ONE Record. +As shown below, this Organization URI MAY share the same structure as a Logistics Object URI:

+

Examples of valid Organization URIs:

+
https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda
+https://1r.example.com/onerecord/logistics-objects/24a8a9f0-92c1-4405-8dfb-71875e8cde0a
+https://1r.example.com/rest/public/onerecord/logistics-objects/24a8a9f0-92c1-4405-8dfb-71875e8cde0a
+https://1r.platform.com/organizations/airline/logistics-objects/airline
+
+

Plug & Play Connectivity

+

The implementation of ONE Record implies the implementation of Web APIs that comply with the ONE Record API and data model. +Consequently, any compliant ONE Record client/server can connect and exchange data with any other ONE Record client/server by simply accessing each other's endpoints via URIs.

+

Linked Data

+

A central approach of ONE Record is to enable the creation of a comprehensive network of +data, i.e. data related to specific consignments and shipments are accessible as a +unique and single shipment record, i.e. "one record" in that network of linked data. To achieve this, the ONE Record data model is based on a ONE Record cargo industry ontology using the Resource Description Framework (RDF) format.

+

Used Namespace Prefixes in ONE Record Context

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PrefixNamespaceDescription
cargohttps://onerecord.iata.org/ns/cargoThis refers to the ONE Record cargo ontology.
apihttps://onerecord.iata.org/ns/apiThis refers to the ONE Record API ontology.
xsdhttp://www.w3.org/2001/XMLSchemaW3C vocabulary, primarily used for primitive data types (e.g. string, dateTime)
aclhttp://www.w3.org/ns/auth/aclOntology for WebAccessControl with Access Control Lists (ACL)
+

JSON for Linking Data (JSON-LD)

+

The ONE Record API specification defines JSON for Linking Data (JSON-LD) as the default RDF serialization. Other RDF serializations MAY also be used, because they are interchangeable, e.g. Terse RDF Triple Language (TTL).

+

To fully understand the syntax of RDF and JSON-LD, a deep dive into RDF is required. For the purpose of this document, it is sufficient to understand the example below that represents a Logistics Object of type Sensor

+

RDF and JSON-LD have different forms to format data that are all equivalent. +For example, JSON-LD defines different types of transformations that can be applied to structure the data output. +Therefore, the same Sensor object can be formatted as extended (see example 1) - where the URIs of the properties are explicit - or formatted as compressed (see example 2).

+

Example 1:

+
Sensor.expanded.json
{
+  "@type": "https://onerecord.iata.org/ns/cargo#Sensor",
+  "@id": "http://1r.example.com/logistics-objects/11ccfb7c-3643-41db-8098-740fccd97c93",
+  "https://onerecord.iata.org/ns/cargo#description": "A data logger with a temperature sensor.",
+  "https://onerecord.iata.org/ns/cargo#name": "TPx14-a",
+  "https://onerecord.iata.org/ns/cargo#serialNumber": "142NL",
+  "https://onerecord.iata.org/ns/cargo#sensorType": {
+    "@id": "https://onerecord.iata.org/ns/cargo#THERMOMETER"
+  }
+}
+
+

(see Sensor.expanded.json)

+

Example 2:

+
Sensor.compacted.json
{
+  "@context": {
+    "cargo": "https://onerecord.iata.org/ns/cargo#"
+  },
+  "@id": "http://1r.example.com/logistics-objects/11ccfb7c-3643-41db-8098-740fccd97c93",
+  "@type": "cargo:Sensor",
+  "cargo:description": "A data logger with a temperature sensor.",
+  "cargo:name": "TPx14-a",
+  "cargo:serialNumber": "142NL",
+  "cargo:sensorType": {
+    "@id": "https://onerecord.iata.org/ns/cargo#THERMOMETER"
+  }
+}
+
+

(see Sensor.compacted.json)

+

There are more forms that are equal to the example above. Copy and paste the first example on the JSON-LD Playground to see this different forms.

+

A full specification of the JSON-LD 1.1 standard can be found here

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/examples/ACL.json b/development/API-Security/examples/ACL.json new file mode 100644 index 00000000..d1aa1bcb --- /dev/null +++ b/development/API-Security/examples/ACL.json @@ -0,0 +1,24 @@ +{ + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c/acl", + "@type": [ + "http://www.w3.org/ns/auth/acl#Authorization" + ], + "http://www.w3.org/ns/auth/acl#agent": { + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda", + "@type": [ + "http://xmlns.com/foaf/0.1/Agent" + ] + }, + "http://www.w3.org/ns/auth/acl#accessTo": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c", + "@type": [ + "https://onerecord.iata.org/ns/cargo#Piece", + "https://onerecord.iata.org/ns/cargo#LogisticsObject" + ] + }, + "http://www.w3.org/ns/auth/acl#mode": [ + { + "@id": "http://www.w3.org/ns/auth/acl#Read" + } + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/AccessDelegation_example1.json b/development/API-Security/examples/AccessDelegation_example1.json new file mode 100644 index 00000000..8650672e --- /dev/null +++ b/development/API-Security/examples/AccessDelegation_example1.json @@ -0,0 +1,19 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:AccessDelegation", + "api:hasDescription": "Require access to Piece for handling", + "api:hasPermission": [{ + "@id": "api:GET_LOGISTICS_OBJECT" + } + ], + "api:isRequestedFor": [{ + "@id": "https://1r.example.com/logistics-objects/Airline_XYZ" + }], + "api:notifyRequestStatusChange": false, + "api:hasLogisticsObject": [{ + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }] +} \ No newline at end of file diff --git a/development/API-Security/examples/AccessDelegation_example2.json b/development/API-Security/examples/AccessDelegation_example2.json new file mode 100644 index 00000000..d4df1aea --- /dev/null +++ b/development/API-Security/examples/AccessDelegation_example2.json @@ -0,0 +1,19 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:AccessDelegation", + "api:hasDescription": "Our GHA requires read access to Piece for handling", + "api:hasPermission": [{ + "@id": "api:GET_LOGISTICS_OBJECT" + } + ], + "api:isRequestedFor": [{ + "@id": "https://1r.example.com/logistics-objects/GHA_ABC" + }], + "api:notifyRequestStatusChange": false, + "api:hasLogisticsObject": [{ + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }] +} \ No newline at end of file diff --git a/development/API-Security/examples/ActionRequestChange_example1.json b/development/API-Security/examples/ActionRequestChange_example1.json new file mode 100644 index 00000000..40976c8f --- /dev/null +++ b/development/API-Security/examples/ActionRequestChange_example1.json @@ -0,0 +1,41 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:ActionRequestChange", + "api:referencesActionRequest": { + "@type": "api:ActionRequest", + "@id": "https://1r.example.com/action-requests/733ed391-ad11-4c02-a2bf-c77ee7997c28" + }, + "api:hasDescription": "SubscriptionRequest accepted", + "api:hasOperation": [ + { + "@type": "api:Operation", + "api:op": { "@id": "api:DELETE" }, + "api:s": "https://1r.example.com/action-requests/733ed391-ad11-4c02-a2bf-c77ee7997c28", + "api:p": "https://onerecord.iata.org/ns/api#hasRequestStatus", + "api:o": [ + { + "@type": "api:OperationObject", + "api:hasDatatype": "https://onerecord.iata.org/ns/api#RequestStatus", + "api:hasValue": "https://onerecord.iata.org/ns/api#REQUEST_PENDING" + } + ] + }, + { + "@type": "api:Operation", + "api:op": { "@id": "api:ADD" }, + "api:s": "https://1r.example.com/action-requests/733ed391-ad11-4c02-a2bf-c77ee7997c28", + "api:p": "https://onerecord.iata.org/ns/api#hasRequestStatus", + "api:o": [ + { + "@type": "api:OperationObject", + "api:hasDatatype": "https://onerecord.iata.org/ns/api#RequestStatus", + "api:hasValue": "https://onerecord.iata.org/ns/api#REQUEST_ACCEPTED" + } + ] + } + ] +} + + \ No newline at end of file diff --git a/development/API-Security/examples/AuditTrail.json b/development/API-Security/examples/AuditTrail.json new file mode 100644 index 00000000..9afd1bf6 --- /dev/null +++ b/development/API-Security/examples/AuditTrail.json @@ -0,0 +1,30 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:AuditTrail", + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c/audit-trail", + "api:hasChangeRequest": [ + { + "@type": "api:ChangeRequest", + "@id": "https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b", + "api:hasChange": { + ...this contains a complete Change object... + }, + "api:hasError": [], + "api:isRequestedAt": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2020-09-07T11:55:45.768Z" + }, + "api:isRequestedBy": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda", + "api:hasRequestStatus": { + "@id": "api:REQUEST_STATUS_ACCEPTED" + } + } + ], + "api:hasLatestRevision": { + "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger", + "@value": "2" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/AuditTrail_example2.json b/development/API-Security/examples/AuditTrail_example2.json new file mode 100644 index 00000000..6ed18275 --- /dev/null +++ b/development/API-Security/examples/AuditTrail_example2.json @@ -0,0 +1,45 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:AuditTrail", + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c/audit-trail", + "api:hasChangeRequest": [ + { + "@type": "api:ChangeRequest", + "@id": "https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b", + "api:hasChange": { + ...this contains a complete Change object... + }, + "api:hasError": [ + { + "@type": "api:Error", + "@id": "https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b/errors/98843671-388c-53c6-ba79-7be266f61aa0", + "api:hasTitle": "LogisticsObject revision does not match", + "api:hasErrorDetail": [ + { + "@type": "api:ErrorDetail", + "@id": "_:b1", + "api:hasCode": "409", + "api:hasMessage": "LogisticsObject revision does not match", + "api:hasResource": "http://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + } + ] + } + ], + "api:isRequestedAt": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2020-09-07T11:55:45.768Z" + }, + "api:isRequestedBy": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda", + "api:hasRequestStatus": { + "@id": "api:REQUEST_STATUS_REJECTED" + } + } + ], + "api:hasLatestRevision": { + "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger", + "@value": "2" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/ChangeRequest_with_error.json b/development/API-Security/examples/ChangeRequest_with_error.json new file mode 100644 index 00000000..f6135126 --- /dev/null +++ b/development/API-Security/examples/ChangeRequest_with_error.json @@ -0,0 +1,22 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#", + "@language": "en-US" + }, + "@type": "api:ChangeRequest", + "api#errors": [ + { + "@type":"api:Error", + "api:hasTitle":"Conflict with Logistics Object revision number", + "api:hasErrorDetail":[ + { + "@type":"api:ErrorDetail", + "api:hasCode":"409", + "api:hasMessage":"The provided revision number is invalid or lower than the current Logistics Object revision", + "api:hasResource":"http://1r.example.com/logistics-objects/11ccfb7c-3643-41db-8098-740fccd97c93" + } + ] + } + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/Change_example1.json b/development/API-Security/examples/Change_example1.json new file mode 100644 index 00000000..59ab4879 --- /dev/null +++ b/development/API-Security/examples/Change_example1.json @@ -0,0 +1,49 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Change", + "api:hasLogisticsObject": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }, + "api:hasDescription": "Update goods description and coload", + "api:hasOperation": [{ + "@type": "api:Operation", + "api:op": { "@id": "api:ADD" }, + "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c", + "api:p": "https://onerecord.iata.org/ns/cargo#goodsDescription", + "api:o": [{ + "@type": "api:OperationObject", + "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#string", + "api:hasValue": "ONE Record Advertisement Materials" + }] + }, + { + "@type": "api:Operation", + "api:op": { "@id": "api:DELETE" }, + "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c", + "api:p": "https://onerecord.iata.org/ns/cargo#coload", + "api:o": [{ + "@type": "api:OperationObject", + "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#boolean", + "api:hasValue": "false" + }] + }, + { + "@type": "api:Operation", + "api:op": { "@id": "api:ADD" }, + "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c", + "api:p": "https://onerecord.iata.org/ns/cargo#coload", + "api:o": [{ + "@type": "api:OperationObject", + "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#boolean", + "api:hasValue": "true" + }] + } + ], + "api:hasRevision": { + "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger", + "@value": "1" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Change_example2.json b/development/API-Security/examples/Change_example2.json new file mode 100644 index 00000000..43a3d368 --- /dev/null +++ b/development/API-Security/examples/Change_example2.json @@ -0,0 +1,62 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Change", + "api:hasLogisticsObject": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }, + "api:hasDescription": "Add grossWeight", + "api:hasOperation": [ + { + "@type": "api:Operation", + "api:op": { + "@id": "api:ADD" + }, + "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c", + "api:p": "https://onerecord.iata.org/ns/cargo#grossWeight", + "api:o": [ + { + "@type": "api:OperationObject", + "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#Value", + "api:hasValue": "_:b0" + } + ] + }, + { + "@type": "api:Operation", + "api:op": { + "@id": "api:ADD" + }, + "api:s": "_:b0", + "api:p": "https://onerecord.iata.org/ns/cargo#unit", + "api:o": [ + { + "@type": "api:OperationObject", + "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#string", + "api:hasValue": "KGM" + } + ] + }, + { + "@type": "api:Operation", + "api:op": { + "@id": "api:ADD" + }, + "api:s": "_:b0", + "api:p": "https://onerecord.iata.org/ns/cargo#value", + "api:o": [ + { + "@type": "api:OperationObject", + "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#double", + "api:hasValue": "20.0" + } + ] + } + ], + "api:hasRevision": { + "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger", + "@value": "2" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Change_example3.json b/development/API-Security/examples/Change_example3.json new file mode 100644 index 00000000..31a9a25f --- /dev/null +++ b/development/API-Security/examples/Change_example3.json @@ -0,0 +1,42 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Change", + "api:hasLogisticsObject": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }, + "api:hasDescription": "Change grossWeight", + "api:hasOperation": [{ + "@type": "api:Operation", + "api:op": { + "@id": "api:DELETE" + }, + "api:s": "internal:7fc81d1d-6c75-568b-9e47-48c947ed2a07", + "api:p": "https://onerecord.iata.org/ns/cargo#value", + "api:o": [{ + "@type": "api:OperationObject", + "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#double", + "api:hasValue": "20.0" + }] + }, + { + "@type": "api:Operation", + "api:op": { + "@id": "api:ADD" + }, + "api:s": "internal:7fc81d1d-6c75-568b-9e47-48c947ed2a07", + "api:p": "https://onerecord.iata.org/ns/cargo#value", + "api:o": [{ + "@type": "api:OperationObject", + "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#double", + "api:hasValue": "25.0" + }] + } + ], + "api:hasRevision": { + "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger", + "@value": "2" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Change_example4.json b/development/API-Security/examples/Change_example4.json new file mode 100644 index 00000000..0cd08fea --- /dev/null +++ b/development/API-Security/examples/Change_example4.json @@ -0,0 +1,55 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Change", + "api:hasLogisticsObject": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }, + "api:hasDescription": "delete grossWeight", + "api:hasOperation": [{ + "@type": "api:Operation", + "api:op": { + "@id": "api:DELETE" + }, + "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c", + "api:p": "https://onerecord.iata.org/ns/cargo#grossWeight", + "api:o": [{ + "@type": "api:OperationObject", + "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#Value", + "api:hasValue": "_:b0" + }] + }, + { + "@type": "api:Operation", + "api:op": { + "@id": "api:DELETE" + }, + "api:s": "_:b0", + "api:p": "https://onerecord.iata.org/ns/cargo#unit", + "api:o": [{ + "@type": "api:OperationObject", + "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#string", + "api:hasValue": "KGM" + }] + }, + { + "@type": "api:Operation", + "api:op": { + "@id": "api:DELETE" + }, + "api:s": "_:b0", + "api:p": "https://onerecord.iata.org/ns/cargo#value", + "api:o": [{ + "@type": "api:OperationObject", + "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#double", + "api:hasValue": "20" + }] + } + ], + "api:hasRevision": { + "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger", + "@value": "3" + } +} diff --git a/development/API-Security/examples/Change_example5.json b/development/API-Security/examples/Change_example5.json new file mode 100644 index 00000000..a056a27f --- /dev/null +++ b/development/API-Security/examples/Change_example5.json @@ -0,0 +1,42 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Change", + "api:hasLogisticsObject": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }, + "api:hasDescription": "add CustomsInformations", + "api:hasOperation": [{ + "@type": "api:Operation", + "api:op": { + "@id": "api:ADD" + }, + "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c", + "api:p": "https://onerecord.iata.org/ns/cargo#customsInformation", + "api:o": [{ + "@type": "api:OperationObject", + "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#CustomsInformation", + "api:hasValue": "https://1r.example.com/logistics-objects/4d73acf0-3073-4ec9-8aee-b82d64ba3805" + }] + }, + { + "@type": "api:Operation", + "api:op": { + "@id": "api:ADD" + }, + "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c", + "api:p": "https://onerecord.iata.org/ns/cargo#customsInformation", + "api:o": [{ + "@type": "api:OperationObject", + "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#CustomsInformation", + "api:hasValue": "https://1r.example.com/logistics-objects/ba1c2194-2442-400b-b26b-466a01dda8b5" + }] + } + ], + "api:hasRevision": { + "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger", + "@value": "4" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Change_example6.json b/development/API-Security/examples/Change_example6.json new file mode 100644 index 00000000..39ec14f5 --- /dev/null +++ b/development/API-Security/examples/Change_example6.json @@ -0,0 +1,33 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Change", + "api:hasLogisticsObject": [ + { + "@type": "cargo:LogisticsObject", + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b8c" + } + ], + "api:hasDescription": "add CustomsInformations", + "api:hasOperation": [ + { + "@type": "api:Operation", + "api:op": { "@id": "api:ADD" }, + "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b8c", + "api:p": "https://onerecord.iata.org/ns/cargo#customsInformation", + "api:o": [ + { + "@type": "api:OperationObject", + "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#CustomsInformation", + "api:hasValue": "https://1r.example.com/logistics-objects/4d73acf0-3073-4ec9-8aee-b82d64ba3805" + } + ] + } + ], + "api:hasRevision": { + "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger", + "@value": "4" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Change_example7.json b/development/API-Security/examples/Change_example7.json new file mode 100644 index 00000000..7517af94 --- /dev/null +++ b/development/API-Security/examples/Change_example7.json @@ -0,0 +1,33 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Change", + "api:hasLogisticsObject": [ + { + "@type": "cargo:LogisticsObject", + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + } + ], + "api:hasDescription": "add LogisticsEvent", + "api:hasOperation": [ + { + "@type": "api:Operation", + "api:op": { "@id": "api:ADD" }, + "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c", + "api:p": "https://onerecord.iata.org/ns/cargo#hasLogisticsEvent", + "api:o": [ + { + "@type": "api:OperationObject", + "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#LogisticsEvent", + "api:hasValue": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c/logistics-events/c9ab534e-3246-48d3-b34d-bb380bd98af7" + } + ] + } + ], + "api:hasRevision": { + "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger", + "@value": "4" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Company.json b/development/API-Security/examples/Company.json new file mode 100644 index 00000000..be16554a --- /dev/null +++ b/development/API-Security/examples/Company.json @@ -0,0 +1,26 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#" + }, + "@type": [ + "cargo:Company", + "cargo:Organization", + "cargo:LogisticsAgent", + "cargo:LogisticsObject" + ], + "cargo:name": "Acme Corporation", + "cargo:shortName": "ACME", + "cargo:contactPersons": [ + { + "@type": [ + "cargo:Person", + "cargo:Actor", + "cargo:LogisticsAgent", + "cargo:LogisticsObject" + ], + "cargo:firstName": "Jane", + "cargo:lastName": "Doe", + "cargo:salutation": "Ms" + } + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/Company_with_id.json b/development/API-Security/examples/Company_with_id.json new file mode 100644 index 00000000..102f1089 --- /dev/null +++ b/development/API-Security/examples/Company_with_id.json @@ -0,0 +1,24 @@ +{ + "@type": [ + "https://onerecord.iata.org/ns/cargo#Company", + "https://onerecord.iata.org/ns/cargo#Organization", + "https://onerecord.iata.org/ns/cargo#LogisticsAgent", + "https://onerecord.iata.org/ns/cargo#LogisticsObject" + ], + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda", + "https://onerecord.iata.org/ns/cargo#name": "Acme Corporation", + "https://onerecord.iata.org/ns/cargo#shortName": "ACME", + "https://onerecord.iata.org/ns/cargo#contactPersons": [ + { + "@type": [ + "https://onerecord.iata.org/ns/cargo#Person", + "https://onerecord.iata.org/ns/cargo#Actor", + "https://onerecord.iata.org/ns/cargo#LogisticsAgent", + "https://onerecord.iata.org/ns/cargo#LogisticsObject" + ], + "https://onerecord.iata.org/ns/cargo#firstName": "Jane", + "https://onerecord.iata.org/ns/cargo#lastName": "Doe", + "https://onerecord.iata.org/ns/cargo#salutation": "Ms" + } + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/CustomsInformation.json b/development/API-Security/examples/CustomsInformation.json new file mode 100644 index 00000000..93596ff7 --- /dev/null +++ b/development/API-Security/examples/CustomsInformation.json @@ -0,0 +1,14 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#" + }, + "@type": "cargo:CustomsInformation", + "cargo:country": { + "@type": "cargo:CodeListElement", + "cargo:code": "DE" + }, + "cargo:subjectCode": { + "@type": "cargo:CodeListElement", + "cargo:code": "ISS" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/CustomsInformation_2.json b/development/API-Security/examples/CustomsInformation_2.json new file mode 100644 index 00000000..0b87ade3 --- /dev/null +++ b/development/API-Security/examples/CustomsInformation_2.json @@ -0,0 +1,19 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#" + }, + "@type": "cargo:CustomsInformation", + "cargo:country": { + "@type": "cargo:CodeListElement", + "cargo:code": "DE" + }, + "cargo:subjectCode": { + "@type": "cargo:CodeListElement", + "cargo:code": "ISS" + }, + "cargo:contentCode": { + "@type": "cargo:CodeListElement", + "cargo:code": "RA" + }, + "cargo:otherCustomsInformation": "01234-01" +} \ No newline at end of file diff --git a/development/API-Security/examples/Error_400.json b/development/API-Security/examples/Error_400.json new file mode 100644 index 00000000..6c7ee6bb --- /dev/null +++ b/development/API-Security/examples/Error_400.json @@ -0,0 +1,16 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#", + "@language": "en-US" + }, + "@type": "api:Error", + "@id": "_:b0", + "api:hasTitle": "Logistics Object URI does not match", + "api:hasErrorDetail": [{ + "@type": "api:ErrorDetail", + "@id": "_:b1", + "api:hasCode": "400", + "api:hasMessage": "LogisticsObject URI in Change does not match requested Logistics Object URI", + "api:hasResource": "http://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }] + } \ No newline at end of file diff --git a/development/API-Security/examples/Error_400_example2.json b/development/API-Security/examples/Error_400_example2.json new file mode 100644 index 00000000..c4fb6f4a --- /dev/null +++ b/development/API-Security/examples/Error_400_example2.json @@ -0,0 +1,16 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#", + "@language": "en-US" + }, + "@type": "api:Error", + "@id": "_:b0", + "api:hasTitle": "Logistics Events can not be updated", + "api:hasErrorDetail": [{ + "@type": "api:ErrorDetail", + "@id": "_:b1", + "api:hasCode": "400", + "api:hasMessage": "Logistics Events of a Logistics Object can not be updated using PATCH", + "api:hasResource": "http://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }] + } \ No newline at end of file diff --git a/development/API-Security/examples/Error_403.json b/development/API-Security/examples/Error_403.json new file mode 100644 index 00000000..c95135a5 --- /dev/null +++ b/development/API-Security/examples/Error_403.json @@ -0,0 +1,16 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#", + "@language": "en-US" + }, + "@type": "api:Error", + "@id": "_:b0", + "api:hasTitle": "Not authorized to retrieve the Logistics Object", + "api:hasErrorDetail": [{ + "@type": "api:ErrorDetail", + "@id": "_:b1", + "api:hasCode": "403", + "api:hasMessage": "Authenticated client could not be found in ACL for the Logistics Object", + "api:hasResource": "http://1r.example.com/logistics-objects/11ccfb7c-3643-41db-8098-740fccd97c93" + }] +} \ No newline at end of file diff --git a/development/API-Security/examples/Error_404.de-DE.json b/development/API-Security/examples/Error_404.de-DE.json new file mode 100644 index 00000000..257b0f63 --- /dev/null +++ b/development/API-Security/examples/Error_404.de-DE.json @@ -0,0 +1,18 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#", + "@language":"de-DE" + }, + "@type":"api:Error", + "@id": "_:b0", + "api:hasTitle":"Logistics Object nicht gefunden", + "api:hasErrorDetail":[ + { + "@type":"api:ErrorDetail", + "@id": "_:b1", + "api:hasCode":"404", + "api:hasMessage":"Es konnte kein Logistics Object mit der angegebenen URI in der Datenbank gefunden werden.", + "api:hasResource":"https://1r.example.com/1a8ded38-1804-467c-a369-81a411416b7c" + } + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/Error_404.json b/development/API-Security/examples/Error_404.json new file mode 100644 index 00000000..85bc34d4 --- /dev/null +++ b/development/API-Security/examples/Error_404.json @@ -0,0 +1,16 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#", + "@language": "en-US" + }, + "@type": "api:Error", + "@id": "_:b0", + "api:hasTitle": "Logistics Object not found", + "api:hasErrorDetail": [{ + "@type": "api:ErrorDetail", + "@id": "_:b1", + "api:hasCode": "404", + "api:hasMessage": "Logistics Object with the specified URI could not be found in the database.", + "api:hasResource": "http://1r.example.com/logistics-objects/1a8ded38-1804-467c-c369-81a411416b7c" + }] +} \ No newline at end of file diff --git a/development/API-Security/examples/LogisticsEvent.json b/development/API-Security/examples/LogisticsEvent.json new file mode 100644 index 00000000..c6ce85f9 --- /dev/null +++ b/development/API-Security/examples/LogisticsEvent.json @@ -0,0 +1,33 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#" + }, + "@type": "cargo:LogisticsEvent", + "cargo:creationDate": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-01T10:38:01.000Z" + }, + "cargo:eventDate": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-01T10:38:01.000Z" + }, + "cargo:eventCode": { + "@type": "cargo:CodeListElement", + "cargo:code": "DEP", + "cargo:codeListName": "Departure" + }, + "cargo:eventName": "Consignment departed on a specific flight", + "cargo:eventTimeType": { + "@id": "cargo:ACTUAL", + "@type": "cargo:EventTimeType" + }, + "cargo:partialEventIndicator": false, + "cargo:eventFor": { + "@type": "cargo:Shipment", + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c" + }, + "cargo:recordingOrganization": { + "@type": "cargo:Company", + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/LogisticsEvent_with_id.json b/development/API-Security/examples/LogisticsEvent_with_id.json new file mode 100644 index 00000000..bb421f0e --- /dev/null +++ b/development/API-Security/examples/LogisticsEvent_with_id.json @@ -0,0 +1,35 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#" + }, + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec527f", + "@type": "cargo:LogisticsEvent", + "cargo:creationDate": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-01T10:38:01.000Z" + }, + "cargo:eventDate": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-01T10:38:01.000Z" + }, + "cargo:eventCode": { + "@id": "interna:f7d53a28-4ca3-4367-8a81-3ac1672a7c8e", + "@type": "cargo:CodeListElement", + "cargo:code": "DEP", + "cargo:codeListName": "Departure" + }, + "cargo:eventName": "Consignment departed on a specific flight", + "cargo:eventTimeType": { + "@id": "cargo:ACTUAL", + "@type": "cargo:EventTimeType" + }, + "cargo:partialEventIndicator": false, + "cargo:eventFor": { + "@type": "cargo:Shipment", + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c" + }, + "cargo:recordingOrganization": { + "@type": "cargo:Company", + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/LogisticsEvents_empty_list.json b/development/API-Security/examples/LogisticsEvents_empty_list.json new file mode 100644 index 00000000..4976d686 --- /dev/null +++ b/development/API-Security/examples/LogisticsEvents_empty_list.json @@ -0,0 +1,9 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@id": "https://1r.example.com/logistics-objects/2a7d1338-9033-13xc-b665-81a411418978/logistics-events", + "@type": "api:Collection", + "api:hasTotalItems": 0 + } \ No newline at end of file diff --git a/development/API-Security/examples/LogisticsEvents_filtered_list.json b/development/API-Security/examples/LogisticsEvents_filtered_list.json new file mode 100644 index 00000000..002ed765 --- /dev/null +++ b/development/API-Security/examples/LogisticsEvents_filtered_list.json @@ -0,0 +1,40 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events", + "@type": "api:Collection", + "api:hasTotalItems": 1, + "api:hasItems": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec527f", + "@type": "cargo:LogisticsEvent", + "cargo:creationDate": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-01T10:38:01.000Z" + }, + "cargo:eventDate": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-01T10:38:01.000Z" + }, + "cargo:eventCode": { + "@type": "cargo:CodeListElement", + "cargo:code": "DEP", + "cargo:codeListName": "Departure" + }, + "cargo:eventName": "Consignment departed on a specific flight", + "cargo:eventTimeType": { + "@id": "cargo:ACTUAL", + "@type": "cargo:EventTimeType" + }, + "cargo:partialEventIndicator": false, + "cargo:eventFor": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c", + "@type": "cargo:Shipment" + }, + "cargo:recordingOrganization": { + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda", + "@type": "cargo:Company" + } + } +} \ No newline at end of file diff --git a/development/API-Security/examples/LogisticsEvents_list.json b/development/API-Security/examples/LogisticsEvents_list.json new file mode 100644 index 00000000..773de1d4 --- /dev/null +++ b/development/API-Security/examples/LogisticsEvents_list.json @@ -0,0 +1,67 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events", + "@type": "api:Collection", + "api:hasTotalItems": 2, + "api:hasItem": [ + { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec527f", + "@type": "cargo:LogisticsEvent", + "cargo:creationDate": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-01T10:38:01.000Z" + }, + "cargo:eventDate": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-01T10:38:01.000Z" + }, + "cargo:eventCode": { + "@type": "cargo:CodeListElement", + "cargo:code": "DEP", + "cargo:codeListName": "Departure" + }, + "cargo:eventName": "Consignment departed on a specific flight", + "cargo:eventTimeType": "cargo:ACTUAL", + "cargo:partialEventIndicator": false, + "cargo:linkedObject": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c", + "@type": "cargo:Shipment" + }, + "cargo:recordingOrganization": { + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda", + "@type": "cargo:Company" + } + }, + { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec528f", + "@type": "cargo:LogisticsEvent", + "cargo:creationDate": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-01T10:38:01.000Z" + }, + "cargo:eventDate": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-01T10:38:01.000Z" + }, + "cargo:eventCode": { + "@type": "cargo:CodeListElement", + "cargo:code": "MAN", + "cargo:codeListName": "Manifested" + }, + "cargo:eventName": "Consignment manifested on a specific flight", + "cargo:eventTimeType": "cargo:ACTUAL", + "cargo:partialEventIndicator": false, + "cargo:eventFor": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c", + "@type": "cargo:Shipment" + }, + "cargo:recordingOrganization": { + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda", + "@type": "cargo:Company" + } + } + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/Notification_example1.json b/development/API-Security/examples/Notification_example1.json new file mode 100644 index 00000000..1dd7ac33 --- /dev/null +++ b/development/API-Security/examples/Notification_example1.json @@ -0,0 +1,19 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Notification", + "api:hasEventType": { + "@id": "api:LOGISTICS_OBJECT_CREATED" + }, + "api:hasLogisticsObject": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }, + "api:hasLogisticsObjectType": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://onerecord.iata.org/ns/cargo#Piece" + }, + "api:isTriggeredBy": { + "@id": "https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Notification_example2.json b/development/API-Security/examples/Notification_example2.json new file mode 100644 index 00000000..c801cb1c --- /dev/null +++ b/development/API-Security/examples/Notification_example2.json @@ -0,0 +1,26 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Notification", + "api:hasEventType": { + "@id": "api:LOGISTICS_OBJECT_CREATED" + }, + "api:hasLogisticsObject": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c", + "@type": "cargo:Shipment", + "cargo:goodsDescription": "Lots of awesome ONE Record information materials", + "cargo:pieces": [{ + "@type": "cargo:Piece", + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }] + }, + "api:hasLogisticsObjectType": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://onerecord.iata.org/ns/cargo#Shipment" + }, + "api:isTriggeredBy": { + "@id": "https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Notification_example3.json b/development/API-Security/examples/Notification_example3.json new file mode 100644 index 00000000..6b872f90 --- /dev/null +++ b/development/API-Security/examples/Notification_example3.json @@ -0,0 +1,22 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Notification", + "api:hasChangedProperty": [ + "https://onerecord.iata.org/ns/cargo#grossWeight" + ], + "api:hasEventType": { + "@id": "api:LOGISTICS_OBJECT_UPDATED" + }, + "api:hasLogisticsObject": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }, + "api:hasLogisticsObjectType": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://onerecord.iata.org/ns/cargo#Piece" + }, + "api:isTriggeredBy": { + "@id": "https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Notification_example4.json b/development/API-Security/examples/Notification_example4.json new file mode 100644 index 00000000..64ad88f8 --- /dev/null +++ b/development/API-Security/examples/Notification_example4.json @@ -0,0 +1,16 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Notification", + "api:hasEventType": { + "@id": "api:LOGISTICS_EVENT_RECEIVED" + }, + "api:hasLogisticsObject": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c" + }, + "api:hasLogisticsObjectType": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://onerecord.iata.org/ns/cargo#Shipment" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Notification_example5.json b/development/API-Security/examples/Notification_example5.json new file mode 100644 index 00000000..a267ebfa --- /dev/null +++ b/development/API-Security/examples/Notification_example5.json @@ -0,0 +1,19 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Notification", + "api:hasEventType": { + "@id": "api:CHANGE_REQUEST_ACCEPTED" + }, + "api:hasLogisticsObject": { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }, + "api:hasLogisticsObjectType": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://onerecord.iata.org/ns/cargo#Shipment" + }, + "api:isTriggeredBy": { + "@id": "https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Piece.json b/development/API-Security/examples/Piece.json new file mode 100644 index 00000000..591ac4ef --- /dev/null +++ b/development/API-Security/examples/Piece.json @@ -0,0 +1,15 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#" + }, + "@type": "cargo:Piece", + "cargo:coload": { + "@type": "http://www.w3.org/2001/XMLSchema#boolean", + "@value": "false" + }, + "cargo:specialHandlingCodes": [ + { + "@id": "https://onerecord.iata.org/ns/coreCodeLists#SpecialHandlingCode_VAL" + } + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/Piece_with_id.json b/development/API-Security/examples/Piece_with_id.json new file mode 100644 index 00000000..8bd79057 --- /dev/null +++ b/development/API-Security/examples/Piece_with_id.json @@ -0,0 +1,14 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "@language": "en-US" + }, + "@type": "cargo:Piece", + "@id": " https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c", + "cargo:coload": false, + "cargo:specialHandlingCodes": [ + { + "@id": "https://onerecord.iata.org/ns/coreCodeLists#SpecialHandlingCode_VAL" + } + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/Piece_with_id.rev3.json b/development/API-Security/examples/Piece_with_id.rev3.json new file mode 100644 index 00000000..aa3d472a --- /dev/null +++ b/development/API-Security/examples/Piece_with_id.rev3.json @@ -0,0 +1,28 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "@language": "en-US" + }, + "@type": "cargo:Piece", + "@id": " https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c?at=20190926T075830Z", + "cargo:coload": { + "@type": "http://www.w3.org/2001/XMLSchema#boolean", + "@value": "true" + }, + "cargo:goodsDescription": "ONE Record Advertisement Materials", + "cargo:specialHandlingCodes": [ + { + "@id": "https://onerecord.iata.org/ns/coreCodeLists#SpecialHandlingCode_VAL" + } + ], + "cargo:customsInformation": [ + { + "@type": "cargo:CustomsInformation", + "@id": "https://1r.example.com/logistics-objects/4d73acf0-3073-4ec9-8aee-b82d64ba3805?at=20190926T075830Z" + }, + { + "@type": "cargo:CustomsInformation", + "@id": "https://1r.example.com/logistics-objects/ba1c2194-2442-400b-b26b-466a01dda8b5?at=20190926T075830Z" + } + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/Sensor.compacted.json b/development/API-Security/examples/Sensor.compacted.json new file mode 100644 index 00000000..776c6292 --- /dev/null +++ b/development/API-Security/examples/Sensor.compacted.json @@ -0,0 +1,13 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#" + }, + "@id": "http://1r.example.com/logistics-objects/11ccfb7c-3643-41db-8098-740fccd97c93", + "@type": "cargo:Sensor", + "cargo:description": "A data logger with a temperature sensor.", + "cargo:name": "TPx14-a", + "cargo:serialNumber": "142NL", + "cargo:sensorType": { + "@id": "https://onerecord.iata.org/ns/cargo#THERMOMETER" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Sensor.expanded.json b/development/API-Security/examples/Sensor.expanded.json new file mode 100644 index 00000000..d3ce3555 --- /dev/null +++ b/development/API-Security/examples/Sensor.expanded.json @@ -0,0 +1,10 @@ +{ + "@type": "https://onerecord.iata.org/ns/cargo#Sensor", + "@id": "http://1r.example.com/logistics-objects/11ccfb7c-3643-41db-8098-740fccd97c93", + "https://onerecord.iata.org/ns/cargo#description": "A data logger with a temperature sensor.", + "https://onerecord.iata.org/ns/cargo#name": "TPx14-a", + "https://onerecord.iata.org/ns/cargo#serialNumber": "142NL", + "https://onerecord.iata.org/ns/cargo#sensorType": { + "@id": "https://onerecord.iata.org/ns/cargo#THERMOMETER" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/ServerInformation.json b/development/API-Security/examples/ServerInformation.json new file mode 100644 index 00000000..2d4e458c --- /dev/null +++ b/development/API-Security/examples/ServerInformation.json @@ -0,0 +1,26 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@id": "https://1r.example.com/", + "@type": "api:ServerInformation", + "api:hasDataHolder": { + "@type": "cargo:Company", + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda" + }, + "api:hasServerEndpoint": "http://1r.example.com", + "api:hasSupportedApiVersion": [ + "2.0.0-dev" + ], + "api:hasSupportedContentType": [ + "application/ld+json" + ], + "api:hasSupportedLanguage": [ + "en-US" + ], + "api:hasSupportedOntology": [ + "https://onerecord.iata.org/ns/cargo/3.0.0", + "https://onerecord.iata.org/ns/api/2.0.0-dev" + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/Shipment_with_Piece.embedded.json b/development/API-Security/examples/Shipment_with_Piece.embedded.json new file mode 100644 index 00000000..2098b31d --- /dev/null +++ b/development/API-Security/examples/Shipment_with_Piece.embedded.json @@ -0,0 +1,22 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#" + }, + "@type": "cargo:Shipment", + "cargo:goodsDescription": "Lots of awesome ONE Record information materials", + "cargo:pieces": [ + { + "@type": "cargo:Piece", + "@id": " https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c", + "cargo:coload": { + "@type": "http://www.w3.org/2001/XMLSchema#boolean", + "@value": "false" + }, + "cargo:specialHandlingCodes": [ + { + "@id": "https://onerecord.iata.org/ns/coreCodeLists#SpecialHandlingCode_VAL" + } + ] + } + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/Shipment_with_Piece.json b/development/API-Security/examples/Shipment_with_Piece.json new file mode 100644 index 00000000..5a39c069 --- /dev/null +++ b/development/API-Security/examples/Shipment_with_Piece.json @@ -0,0 +1,12 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#" + }, + "@type": "cargo:Shipment", + "cargo:goodsDescription": "Lots of awesome ONE Record information materials", + "cargo:pieces": [ + { + "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + } + ] +} \ No newline at end of file diff --git a/development/API-Security/examples/SubscriptionRequest_example.json b/development/API-Security/examples/SubscriptionRequest_example.json new file mode 100644 index 00000000..a8a02919 --- /dev/null +++ b/development/API-Security/examples/SubscriptionRequest_example.json @@ -0,0 +1,43 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:SubscriptionRequest", + "@id": "https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaee", + "api:hasSubscription": { + "@id": "https://1r.example.com/subscriptions/5f1a4869-e324-45b1-9ab0-60271ba54185", + "@type": "api:Subscription", + "api:hasContentType": "application/ld+json", + "api:hasSubscriber": { + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda" + }, + "api:hasTopicType": { + "@id": "api:LOGISTICS_OBJECT_IDENTIFIER" + }, + "api:includeSubscriptionEventType": [ + { + "@id": "api:LOGISTICS_OBJECT_UPDATED" + }, + { + "@id": "api:LOGISTICS_OBJECT_CREATED" + }, + { + "@id": "api:LOGISTICS_EVENT_RECEIVED" + } + ], + "api:hasTopic": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + } + }, + "api:isRequestedBy": { + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda" + }, + "api:hasRequestStatus": { + "@id": "api:REQUEST_PENDING" + }, + "api:isRequestedAt": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-20T10:38:01.000Z" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/SubscriptionRequest_example2.json b/development/API-Security/examples/SubscriptionRequest_example2.json new file mode 100644 index 00000000..7be6a677 --- /dev/null +++ b/development/API-Security/examples/SubscriptionRequest_example2.json @@ -0,0 +1,43 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:SubscriptionRequest", + "@id": "https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed", + "api:hasSubscription": { + "@type": "api:Subscription", + "@id": "internal:84891422-0215-519b-b551-bfb41d0519cd", + "api:hasContentType": "application/ld+json", + "api:hasSubscriber": { + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda" + }, + "api:hasTopicType": { + "@id": "api:LOGISTICS_OBJECT_IDENTIFIER" + }, + "api:includeSubscriptionEventType": [ + { + "@id": "api:LOGISTICS_OBJECT_UPDATED" + }, + { + "@id": "api:LOGISTICS_OBJECT_CREATED" + }, + { + "@id": "api:LOGISTICS_EVENT_RECEIVED" + } + ], + "api:hasTopic": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + } + }, + "api:isRequestedBy": { + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda" + }, + "api:hasRequestStatus": { + "@id": "api:REQUEST_PENDING" + }, + "api:isRequestedAt": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2023-04-20T10:38:01.000Z" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Subscription_example1.json b/development/API-Security/examples/Subscription_example1.json new file mode 100644 index 00000000..0f266a6c --- /dev/null +++ b/development/API-Security/examples/Subscription_example1.json @@ -0,0 +1,29 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@type": "api:Subscription", + "api:hasContentType": "application/ld+json", + "api:hasSubscriber": { + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda" + }, + "api:hasTopicType": { + "@id": "api:LOGISTICS_OBJECT_IDENTIFIER" + }, + "api:includeSubscriptionEventType": [ + { + "@id": "api:LOGISTICS_OBJECT_UPDATED" + }, + { + "@id": "api:LOGISTICS_OBJECT_CREATED" + }, + { + "@id": "api:LOGISTICS_EVENT_RECEIVED" + } + ], + "api:hasTopic": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Subscriptions_example1.json b/development/API-Security/examples/Subscriptions_example1.json new file mode 100644 index 00000000..7176a5a7 --- /dev/null +++ b/development/API-Security/examples/Subscriptions_example1.json @@ -0,0 +1,30 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#" + }, + "@id": "https://1r.example.com/subscriptions/5f1a4869-e324-45b1-9ab0-60271ba54185", + "@type": "api:Subscription", + "api:hasContentType": "application/ld+json", + "api:hasSubscriber": { + "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda" + }, + "api:hasTopicType": { + "@id": "api:LOGISTICS_OBJECT_IDENTIFIER" + }, + "api:includeSubscriptionEventType": [ + { + "@id": "api:LOGISTICS_OBJECT_UPDATED" + }, + { + "@id": "api:LOGISTICS_OBJECT_CREATED" + }, + { + "@id": "api:LOGISTICS_EVENT_RECEIVED" + } + ], + "api:hasTopic": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Subscriptions_example2.json b/development/API-Security/examples/Subscriptions_example2.json new file mode 100644 index 00000000..f64fd190 --- /dev/null +++ b/development/API-Security/examples/Subscriptions_example2.json @@ -0,0 +1,32 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "api": "https://onerecord.iata.org/ns/api#", + "publisher": "https://1r.example.com/", + "subscriber": "https://1r.example.com/" + }, + "@id": "publisher:subscriptions/5f1a4869-e324-45b1-9ab0-60271ba54185", + "@type": "Subscription", + "api:contentType": "application/ld+json", + "api:hasSubscriber": { + "@id": "subscriber:logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda" + }, + "api:includeSubscriptionEventType": [ + { + "@id": "api:LOGISTICS_OBJECT_UPDATED" + }, + { + "@id": "api:LOGISTICS_OBJECT_CREATED" + }, + { + "@id": "api:LOGISTICS_EVENT_RECEIVED" + } + ], + "api:hasTopicType": { + "@id": "api:LOGISTICS_OBJECT_TYPE" + }, + "api:hasTopic": { + "@type": "http://www.w3.org/2001/XMLSchema#anyURI", + "@value": "https://onerecord.iata.org/ns/cargo#Shipment" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/Subscriptions_example3_Error_400.json b/development/API-Security/examples/Subscriptions_example3_Error_400.json new file mode 100644 index 00000000..762c21a6 --- /dev/null +++ b/development/API-Security/examples/Subscriptions_example3_Error_400.json @@ -0,0 +1,15 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#", + "@language": "en-US" + }, + "@type": "api:Error", + "@id": "_:b0", + "api:hasTitle": "Logistics Object Type not supported", + "api:hasErrorDetail": [{ + "@type": "api:ErrorDetail", + "@id": "_:b1", + "api:hasCode": "400", + "api:hasMessage": "Provided Logistics Object Type is not supported" + }] + } \ No newline at end of file diff --git a/development/API-Security/examples/Subscriptions_example3_Error_400_example2.json b/development/API-Security/examples/Subscriptions_example3_Error_400_example2.json new file mode 100644 index 00000000..bf28e3cd --- /dev/null +++ b/development/API-Security/examples/Subscriptions_example3_Error_400_example2.json @@ -0,0 +1,15 @@ +{ + "@context": { + "api": "https://onerecord.iata.org/ns/api#", + "@language": "en-US" + }, + "@type": "api:Error", + "@id": "_:b0", + "api:hasTitle": "Missing query parameter", + "api:hasErrorDetail": [{ + "@type": "api:ErrorDetail", + "@id": "_:b1", + "api:hasCode": "400", + "api:hasMessage": "The required query parameter `topic` is missing." + }] + } \ No newline at end of file diff --git a/development/API-Security/examples/Verification.json b/development/API-Security/examples/Verification.json new file mode 100644 index 00000000..9253446a --- /dev/null +++ b/development/API-Security/examples/Verification.json @@ -0,0 +1,39 @@ +{ + "@context": { + "cargo": "https: //onerecord.iata.org/ns/cargo#", + "api": "https: //onerecord.iata.org/ns/api#", + "xsd": "http://www.w3.org/2001/XMLSchema" + }, + "@type": "api:Verification", + "api:hasLogisticsObject": { + "@id": "https: //1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }, + "api:hasError": [{ + "@type": "api:Error", + "api:hasTitle": "The gross weight is missing", + "api:hasErrorDetail": { + "@type": "api:ErrorDetail", + "api:hasCode": "AWB07", + "api:hasMessage": "weight code", + "api:hasProperty": { + "@value": "https: //onerecord.iata.org/ns/cargo#grossWeight", + "@type": "xsd:anyURI" + } + } + }, { + "@type": "api:Error", + "api:hasTitle": "Empty goodsDescription. Please use goodsDescription to specify the description of the cargo", + "api:hasErrorDetail": { + "@type": "api:ErrorDetail", + "api:hasProperty": { + "@value": "https: //onerecord.iata.org/ns/cargo#goodsDescription", + "@type": "xsd:anyURI" + } + } + } + ], + "api:hasRevision": { + "@type": "http: //www.w3.org/2001/XMLSchema#positiveInteger", + "@value": "1" + } +} \ No newline at end of file diff --git a/development/API-Security/examples/VerificationRequest.json b/development/API-Security/examples/VerificationRequest.json new file mode 100644 index 00000000..c8100022 --- /dev/null +++ b/development/API-Security/examples/VerificationRequest.json @@ -0,0 +1,41 @@ +{ + "@context":{ + "api":"https://onerecord.iata.org/ns/api#" + }, + "@type":"api:VerificationRequest", + "@id":"https://1r.example.com/action-requests/e4cf1ea5-96fc-4025-be21-159b779e3200", + "api:hasVerification":{ + "@type":"api:Verification", + "api:hasLogisticsObject":{ + "@id":"https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c" + }, + "api:hasError":[ + { + "@type":"api:Error", + "api:hasTitle":"Empty goodsDescription. Please use goodsDescription to specify the description of the cargo", + "api:hasErrorDetail":{ + "@type":"api:ErrorDetail", + "api:hasProperty":{ + "@value":"https: //onerecord.iata.org/ns/cargo#goodsDescription", + "@type":"xsd:anyURI" + } + } + } + ], + "api:hasRevision":{ + "@type":"http: //www.w3.org/2001/XMLSchema#positiveInteger", + "@value":"1" + }, + "api:notifyRequestStatusChange":true + }, + "api:isRequestedBy":{ + "@id":"https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda" + }, + "api:hasRequestStatus":{ + "@id":"api:REQUEST_PENDING" + }, + "api:isRequestedAt":{ + "@type":"http://www.w3.org/2001/XMLSchema#dateTime", + "@value":"2024-01-20T10:38:01.000Z" + } + } \ No newline at end of file diff --git a/development/API-Security/glossary/index.html b/development/API-Security/glossary/index.html new file mode 100644 index 00000000..65e3835a --- /dev/null +++ b/development/API-Security/glossary/index.html @@ -0,0 +1,2948 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Glossary - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Glossary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TermDescription
ACLAccess Control List (ACL) is a security mechanism used in computer systems to define permissions and restrictions on who can access specific resources or perform certain actions. It is a list of rules that specifies which users or groups are allowed or denied access to a resource, like a LogisticsObject.
AuthenticationA process that validates the identity of a IoL participant
AuthorizationA process that determines whether a IoL participant is allowed to access a specific Logistics Object
Cargo Operations & Technology Board (COTB)Cargo Operations & Technology Board (COTB) reports to the Cargo Services Conference (CSC) at the International Air Transport Association. The COTB has authority over the ONE Record specifications. COTB decisions are formally endorsed by the CSC.
Hashed Message Authentication Code (HMAC)An authentication method to verify data integrity and authenticity of a message.
Identity & Authentication Provider (IAP)A service that allows ONE Record netwokr participants register and obtain an Public Key encrypted token identify themselves with ONE Record Servers and get access to Logistics Objects
JavaScript Object Notation for Linked Data (JSON-LD)JSON-LD is a lightweight Linked Data format. It is easy for humans to read and write. It is based on the already successful JSON format and provides a way to help JSON data interoperate at Web-scale. JSON-LD is an ideal data format for programming environments, REST Web services, and unstructured databases such as CouchDB and MongoDB.
JSON Web Key (JWK)A JSON object that represents a set of public cryptographic keys. The properties of the object represent properties of the key, including its value. A JWK is used to verify JSON Web Tokens (JWT) issued by the Authorization Server.
JSON Web Key Set (JWKS)A JSON object that contains a set of JWKs. The JSON object MUST have a keys property, which is an array of JWKs.
JSON Web Token (JWT)JSON specification for a token format that includes a user defined payload and the option for encryption.
Linked DataLinked Data empowers people that publish and use information on the Web. It is a way to create a network of standards-based, machine-readable data across Web sites. It allows an application to start at one piece of Linked Data and follow embedded links to other pieces of Linked Data that are hosted on different sites across the Web.
Logistics ObjectA data object that represents a meaningful entity in the logistics business. These may represent documents like air waybills but may also be more granular such as company details or a transport segment description. Logistics Objects are specified in a common data model by IATA and transport and logistics partners.
Open Authorization (OAuth)OAuth (Open Authorization) is an authorization framework that enables a user to grant a third-party application access to their resources on another API or service without giving them their credentials (delegation of access in a network of secure systems). It uses tokens to ensure secure and limited access to user data while protecting their privacy. see https://oauth.net/2/
OpenID Connect (OIDC)OpenID Connect (OIDC) is a widely used authentication protocol that adds an identity layer on top of OAuth 2.0, allowing applications to verify the identities of users and obtain their basic profile information with user consent, enhancing security and user experience in modern web applications.
ONE Record ClientA software program that sends ONE Record API requests to a ONE Record server.
ONE Record ServerA software program that responses to ONE Record API requests from a ONE Record client on behalf of one or more participants in the network
ONE Record Notifications APIA dedicated ONE Record API endpoint for receiving notifications about updates related to logistics objects.
ParticipantServer that access or shares data and that has registered with an Accredited Identity Provider and has possession of a valid certificate to prove this
PublisherThe Party that makes their Logistics Objects available through a ONE Record Server
SubscriberThe Party that subscribes to Logistics Objects in order to receive updates automatically
Uniform Resource Identifier (URI)A Uniform Resource Identifier (URI) is a URL that uniquely identifies a Logistics Object
WACWeb Access Control
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/img/Access-Delegation_overview.png b/development/API-Security/img/Access-Delegation_overview.png new file mode 100644 index 00000000..114463a7 Binary files /dev/null and b/development/API-Security/img/Access-Delegation_overview.png differ diff --git a/development/API-Security/img/IATA_logo.png b/development/API-Security/img/IATA_logo.png new file mode 100644 index 00000000..85651c39 Binary files /dev/null and b/development/API-Security/img/IATA_logo.png differ diff --git a/development/API-Security/img/ONE-Record_API-Logo.png b/development/API-Security/img/ONE-Record_API-Logo.png new file mode 100644 index 00000000..7358d317 Binary files /dev/null and b/development/API-Security/img/ONE-Record_API-Logo.png differ diff --git a/development/API-Security/img/ONE-Record_logo.png b/development/API-Security/img/ONE-Record_logo.png new file mode 100644 index 00000000..53faa35f Binary files /dev/null and b/development/API-Security/img/ONE-Record_logo.png differ diff --git a/development/API-Security/img/Overview_1.png b/development/API-Security/img/Overview_1.png new file mode 100644 index 00000000..dbfbf61b Binary files /dev/null and b/development/API-Security/img/Overview_1.png differ diff --git a/development/API-Security/img/Overview_2.png b/development/API-Security/img/Overview_2.png new file mode 100644 index 00000000..ac8fdb61 Binary files /dev/null and b/development/API-Security/img/Overview_2.png differ diff --git a/development/API-Security/img/PubSub_overview.png b/development/API-Security/img/PubSub_overview.png new file mode 100644 index 00000000..9f82322f Binary files /dev/null and b/development/API-Security/img/PubSub_overview.png differ diff --git a/development/API-Security/img/Security_overview.png b/development/API-Security/img/Security_overview.png new file mode 100644 index 00000000..3c88dd7b Binary files /dev/null and b/development/API-Security/img/Security_overview.png differ diff --git a/development/API-Security/img/favicon.ico b/development/API-Security/img/favicon.ico new file mode 100644 index 00000000..2c6d080b Binary files /dev/null and b/development/API-Security/img/favicon.ico differ diff --git a/development/API-Security/img/logo.png b/development/API-Security/img/logo.png new file mode 100644 index 00000000..02336c3b Binary files /dev/null and b/development/API-Security/img/logo.png differ diff --git a/development/API-Security/img/unit-tests/authSetup.png b/development/API-Security/img/unit-tests/authSetup.png new file mode 100644 index 00000000..25f165ed Binary files /dev/null and b/development/API-Security/img/unit-tests/authSetup.png differ diff --git a/development/API-Security/img/unit-tests/envConfig.png b/development/API-Security/img/unit-tests/envConfig.png new file mode 100644 index 00000000..db7b69d3 Binary files /dev/null and b/development/API-Security/img/unit-tests/envConfig.png differ diff --git a/development/API-Security/img/unit-tests/postmanColl.png b/development/API-Security/img/unit-tests/postmanColl.png new file mode 100644 index 00000000..2cfc5a5f Binary files /dev/null and b/development/API-Security/img/unit-tests/postmanColl.png differ diff --git a/development/API-Security/img/unit-tests/postmanEnv.png b/development/API-Security/img/unit-tests/postmanEnv.png new file mode 100644 index 00000000..75bfbb52 Binary files /dev/null and b/development/API-Security/img/unit-tests/postmanEnv.png differ diff --git a/development/API-Security/img/unit-tests/testCollection.png b/development/API-Security/img/unit-tests/testCollection.png new file mode 100644 index 00000000..899874f0 Binary files /dev/null and b/development/API-Security/img/unit-tests/testCollection.png differ diff --git a/development/API-Security/implementation-guidelines/index.html b/development/API-Security/implementation-guidelines/index.html new file mode 100644 index 00000000..7c7ab9ce --- /dev/null +++ b/development/API-Security/implementation-guidelines/index.html @@ -0,0 +1,3729 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Implementation Guidelines - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Implementation Guidelines

+ +

This section lists general principles and best practices for the implementation of a ONE Record API. +The lists are inspired by other API principles (e.g. SBB, +Zalando, adidas)

+

This section provides guidelines that MUST be followed by an implementer of the ONE Record API to ensure maximum compatibility with other ONE Record servers and clients on the ONE Record network. +These principles MUST be followed in order to be compliant to the ONE Record standard, when implementing and publishing a ONE Record server.

+

This section provides also common knowledge and best practices for the implementation of REST APIs in general and the ONE Record API in particular. +When implementing a ONE Record server and publishing a ONE Record API, it is RECOMMENDED to follow these best practices.

+

URI Structure

+

REST APIs use Uniform Resource Identifiers (URIs) to reference resources. REST API should use URIs that convey the resource model of a REST API to API consumers. When resources are well named, an API is intuitive and easy to use. If they are poorly named, the same API can be difficult to use and understand.

+

The following are some rules and guidelines that SHOULD be followed:

+
    +
  • URIs SHOULD include nouns, not verbs.
  • +
  • Use plural nouns for consistency (no singular nouns)
  • +
  • Use HTTP methods (HTTP/1.1) to operate on resources
  • +
  • Use HTTP response codes to communicate the outcome of operations on resources
  • +
+

For the context of ONE Record, this means:

+ +

Serialization and Data Formats

+

JSON-LD Document Forms

+

Every ONE Record server (and every compliant ONE Record client) MUST support at least the expanded document form, the compacted document form, and the flattened document form (see https://w3c.github.io/json-ld-api/)

+

Furthermore, the following requirements MUST be fulfilled:

+
    +
  • Every JSON-LD document that is returned from a ONE Record API MUST include @id property
  • +
  • A JSON-LD document MAY include an @context that contains namespaces, vocabularies and more that facilitate the remainder of the data elements. In this context, there is a specification of two ontologies: the ONE Record cargo ontology (cargo) and the ONE Record API ontology (api).
  • +
  • A JSON-LD document MUST include an @type property that specifies the type of the data object, i.e. the ONE Record Logistics Object class (https://onerecord.iata.org/ns/cargo#Sensor in the previous example 1 and example 2).
  • +
  • A JSON-LD document MUST include an @language property in the @context property that specifies the language of the returned data object, if the language differs from the default language en-US.
  • +
+

During the implementation phase, it is highly recommended to utilize a JSON-LD library. Below is a compilation of libraries for the most commonly used programming languages:

+ +
+

Note

+

The OpenAPI specification includes only schemas that can be used to generate the expanded JSON-LD document form. +Nevertheless, every ONE Record server and ONE Record client MUST support at least all three JSON-LD document forms.

+
+

Blank Nodes and Embedded Objects

+

Blank node (bNode) is a concept used in the Resource Description Framework (RDF) data model. +They are used to represent resources that do not have a URI (Uniform Resource Identifier) associated with them. +The resource represented by a bNode is also called an anonymous resource.

+

In RDF, a triple consists of a subject, a predicate, and an object. +According to the RDF standard, a bNode can only be used as the subject or object of an RDF triple. +When the object of a triple is a bNode, it means that the resource represented by the object has no URI, but still exists as a node in the RDF graph.

+

bNodes are useful in creating RDF data that represents complex relationships between resources. +bNodes are typically represented in RDF syntax with an identifier starting with an _: (underscore colon) followed by a unique identifier. For example: _:ded2e183. This allows to reference this bNode in several triples of the same RDF graph.

+

In addition to logistics object types, the ONE Record data model ontology also specifies data classes that can be linked to logistics objects but do not have a publicly accessible URI (cf. Logistics Object URI).

+

For the purpose of serialization, it MUST be ensured that those embedded objects also have a unique id that can be referenced in other requests. +In this document, the ids of this embedded objects are called embedded object ids and can differ from Logistics Object URI. +The structure of this embedded object id is up to the implementor of the ONE Record server. +Nevertheless, it is RECOMMENDED to use the following structure for embedded object ids:

+

internal:<uuid5 using the data class name>, e.g. internal:7fc81d1d-6c75-568b-9e47-48c947ed2a07 as a result of uuid5("8efaab7c-cfd5-11ed-9abe-325096b39f47", "value")

+
+

Note

+

It MUST be ensured that these embedded object IDs, similar to logistics object URIs, MUST be unique within the domain of the ONE Record server and MUST NOT change during the lifecycle of an embedded object or its parent objects. Not even if the database is exported as an RDF graph and imported into another RDF store. Otherwise, references to these ids could be corrupted, e.g. in ChangeRequests in the AuditTrail of a logistics object.

+
+

In the context of ONE Record, only logistics objects have public accessible URIs, while other objects, e.g., Value, do not have public accessible URIs but must be linked. +Nevertheless, in ONE Record each node MUST have a unique @id within the document that does not change. +If stored in an RDF database/store, this @id MUST also have a global unique identifier within a graph. +Therefore, in ONE Record, a ONE Record server MUST convert bNodes to named resources with proper URIs (i.e. embedded object ids) if those blank nodes represent entities that have a stable identity and are likely to be references in other datasets, applications, or documents.

+
{
+  "@context": {
+    "cargo": "https://onerecord.iata.org/ns/cargo#"
+  },
+  "@type": "cargo:Piece",
+  "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+  "cargo:grossWeight": {
+    "@type": "cargo:Value",
+    "@id": "internal:7fc81d1d-6c75-568b-9e47-48c947ed2a07",
+    "cargo:value": "20.0",
+    "cargo:unit": "KGM"
+  }
+}
+
+

Explanations:

+ +

This is particularly relevant for the updating of Logistics Objects when +changes to the logistics object affect embedded objects and MUST be identifier during processing using their embedded object id. +Thus, unlike bNodes in RDF syntaxes,embedded objet ids MUST NOT be recreated each time the document is serialized.

+

Content Encoding

+

For maximum compatibility, every request body that is returned from a ONE Record server as well as the HTTP request and response bodies MUST use UTF-8 encoding and MUST consist of valid Unicode strings, i.e. MUST NOT contain non-characters or surrogates.

+

It is RECOMMENDED to implement content compression for the ONE Record API, because it improves the data transfer speed and bandwidth utilization. +A list of supported content compressions MUST be provided to ONE Record clients via the Server Information endpoint.

+

Date and Time

+

Date and time formats MUST follow RFC 3339.

+ + + + + + + + + + + + + + + + + + + + +
TypeDescriptionExample
dateDates used in JSON-LD MUST follow YYYY-MM-DD. Dates used in HTTP query parameters MUST follow: YYYYMMDD2023-03-01
datetimeAlways UTC2023-03-031T10:38:01.000Z
+

Time durations and intervals MUST be conform to ISO 8601. However, whenever possible, explicit expiry dates SHOULD be used in favor of durations and intervals.

+

Airline, Airport, Country, Currency, Language Codes

+

The following standards MUST be used:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDescriptionExample
AirlineIATA Two Letter CodesLH
AirportIATA Three Letter CodesFRA
CountryTwo letter country codes. Follow ISO 3166 alpha-2CH
CurrencyFollow ISO 4217EUR
LanguageFollow IETF BCP 47 language tagen-US
+

Collections

+

Since there MAY be a semantic difference between an empty collection and the absence of a collection property, this difference MUST also be explicitly apparent in the response body. +For example, handlingInstructions = [] (explicit empty list) differs from an unset handlingInstructions property.

+

Null values

+

To safe bandwidth, null valued properties SHOULD not be part of the JSON-LD bodies.

+

Versioning

+

API Versioning

+

API versioning is an important part of any API design, as it addresses the key challenge of maintaining APIs while dealing with changes over time. +Furthermore, it supports the communication between a client and a server by knowing which API version is supported and has to be used for interaction. +It is reasonable to assume that in practice an API will never be feature complete and it is accordingly important to manage these changes. +This is also true for the ONE Record API.

+

Proper API versioning ensures that the ONE Record API specification can evolve without affecting existing applications that implement older ONE Record API versions.

+

Some possible changes to the ONE Record API specification COULD be:

+
    +
  • Request/Response bodies changes due to the constant review of the ONE Record API specifications
  • +
  • ONE Record ontology changes, which reflect on the request/response bodies
  • +
  • Addition of new API endpoint
  • +
  • Removal of an existing API endpoint
  • +
+

Because the URI of a Logistics Object MUST NOT be changed (cf. Logistics Object URI), +an API versioning via URI Path is not possible, e.g. +http://1r.example.com/v1/logistics-objects/e17502db-9b2d-46cc-a06c-efb24aeca49b

+

Instead, API versioning through content negotiation SHOULD be used. +More precisely, the Accept HTTP request header SHOULD be used by a ONE Record client to communicate the expected API version, +so that a ONE Record server can select one of the proposals:

+
Accept: application/ld+json; version=2.0.0-dev
+
+

The ONE Record server MUST inform the ONE Record client about the selected version using the Content-Type response header: +

Content-Type: application/ld+json; version=2.0.0-dev
+

+

If no version is specified in the Accept request header by the ONE Record client, the ONE Record server SHOULD use the highest supported API version (see supportedApiVersion in ServerInformation).

+

Every ONE Record server MUST provide information about the supported API versions. (see Get Server Information)

+

Data Model Versioning

+

With the introduction of ONE Record to the industry and subsequent adoption and dissemination, +it is likely that the ONE Record data model will be modified, refined, and expanded over time. +To support this evolution of the ONE Record data model, appropriate data model versioning is required.

+

Some examples for possible changes to the ONE Record data models (ontology):

+
    +
  • Addition/Removal of classes and/or properties
  • +
  • Updates of cardinality or data types
  • +
  • Updates of comments or labels
  • +
+

The ONE Record Server MUST be independent of the version of the data model and MUST NOT require versioning. +This means that serialization, e.g. using the JSON-LD format, MUST NOT use versioned IRIs, e.g. https://onerecord.iata.org/ns/cargo#Piece for the property "@type" and +https://onerecord.iata.org./ns/cargo#hasGrossWeight for the property name. +The ONE Record Server MUST use the latest cargo Ontology provided by IATA for data validation. Any data class and property defined in the latest Cargo Ontology is valid. +If a ONE Record client submits a request with a request body containing invalid data according to the ontology, the ONE Record server MUST return a 400 Bad Request HTTP error. +For example, if a ONE Record client requests a LogisticsObject created with an ontology that contains IRIs that are not part of the current ontology, the ONE Record server MUST ignore the data classes and properties for serialization.

+

Every ONE Record server MUST provide information about the supported data model / ontologies using hasSupportedOntology (see Get Server Information). +This hasSupportedOntology property MUST be a list of non-versioned IRIs, e.g. https://onerecord.iata.org/ns/cargo

+

Because it might be possible that a ONE Record server caches a copy of the ontologies and is not up-to-date, every ONE Record server MUST provide information about the latest supported data model / ontologies using hasSupportedOntologyVersion (see Get Server Information). +This hasSupportedOntologyVersion property MUST be a list of versioned ontology IRIs which MUST includes the version of the data model, e.g. https://onerecord.iata.org/ns/cargo/3.0.0

+

This supports debugging because the ONE Record client knows if there is a difference in the data model version.

+

Data Versioning

+

Whenever a change request is accepted, the data within a Logistic Object undergoes alterations. Nevertheless, clients might require access to the content of a Logistic Object at a precise moment in time. To address this need, ONE Record servers must incorporate a data versioning system.

+

More information about data versioning can be found in the section Historical Logistics Object

+

Validation

+

ONE Record server must implement two type of validations:

+
    +
  • API validation : the payload and the headers must respect the API specification issues by IATA.
  • +
  • Model validation : during the creation of a new object, the data provided within the request body should be complaint with the ONE Record cargo ontology.
  • +
+

If an API request is malformed, the ONE Record server is expected to respond with an error. +IATA strongly recommends validating each object against the ONE Record cargo ontology before creating it. This validation helps prevent the creation of malformed objects that could potentially hinder interoperability across the ONE Record server network. However, ONE Record servers have the option to accept additional properties for each object.

+

Error Handling

+

When a ONE Record client interacts with a ONE Record server, the ONE record server MUST inform the ONE Record client if the interaction was successful or not. +With this information, the ONE Record client can proceed accordingly.

+

The ONE Record API specifies two classes of errors, namely: (1) as a direct response to a synchronous request, or (2) as an asynchronous response submitted after a submitted request has been processed.

+

This section describes the general Error data type definition used for error handling within the ONE Record API, and examples for both types of errors.

+

Error data model

+

Class diagram:

+
classDiagram   
+    direction LR   
+
+   class Error{        
+        + hasErrorDetail[]: ErrorDetail [1..*]
+        + hasTitle: xsd:string
+    }
+    Error "1" --> "*" ErrorDetail
+
+    class ErrorDetail{
+        + hasCode: xsd:string  [0..1] [0..1]
+        + hasMessage: xsd:string [0..1]
+        + hasProperty: xsd:anyURI [0..1]
+        + hasResource: xsd:anyURI [0..1]
+    }
+

The Error object has the following properties:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDescriptionRequiredClass
hasTitlea short summary of the problem. A short, human-readable summary of the problem that SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization.yesw3c:String
hasErrorDetaildetails of the errornoapi:ErrorDetail
- hasCodea ONE Record application-specific error code expressed as a string value.now3c:String
- hasMessageExplanation specific to this problemnow3c:String
- hasPropertydata element to which the error appliesnow3c:String
- hasResourceURI of the object concernednow3c:String
+

ErrorDetail SHOULD contain a human-readable error message that is expected to be read and understood by users. (see below examples) +For example, set the property hasMessage to "Authenticated client could not be found in ACL for the Logistics Object" instead of just "Error".

+

Synchronous Error Handling

+

For interaction with ONE Record endpoints, the ONE Record API specification defines a an error handling as a direct response to a failed synchronous request. +In this scenario, the property hasCode MUST be same as the HTTP status code (see below).

+

Error HTTP Status Codes

+

The following table contains a non-exhaustive list of HTTP error statuses that require an Error response:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
400 Bad requestError
401 Not authenticated or expired tokenError
403 Not authorized to perform actionError
404 Not FoundError
405 Method not allowedError
415 Unsupported content typeError
500 Internal Server ErrorError
+

There is a list of non-exhaustive JSON-LD syntax error types (relative to 400 Bad Request error family) on the official JSON-LD API specifications website.

+

Example

+

A ONE Record client requests a Logistics Object without having sufficient access and a ONE Record server responses with a HTTP error code: 403 Forbidden. The http response body contains the Error including the error code.

+

Response to a failed synchronous API GET Request:

+

HTTP/1.1 403 Forbidden
+Content-Language: en-US
+Content-Type: application/ld+json
+
+{
+   "@context": {
+      "api": "https://onerecord.iata.org/ns/api#",
+      "@language": "en-US"
+   },
+   "@type": "api:Error",
+   "@id": "_:b0",
+   "api:hasTitle": "Not authorized to retrieve the Logistics Object",
+   "api:hasErrorDetail": [{
+      "@type": "api:ErrorDetail",
+      "@id": "_:b1",
+      "api:hasCode": "403",
+      "api:hasMessage": "Authenticated client could not be found in ACL for the Logistics Object",
+      "api:hasResource": "http://1r.example.com/logistics-objects/11ccfb7c-3643-41db-8098-740fccd97c93"
+   }]
+}
+
+(Error_403.json)

+

Asynchronous Error Handling

+

ONE Record utilizes a standardized action request pattern to facilitate one organization requesting an action that requires approval from another organization. This process often involves asynchronous error handling to manage potential issues that arise during the approval and execution of the action requests.

+

When approving action requests, the responsible entity must evaluate security and business logic, which may lead to errors. If such errors occur, the entity should mark the action request as failed and provide a detailed description of the error in the relevant section of the action request. In the error definition, the entity can utilize Cargo-XML error codes.

+

Example

+

A ONE Record client submits a ChangeRequest referencing an outdated version of a Logistics Object. Upon processing the ChangeRequest, the ONE Record server identifies the error, logs it in the ChangeRequest, and marks it as failed. The server then sends a notification of the error to the ONE Record client.

+

Because asynchronous errors are always part of another data object, below is an example of a ChangeRequest that contains errors. +Note that the errors property is a list and there can be multiple errors.

+

{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#",
+        "@language": "en-US"
+    },
+    "@type": "api:ChangeRequest",
+    "@id": "https://1r.example.com/action-requests/f74ae62b-0af3-52ca-8a83-fa756fc3fab9",
+    "api#hasError": [{
+        "@type": "api:Error",
+        "@id": "https://1r.example.com/action-requests/f74ae62b-0af3-52ca-8a83-fa756fc3fab9/errors/0da27144-fa78-5201-be5f-0f9ab3d3b3d8",
+        "api:hasTitle": "Conflict with Logistics Object revision number",
+        "api:hasErrorDetail": [{
+            "@type": "api:ErrorDetail",
+            "@id": "_:b1",            
+            "api:hasCode": "409",
+            "api:hasMessage": "The provided revision number is invalid or lower than the current Logistics Object revision",
+            "api:hasResource": "http://1r.example.com/logistics-objects/11ccfb7c-3643-41db-8098-740fccd97c93"
+        }]
+    }]
+}
+
+(The properties of the actual ChangeRequest are omitted for clarity. See here for complete examples.)

+

Business Data Error handling

+

The previous two sections explain how to handle errors in synchronous and asynchronous processes. However, when obtaining a logistics object, a third party might discover an issue with the provided information.

+

For such situations, ONE Record specifies two specific action requests to signal the error: Change Request and Verification Request.

+

If a third party identifies a discrepancy between a value in the logistics object and the actual measure (e.g., the weight of a shipment), they can create a Change Request to provide the correct value. The holder of the object can then accept or reject the change.

+

On the other hand, if the third party detects an issue in a logistics object, such as a typo in a code or missing information, they can use the Verification Request to notify the holder of the logistics object. With a Verification Request, the third party is not required to propose a new value but simply to signal the issue.

+

Internationalization (i18n)

+

Internationalization (abbreviated i18n) enables ONE Record clients and ONE Record servers to request and return data in a given language.

+

This i18n support is helpful exchanging of data using different languages. For example, if a shipper provides information only in Chinese characters, an English-speaking organization may not be able to use this information without preprocessing. Therefore, it is necessary to specify the language in which the data will be transmitted and SHOULD be returned.

+

Every ONE Record server MUST provided the supported languages in the ServerInformation using the hasSupportedLanguages property.

+

To ensure global interoperability, each ONE Record server MUST implement American English as a supported language (i.e. en-US). +The request HTTP header Accept-Language SHOULD be used by the ONE Record client to specify the language of the response.

+

In order to retrieve data in a desired language, the following HTTP header parameter MUST be present in the request:

+ + + + + + + + + + + + + + + +
Request HeaderDescriptionExamples
Accept-LanguageStandard language tag. If no language is set, the ONE Record server MUST assume that the default language is requested, i.e. American English (en-US). See https://datatracker.ietf.org/doc/html/rfc5646
  • en-US
  • de-DE
  • zh-HK
+

The following HTTP headers parameters MUST be present for every response:

+ + + + + + + + + + + + + + + +
Response HeaderDescriptionExample
Content-LanguageDescribes the language(s) for which the requested resource is intended.en-US
+

Furthermore, in JSON-LD, the language can be set in the context using the @language key whose value must be a string representing a BCP47 region language tag.

+

Example of a translated error

+

Request:

+
GET /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Accept-Language: de-DE
+Accept: application/ld+json
+
+

Response:

+

HTTP/1.1 404 Not Found
+Content-Language: de-DE
+Content-Type: application/ld+json
+
+{   
+   "@context": {
+     "api": "https://onerecord.iata.org/ns/api#",
+     "@language":"de-DE"
+   },
+   "@type":"api:Error",
+   "@id": "_:b0",
+   "api:hasTitle":"Logistics Object nicht gefunden",
+   "api:hasErrorDetail":[
+      {
+         "@type":"api:ErrorDetail",        
+         "@id": "_:b1", 
+         "api:hasCode":"404",
+         "api:hasMessage":"Es konnte kein Logistics Object mit der angegebenen URI in der Datenbank gefunden werden.",
+         "api:hasResource":"https://1r.example.com/1a8ded38-1804-467c-a369-81a411416b7c"
+      }
+   ]
+}
+
+(Error_404.de-DE.json)

+

Caching

+

Caching MAY be useful to inform a ONE Record client that a response can be cached locally and does not need to be requested again before a Time to Live (TTL) expires. Subscription information are an example.

+

It is RECOMMENDED to provide caching information via response HTTP header Cache-Control. +For example, setting the "Cache-Control: max-age=86400" header in a HTTP response to indicate that the requested resource has a time to live of 86400 seconds (= 24 hours).

+

Decisions about architecture, technology as well as its implementation are up to the implementor of the ONE Record server.

+

Monitoring

+

In general, API monitoring helps to detect failures and performance issues with API calls and gain insights into API usage. +In particular, it MAY also help identify ONE Record clients that interact with functions and data model components that are marked as deprecated.

+

Decisions about architecture, technology as well as its implementation are up to the implementor of the ONE Record server.

+

API Documentation

+

It is RECOMMENDED to provide a technical documentation of the implemented and released API endpoints. One way is to publish an OpenAPI specification and grant partners access to it. See ONE-Record-API-OpenAPI.yaml as an example.

+

Security

+

The ONE Record API specification prescribes only the minimum security requirements that enable secure communication in the IONE Record network. +This involves securing the communication channel, authentication (verifying the identity of a requestor) and authorization (checking the access right of the requestor). +More information on authentication and authorization in the ONE Record context is described in the Security section.

+

Although ONE Record is intended for use in a secured environment only, this cannot be guaranteed. Therefore, it is RECOMMENDED to follow best practices for Web API security. For example, topics include rate limiting/throttling, web application firewalls (WAF), security scanning, data exposure in HTTP headers, logging, etc.

+

Asynchronous Job Processing

+

To enable scalability of the ONE Record server, it is RECOMMENDED to use job queue systems to process asynchronous workloads that result from incoming ChangeRequests, DelegationRequests, or SubscriptionRequests. +For example, it can be useful to decouple Notification queuing and actual sending of Notifications.

+

Decisions about architecture, technology as well as its implementation are up to the implementor of the ONE Record server.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/index.html b/development/API-Security/index.html new file mode 100644 index 00000000..f9a4e9ff --- /dev/null +++ b/development/API-Security/index.html @@ -0,0 +1,2956 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Introduction - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Introduction

+ +

+

Purpose

+

This ONE Record API specification is part of the ONE Record standard. +It defines a standard, programming language-agnostic interface for the interaction with the ONE Record Web API. +This ONE Record API specification supports the effective implementation of ONE Record compliant APIs. +It aims to provide detailed realistic use cases and examples for the various API features while maintaining the necessary technical depth for implementers.

+

Prerequisites

+

It is assumed that the reader is familiar with the ONE Record data model, REST APIs (also known as RESTful APIs), and JSON-LD.

+

Supporting Documents

+
    +
  • Changelog contains a list of all notable changes for each version of the ONE Record API specification.
  • +
  • ONE Record API ontology provides the vocabulary and data classes for the data model used in the ONE Record API.
  • +
  • Tabular overview of ONE Record API ontology is a tabular representation of the ONE Record API ontology and describes the ONE Record API data classes, their properties as attributes, descriptions and valid values.
  • +
  • ONE Record API class diagram is a visual representation of the ONE Record API ontology and describes the ONE Record API data classes, their properties as attributes, and the relationship that can exist between the classes.
  • +
  • OpenAPI specification describes the prescribed API endpoint structure of a ONE Record server implementation.
  • +
  • Postman collection contains demo HTTP requests that demonstrate how to interact with the various ONE Record API endpoints and can be used to playback the examples provided in this document.
  • +
+

Document Version

+

Version: 2.0.0

+

Status: Endorsed by COTB on December 2023

+
+

Note

+

Discussion on this specification is highly encouraged and please contact onerecord@iata.org with any comments or suggested improvements.
+The version of the ONE Record API specification is incremented when the API specifications are endorsed by the IATA Cargo Operations Technology Board (COTB).

+
+

Dependencies

+

The ontology of the ONE Record API uses data classes defined in the ONE Record cargo ontology. +Therefore, this ONE Record API version 2.0.0 requires the ONE Record cargo ontology 3.0.0 or later.

+

Conventions

+

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.

+

License

+

This document is licensed under MIT license (see License for details).

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/license/index.html b/development/API-Security/license/index.html new file mode 100644 index 00000000..1dfb3a16 --- /dev/null +++ b/development/API-Security/license/index.html @@ -0,0 +1,2867 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + License - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

License

+ +

MIT License

+

Copyright (c) 2024 IATA-Cargo

+

Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:

+

The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/logistics-events/index.html b/development/API-Security/logistics-events/index.html new file mode 100644 index 00000000..9932baf6 --- /dev/null +++ b/development/API-Security/logistics-events/index.html @@ -0,0 +1,4143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Logistics Events - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Logistics Events

+ +

Logistics events are events related to the management and execution of transport and logistics services and document the occurrence of actions, discrepancies, or status changes. These events can be either internal or external to an organization and can include transportation, warehousing, inventory management, supply chain optimization, and other related activities. Examples of logistics events include the departure of an aircraft or the acceptance of shipments in a warehouse.

+

Guidelines for Logistics Events in ONE Record:

+
    +
  • Logistics Events are immutable. They MUST NOT be changed after creation.
  • +
  • List of logistics Events attached to Logistics Objects are event stores. This event store is an append-only log. Events CAN be added by using the HTTP POST method (see Create a Logistics Event) but MUST NOT be changed or deleted.
  • +
  • Logistics Events are neither logistics objects nor embedded object
  • +
  • Every Logistics Events MUST an URI, that follows the following structure:
      +
    • {{baseURL}}/logistics-object/{{logisticsObjectId}}/logistics-events/{{logisticsEventId}} where {{logisticsEventId}} is an identifier which can be globally unique and must be unique in the context of its parent Logistics Object
    • +
    +
  • +
  • A Logistics Event MUST be linked to exactly one Logistics Object
  • +
  • Every Logistics Event MUST have a property eventDate (xsd:dateTime)
  • +
+

Logistics Events URI

+

Each Logistics Event MUST have globally unique IRI and MUST have a unique identifier in the context of its parent Logistics Object. The implementor can use the same algorithm as the Logistics Object ids. For more information check the section Logistics Objects URI

+

Create a Logistics Event

+

Logistics Events (also known as status updates) in ONE Record can be added to any Logistics Objects +by sending a HTTP POST request containing a LogisticsEvent object to the /logistics-events endpoint of a LogisticsObject.

+

As for all API interactions, the ONE Record client must be authenticated and have the access rights to perform this action.

+

As Logistics Events MUST be associated with a specific Logistics Object, creating Logistics Events requires the existence of a Logistics Object.

+

Endpoint

+
 POST {{baseURL}}/logistics-objects/{{logisticsObjectId}}/logistics-events
+
+

Request

+

The following HTTP header parameters MUST be present in the request:

+ + + + + + + + + + + + + + + + + + + + +
Request HeaderDescriptionExamples
AcceptThe content type that the ONE Record client wants the HTTP response to be formatted in.application/ld+json
Content-TypeThe content type that is contained with the HTTP body. Valid content types.application/ld+json
+

The HTTP request body must contain a valid LogisticsEvent in the format as specified by the Content-Type in the header.

+

The LogisticsEvent is a data class of the ONE Record cargo ontology. +The properties and relationships to other data classes are visualized in the following class diagram.

+
classDiagram   
+    direction LR   
+
+    class LogisticsObject{                
+    }
+
+    class Actor{        
+    }  
+
+    class Organization{            
+    }  
+
+    class Location{        
+    }  
+
+    class ExternalReference{        
+    }  
+
+    class EventTimeType{   
+        <<Enumeration>>
+        ACTUAL
+        ESTIMATED
+        EXPECTED
+        PLANNED
+        REQUESTED   
+    }  
+
+    class LogisticsEvent{
+        + partialEventIndicator: xsd:boolean [0..1]
+        + creationDate: xsd:dateTime [0..1]
+        + eventCode: xsd:string [0..1]
+        + eventDate: xsd:dateTime [0..1]
+        + eventName: xsd:string [0..1]
+        + eventTimeType: EventTimeType [0..1]
+        + externalReferences: ExternalReference 
+        + eventFor: LogisticsObject [0..1]
+        + eventLocation: Location [0..1]
+        + recordingOrganization: Organization [0..1]
+        + recordingActor: Actor [0..1]
+
+    }
+    LogisticsEvent "1" --> "0..*" ExternalReference
+    LogisticsEvent "1" --> "0..1" LogisticsObject
+    LogisticsEvent "1" --> "0..1" Location
+    LogisticsEvent "1" --> "0..1" Organization
+    LogisticsEvent "1" --> "0..1" Actor
+    LogisticsEvent "1" --> "0..1" EventTimeType
+

Response

+

One of the following HTTP response codes MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
201Logistics Event has been createdNo content
400Invalid Logistics EventError
401Not authenticated, invalid or expired tokenError
403Not authorized to perform actionError
404Logistics Object not foundError
415Unsupported Content TypeError
500 Internal Server ErrorError
+

A successful request MUST return a HTTP/1.1 201 Created status code and the following HTTP headers parameters MUST be present in the response:

+

The following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + +
Response HeaderDescriptionExamples
LocationThe URI of the newly created Logistics Eventhttps://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec527f
TypeThe type of the newly created Logistics Object as a URIhttps://onerecord.iata.org/ns/cargo#LogisticsEvent
+

Security

+

To engage with the "Create a Logistics Event" endpoint, a client needs proper authentication and authorization to access the designated resource. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status. Conversely, for requests without proper authorization, a 403 "Not Authorized" response should be provided.

+

The implementor has the option to allow all authenticated users the capability to create a Logistics Event. This implies that there would be no access control enforced for this particular endpoint.

+

Example A1

+

Request:

+
POST /logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events HTTP/1.1
+Host: 1r.example.com
+
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#"
+    },
+    "@type": "cargo:LogisticsEvent",
+    "cargo:creationDate": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-01T10:38:01.000Z"
+    },
+    "cargo:eventDate": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-01T10:38:01.000Z"
+    },
+    "cargo:eventCode": {
+        "@type": "cargo:CodeListElement",
+        "cargo:code": "DEP",
+        "cargo:codeListName": "Departure"
+    },
+    "cargo:eventName": "Consignment departed on a specific flight",
+    "cargo:eventTimeType": {
+        "@id": "cargo:ACTUAL",
+        "@type": "cargo:EventTimeType"
+    },
+    "cargo:partialEventIndicator": false,
+    "cargo:eventFor": {
+        "@type": "cargo:Shipment",
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c"
+    },
+    "cargo:recordingOrganization": {
+        "@type": "cargo:Company",
+        "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+    }
+}
+
+

(LogisticsEvent.json)

+

Response:

+
HTTP/1.1 201 Created
+Location: https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec527f
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/cargo#LogisticsEvent
+
+

Example A2

+

In the following example, a ONE Record client tries to submit a Logistics Event to a non existing Logistics Object.

+

Request:

+
POST /logistics-objects/1a8ded38-1804-467c-c369-81a411416b7c/logistics-events HTTP/1.1
+Host: 1r.example.com
+
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#"
+    },
+    "@type": "cargo:LogisticsEvent",
+    "cargo:creationDate": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-01T10:38:01.000Z"
+    },
+    "cargo:eventDate": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-01T10:38:01.000Z"
+    },
+    "cargo:eventCode": {
+        "@type": "cargo:CodeListElement",
+        "cargo:code": "DEP",
+        "cargo:codeListName": "Departure"
+    },
+    "cargo:eventName": "Consignment departed on a specific flight",
+    "cargo:eventTimeType": {
+        "@id": "cargo:ACTUAL",
+        "@type": "cargo:EventTimeType"
+    },
+    "cargo:partialEventIndicator": false,
+    "cargo:eventFor": {
+        "@type": "cargo:Shipment",
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c"
+    },
+    "cargo:recordingOrganization": {
+        "@type": "cargo:Company",
+        "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+    }
+}
+
+

(LogisticsEvent.json)

+

Response:

+
HTTP/1.1 404 Not Found
+Content-Language: en-US
+Content-Type: application/ld+json; version=2.0.0-dev
+
+{
+   "@context": {
+      "api": "https://onerecord.iata.org/ns/api#",
+      "@language": "en-US"
+   },
+   "@type": "api:Error",
+   "@id": "_:b0",
+   "api:hasTitle": "Logistics Object not found",
+   "api:hasErrorDetail": [{
+      "@type": "api:ErrorDetail",
+      "@id": "_:b1",
+      "api:hasCode": "404",
+      "api:hasMessage": "Logistics Object with the specified URI could not be found in the database.",
+      "api:hasResource": "http://1r.example.com/logistics-objects/1a8ded38-1804-467c-c369-81a411416b7c"
+   }]
+}
+
+

(Error_404.json)

+

Get a Logistics Event

+

Each Logistics Event MUST be accessible via its Logistics Event URI using the HTTP GET method. +This enables the Holder of the Logistics Object to manage access on the level of individual Logistics Event (see Access Control page for more information). +If the requester is authorized to access this Logistics Event then the response body MUST include the requested Logistics Event.

+

Endpoint

+
 GET {{baseURL}}/logistics-objects/{{logisticsObjectId}}/logistics-events/{{logisticsEventId}}
+
+

Request

+

The following HTTP header MUST be present in the request:

+ + + + + + + + + + + + + + + +
HeaderDescriptionExamples
AcceptThe content type that a ONE Record client wants the HTTP response to be formatted in. This SHOULD include the version of the ONE Record API, otherwise the latest supported ONE Record API MAY be applied.
  • application/ld+json
  • application/ld+json; version=2.0.0-dev
  • application/ld+json; version=1.2
+

Response

+

A successful request MUST return a HTTP/1.1 200 OK status code. +The body of the response includes the Logistics Object in the RDF serialization format that has been requested in the Accept header of the request.

+

The following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
Content-LanguageDescribes the language(s) for which the requested resource is intended.en-US
Last-ModifiedDate and time when the Logistics Object was last time changed. See https://developer.mozilla.org/en-US/docs/Web/Tue, 21 Feb 2023 07:28:00 GMT
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
200The request to retrieve the Logistics Event has been successfulLogistics Event
301The URI of the Logistics Object has permanently changed.No response body
302The URI of the Logistics Object has temporarily moved.No response body
401Not authenticatedError
403Not authorized to retrieve the Logistics ObjectError
404Logistics Object or Logistics Event not foundError
500Internal Server ErrorError
+

Security

+

To engage with the "Get a Logistics Event" endpoint, a client needs proper authentication and authorization to access the designated resource. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status. Conversely, for requests without proper authorization, a 403 "Not Authorized" response should be provided.

+

It's crucial to emphasize that the authorization for logistics events can differ from that of the logistics objects they are associated with. A client might possess access to a logistics event while not having authorization for the corresponding logistics object.

+

Example B1

+

Request:

+
GET /logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec527f HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+
+

Response:

+
HTTP/1.1 200 OK
+Content-Type: application/ld+json
+Content-Language: en-US
+Location: https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec527f
+Type: https://onerecord.iata.org/ns/cargo#LogisticsEvent
+Last-Modified: Tue, 19 Apr 2023 07:28:00 GMT
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#"
+    },
+    "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec527f",
+    "@type": "cargo:LogisticsEvent",
+    "cargo:creationDate": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-01T10:38:01.000Z"
+    },
+    "cargo:eventDate": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-01T10:38:01.000Z"
+    },
+    "cargo:eventCode": {
+        "@id": "interna:f7d53a28-4ca3-4367-8a81-3ac1672a7c8e",
+        "@type": "cargo:CodeListElement",
+        "cargo:code": "DEP",
+        "cargo:codeListName": "Departure"
+    },
+    "cargo:eventName": "Consignment departed on a specific flight",
+    "cargo:eventTimeType": {
+        "@id": "cargo:ACTUAL",
+        "@type": "cargo:EventTimeType"
+    },
+    "cargo:partialEventIndicator": false,
+    "cargo:eventFor": {
+        "@type": "cargo:Shipment",
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c"
+    },
+    "cargo:recordingOrganization": {
+        "@type": "cargo:Company",
+        "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+    }
+}
+
+

(LogisticsEvent_with_id.json)

+

Example B2

+

In the following example, a ONE Record client tries to get a non-existing Logistics Event

+

Request:

+
GET /logistics-objects/1a8ded38-1804-467c-c369-81a411416b7c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec527f HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+
+

Response:

+
HTTP/1.1 404 Not Found
+Content-Language: en-US
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/api/2.0.0dev#Error
+
+{
+   "@context": {
+      "api": "https://onerecord.iata.org/ns/api#",
+      "@language": "en-US"
+   },
+   "@type": "api:Error",
+   "@id": "_:b0",
+   "api:hasTitle": "Logistics Object not found",
+   "api:hasErrorDetail": [{
+      "@type": "api:ErrorDetail",
+      "@id": "_:b1",
+      "api:hasCode": "404",
+      "api:hasMessage": "Logistics Object with the specified URI could not be found in the database.",
+      "api:hasResource": "http://1r.example.com/logistics-objects/1a8ded38-1804-467c-c369-81a411416b7c"
+   }]
+}
+
+

(Error_404.json)

+

Get Logistic Events of a Logistics Object

+

Logistics events that are linked to a logistics object CAN be retrieved by doing a HTTP GET request to the the /logistics-events endpoint of a logistics object. +In addition, only a subset of all linked logistics events can optionally be retrieved by setting filter parameters.

+

Endpoint

+
 GET {{baseURL}}/logistics-objects/{{logisticsObjectId}}/logistics-events/
+
+

Request

+

The following HTTP header parameters MUST be present in the request:

+ + + + + + + + + + + + + + + + + + + + +
Request HeaderDescriptionExamples
AcceptThe content type that the ONE Record client wants the HTTP response to be formatted in.application/ld+json
Content-TypeThe content type that is contained with the HTTP body. Valid content types.application/ld+json
+

The following HTTP query parameters MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Query parameterDescriptionValid values
eventType (optional)Optional parameter that can be used to filter the logistics events by event type, the values MUST be comma separated
  • FOH
  • DEP
created_after (optional)Optional parameter that can be used to filter the logistics events
  • 20190926T075830Z
created_before (optional)Optional parameter that can be used to filter the the logistics events
  • 20190926T075830Z
occurred_after (optional)Optional parameter that can be used to filter the the logistics events
  • 20190926T075830Z
occurred_before (optional)Optional parameter that can be used to filter the the logistics events
  • 20190926T075830Z
+

Response

+

A successful request MUST return a HTTP/1.1 200 OK status code. +The response body is formatted accordingly to the format that has been requested in the Accept request header. +The body of the response is composed by a Collection object containing all LogisticsEvent matching the specified query parameters.

+
classDiagram   
+    direction LR   
+
+    class Collection{    
+        + hasItem: LogisticsEvents [0..*]
+        + hasTotalItems: xsd:nonNegativeInteger [0..1]    
+    }
+
+    class LogisticsEvent{
+
+    }
+    Collection "1" --> "0..*" LogisticsEvent
+
+

The ONE Record API employs the Collection class to return an array of objects. This class encompasses two properties:

+ +

In this particular case, @id property in the response body MUST be equal to the Endpoint defined in the Endpoint section (i.e.: https://1r.example.com/logistics-objects/2a7d1338-9033-13xc-b665-81a411418978/logistics-events).

+
+

Note

+

The ONE Record standard fully adopts the JSON-LD specification, and as a result, the presence of the api:hasItem property of Collection is contingent on the number of Logistics Events returned byt the specified query. Specifically:

+
    +
  • If the specified query returns zero Logistics Events, api:hasItem may not appear in the JSON, and api:hasTotalItem must be 0.
  • +
  • When the specified query returns exactly one Logistics Event, api:hasItem will directly represent that Logistics Event, and api:hasTotalItem must be 1.
  • +
  • In cases where the specified query returns multiple Logistics Events, api:hasItem will be an array containing those Logistics Events, and api:hasTotalItem must be equal to the number of Logistics Events retrieved by the specified query.
  • +
+

During the implementation phase, it is highly recommended to utilize a JSON-LD library for parsing responses. +To discover JSON-LD libraries for various programming languages, consult the implementation guidelines.

+
+

The following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
Content-LanguageDescribes the language(s) for which the requested resource is intended.en-US
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
200The request to retrieve all Logistics Events has been successfulList of Logistics Event
301The URI of the Logistics Object has permanently changed.No response body
302The URI of the Logistics Object has temporarily moved.No response body
401Not authenticatedError
403Not authorized to retrieve the Logistics ObjectError
404Logistics Object not foundError
500Internal Server ErrorError
+

Security

+

To engage with the "Get Logistics Events of a Logistics Object" endpoint, a client needs proper authentication and authorization to access the designated resource. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status. Conversely, for requests without proper authorization, a 403 "Not Authorized" response should be provided.

+

The authorization to access the logistics events should be derived from the logistics objects. However, the implementor of a ONE Record server can decide to separate the control access between a logistics object and its logistics events.

+

Example C1

+

Request:

+
GET /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c/logistics-events HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+
+

Response:

+

HTTP/1.1 200 OK
+Content-Type: application/ld+json; version=2.0.0-dev
+Content-Language: en-US
+
+{
+  "@context": {
+    "cargo": "https://onerecord.iata.org/ns/cargo#",
+    "api": "https://onerecord.iata.org/ns/api#"
+  },
+  "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events",
+  "@type": "api:Collection",
+  "api:hasTotalItems": 2,
+  "api:hasItem": [
+    {
+      "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec527f",
+      "@type": "cargo:LogisticsEvent",
+      "cargo:creationDate": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-01T10:38:01.000Z"
+      },
+      "cargo:eventDate": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-01T10:38:01.000Z"
+      },
+      "cargo:eventCode": {
+        "@type": "cargo:CodeListElement",
+        "cargo:code": "DEP",
+        "cargo:codeListName": "Departure"
+    },
+      "cargo:eventName": "Consignment departed on a specific flight",
+      "cargo:eventTimeType": "cargo:ACTUAL",
+      "cargo:partialEventIndicator": false,
+      "cargo:linkedObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c",
+        "@type": "cargo:Shipment"
+      },
+      "cargo:recordingOrganization": {
+        "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda",
+        "@type": "cargo:Company"
+      }
+    },
+    {
+      "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec528f",
+      "@type": "cargo:LogisticsEvent",
+      "cargo:creationDate": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-01T10:38:01.000Z"
+      },
+      "cargo:eventDate": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-01T10:38:01.000Z"
+      },
+      "cargo:eventCode": {
+        "@type": "cargo:CodeListElement",
+        "cargo:code": "MAN",
+        "cargo:codeListName": "Manifested"
+      },
+      "cargo:eventName": "Consignment manifested on a specific flight",
+      "cargo:eventTimeType": "cargo:ACTUAL",
+      "cargo:partialEventIndicator": false,
+      "cargo:eventFor": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c",
+        "@type": "cargo:Shipment"
+      },
+      "cargo:recordingOrganization": {
+        "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda",
+        "@type": "cargo:Company"
+      }
+    }
+  ]
+}
+
+(LogisticsEvents_list.json)

+

Example C2

+

Get a filtered list of events. Filtered by eventType that needs to be DEP.

+

Request:

+
GET /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c/logistics-events?eventType=DEP HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+
+

Response:

+

HTTP/1.1 200 OK
+Content-Type: application/ld+json; version=2.0.0-dev
+Content-Language: en-US
+
+{
+  "@context": {
+    "cargo": "https://onerecord.iata.org/ns/cargo#",
+    "api": "https://onerecord.iata.org/ns/api#"
+  },
+  "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events",
+  "@type": "api:Collection",
+  "api:hasTotalItems": 1,
+  "api:hasItems": {
+    "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c/logistics-events/afb4b8cf-288a-459c-97fd-ccd538ec527f",
+    "@type": "cargo:LogisticsEvent",
+    "cargo:creationDate": {
+      "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+      "@value": "2023-04-01T10:38:01.000Z"
+    },
+    "cargo:eventDate": {
+      "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+      "@value": "2023-04-01T10:38:01.000Z"
+    },
+    "cargo:eventCode": {
+      "@type": "cargo:CodeListElement",
+      "cargo:code": "DEP",
+      "cargo:codeListName": "Departure"
+    },
+    "cargo:eventName": "Consignment departed on a specific flight",
+    "cargo:eventTimeType": {
+      "@id": "cargo:ACTUAL",
+      "@type": "cargo:EventTimeType"
+    },
+    "cargo:partialEventIndicator": false,
+    "cargo:eventFor": {
+      "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c",
+      "@type": "cargo:Shipment"
+    },
+    "cargo:recordingOrganization": {
+      "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda",
+      "@type": "cargo:Company"
+    }
+  }
+}
+
+(LogisticsEvents_filtered_list.json)

+

Example C3

+

Get an empty list of events.

+

Request:

+
GET /logistics-objects/2a7d1338-9033-13xc-b665-81a411418978/logistics-events HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+
+

Response:

+

HTTP/1.1 200 OK
+Content-Type: application/ld+json; version=2.0.0-dev
+Content-Language: en-US
+
+{
+    "@context": {
+      "cargo": "https://onerecord.iata.org/ns/cargo#",
+      "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@id": "https://1r.example.com/logistics-objects/2a7d1338-9033-13xc-b665-81a411418978/logistics-events",
+    "@type": "api:Collection",
+    "api:hasTotalItems": 0
+  }
+
+(LogisticsEvents_empty_list.json)

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/logistics-objects/index.html b/development/API-Security/logistics-objects/index.html new file mode 100644 index 00000000..b10d53d2 --- /dev/null +++ b/development/API-Security/logistics-objects/index.html @@ -0,0 +1,5276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Logistics Objects - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Logistics Objects

+ +

Create a Logistics Object

+

This API action is used to create a Logistics Object on a ONE Record server using the POST HTTP method. +This particular Logistics Object MUST be a type of Logistics Object, i.e. data classes that inherit from the class Logistics Object, that is specified in the ONE Record data model. +A list of all possible data classes that inherit from Logistics Object can be found here.

+
+

Note

+

Although the creation of a Logistics Object is specified in the ONE Record API specification, it is not required to expose an API endpoint for this API action to be compliant with the ONE Record standard. +The reason for this is that only the holder of the logistics object MAY create a logistics object with any business logic or technology. +However, it is important that the Logistics Object is created with a Logistics Object URI that is accessible on the ONE Record network.

+

Nevertheless, this API action specification is included for reference, because in many cases, the use of HTTP POST is the preferred solution to create resources with REST APIs.

+
+

Endpoint

+
 POST {{baseURL}}/logistics-objects/
+
+

Request

+

The following HTTP header parameters MUST be present in the request

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExamples
AcceptThe content type that the ONE Record client wants the HTTP response to be formatted in.application/ld+json
Content-TypeThe content type that is contained with the HTTP body. Valid content types.application/ld+json
+

The HTTP request ody must contain a valid Logistics Object in the format as specified by the Content-Type in the header.

+

Response

+

A successful request MUST return a HTTP/1.1 201 Created status code and the following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExamples
LocationThe URI of the newly created Logistics Objecthttps://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c
TypeThe type of the newly created Logistics Object as a URIhttps://onerecord.iata.org/ns/cargo#Piece
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
201Logistics Object has been createdNo response body
400Invalid Logistics ObjectError
401Not authenticatedError
403Not authorized to publish the Logistics Object to the serverError
409Logistics object with specified ID already existsError
415Unsupported Content TypeError
500Internal Server ErrorError
+

Security

+

Access to the Logistics Objects creation endpoint should be restricted to internal usage only, and it must not be made available to external entities.

+

Example A1

+

Creating a LogisticsObject of type Piece

+

Request:

+
POST /logistics-objects HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#"
+    },
+    "@type": "cargo:Piece",
+    "cargo:coload": {
+        "@type": "http://www.w3.org/2001/XMLSchema#boolean",
+        "@value": "false"
+    },
+    "cargo:specialHandlingCodes": [
+        {
+            "@id": "https://onerecord.iata.org/ns/coreCodeLists#SpecialHandlingCode_VAL"
+        }
+    ]
+}
+
+

(Piece.json)

+

Response:

+
HTTP/1.1 201 Created
+Location: https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/cargo#Piece
+
+

Example A2

+

Creating a LogisticsObject of type Company with an embedded Logistics Object of type Person

+

Request:

+
POST /logistics-objects HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#"
+    },
+    "@type": [
+        "cargo:Company",
+        "cargo:Organization",
+        "cargo:LogisticsAgent",
+        "cargo:LogisticsObject"
+    ],
+    "cargo:name": "Acme Corporation",
+    "cargo:shortName": "ACME",
+    "cargo:contactPersons": [
+        {
+            "@type": [
+                "cargo:Person",
+                "cargo:Actor",
+                "cargo:LogisticsAgent",
+                "cargo:LogisticsObject"
+            ],
+            "cargo:firstName": "Jane",
+            "cargo:lastName": "Doe",
+            "cargo:salutation": "Ms"
+        }
+    ]
+}
+
+

(Company.json)

+

Response:

+
HTTP/1.1 201 Created
+Location: https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/cargo#Company
+
+

Example A3

+

Creating a LogisticsObject of type Shipment that links the previously created Piece (see Example 1)

+

Request:

+
POST /logistics-objects HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#"
+    },
+    "@type": "cargo:Shipment",
+    "cargo:goodsDescription": "Lots of awesome ONE Record information materials",
+    "cargo:pieces": [
+        {
+            "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+        }
+    ]
+}
+
+

(Shipment.json)

+

Response:

+
HTTP/1.1 201 Created
+Location: https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/cargo#Shipment
+
+

Three different logistics objects have been published, i.e. they have been created and are accessible via their URIs:

+
    +
  • Piece with the Logistics Object URI https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c
  • +
  • Shipment with the Logistics Object URI https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c,
  • +
  • Company with the Organization URI https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda
  • +
+

This Logistics Objects will be used for the following examples.

+

Get a Logistics Object

+

Each Logistics Object MUST be accessible via its Logistics Objects URI using the HTTP GET method. +This enables the Holder of the Logistics Object to manage access on the level of individual Logistics Objects (see access-control for more information). +If the requester is authorized to access this Logistics Object then the response body MUST include the requested Logistics Object.

+

If not a historical version is explicitly requested (see Retrieve a historical Logistics Object), +the ONE Record server MUST return the latest version of the requested Logistics Object.

+

Because of Linked Data as a core concept of ONE Record, it could be possible that the requested Logistics Object contains links to other Logistics Object (see Shipment in Example A3), +If the User of the Logistics Object is interested in this linked data objects (which not necessary have to be on the same ONE Record server) and has the necessary access permissions, the User of the Logistics Object can request those Logistics Objects via their linked Logistics Object URIs.

+

Although linking logistics objects instead of embedding logistics objects is the preferred and RECOMMENDED approach, +to reduce the number of GET requests, it can be helpful to request an embedded version of a Logistics Object by setting the optional query parameter embedded=true. +The ONE Record server SHOULD then replace the linked Logistics Objects with the actual Logistics Objects by resolving the Logistics Object URIs (see Example B3).

+
+

Note

+

The ONE Record server MAY only resolve and replace linked Logistics Objects that are published on the same ONE Record server.
+Furthermore, there ONE Record server MAY not resolve and replace linked Logistics Events. +Logistics Events MUST be accessed using the /logistics-events endpoint. (see Logistics Events)

+
+

Endpoint

+
 GET {{baseURL}}/logistics-objects/{{logisticsObjectId}}
+
+

Request

+

The following query parameters MUST be supported:

+ + + + + + + + + + + + + + + + + + + + +
Query parameterDescriptionValid values
embedded (optional)Optional parameter that can be used to request an embedded version of a Logistics Object, if the parameter is not set, a linked version of the Logistics Object is returned
  • true
  • false
at (optional)Optional parameter that can be used to request a historical version of Logistics Object, if the parameter is not set, the latest version is returnedISO 8601 UTC using format: YYYYMMDDThhmmssZ
+

The following HTTP header parameters MUST be present in the request:

+ + + + + + + + + + + + + + + +
HeaderDescriptionExamples
AcceptThe content type that a ONE Record client wants the HTTP response to be formatted in. This SHOULD include the version of the ONE Record API, otherwise the latest supported ONE Record API MAY be applied.
  • application/ld+json
  • application/ld+json; version=2.0.0-dev
  • application/ld+json; version=1.2
+

Response

+

A successful request MUST return a HTTP/1.1 200 OK status code. +The body of the response includes the Logistics Object in the RDF serialization format that has been requested in the Accept header of the request.

+

The following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
Content-LanguageDescribes the language(s) for which the requested resource is intended.en-US
TypeThe type of the requested Logistics Object as a URIhttps://onerecord.iata.org/ns/cargo#Piece
RevisionThe revision of the requested Logistics Object as a positive numerical value. This is particularly relevant if the query parameter at= is set to request a historical version of the Logistics Object.3
Latest-RevisionThe latest revision number of the Logistics Object as non-negative numerical value.3
Last-ModifiedDate and time when the Logistics Object was last time changed. Syntax: Last-Modified: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT. See https://developer.mozilla.org/en-US/docs/Web/Tue, 21 Feb 2023 07:28:00 GMT
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
200The request to retrieve the Logistics Object has been successfulLogistics Object
301The URI of the Logistics Object has permanently changed.No response body
302The URI of the Logistics Object has temporarily moved.No response body
401Not authenticatedError
403Not authorized to retrieve the Logistics ObjectError
404Logistics Object not foundError
415Unsupported Content TypeError
500Internal Server ErrorError
+

Security

+

To engage with the "Get Logistics Object" endpoint, a client needs proper authentication and authorization to access the designated resource. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status. Conversely, for requests without proper authorization, a 403 "Not Authorized" response should be provided.

+

Example B1

+

Request:

+
GET /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+
+

Response:

+
HTTP/1.1 200 OK
+Content-Type: application/ld+json
+Content-Language: en-US
+Location: https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c
+Type: https://onerecord.iata.org/ns/cargo#Piece
+Revision: 1
+Latest-Revision: 1
+Last-Modified: Tue, 21 Feb 2023 07:28:00 GMT
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "@language": "en-US"
+    },
+    "@type": "cargo:Piece",
+    "@id": " https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+    "cargo:coload": false,
+    "cargo:specialHandlingCodes": [
+        {
+            "@id": "https://onerecord.iata.org/ns/coreCodeLists#SpecialHandlingCode_VAL"
+        }
+    ]
+}
+
+

(Piece_with_id.json)

+

Example B2

+

This is an example for an unsuccessful HTTP GET request that results in an error.

+

Request:

+
GET /logistics-objects/11ccfb7c-3643-41db-8098-740fccd97c93 HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json
+Accept: application/ld+json
+
+

Response:

+
HTTP/1.1 403 Forbidden
+Content-Language: en-US
+Content-Type: application/ld+json
+
+{
+   "@context": {
+      "api": "https://onerecord.iata.org/ns/api#",
+      "@language": "en-US"
+   },
+   "@type": "api:Error",
+   "@id": "_:b0",
+   "api:hasTitle": "Not authorized to retrieve the Logistics Object",
+   "api:hasErrorDetail": [{
+      "@type": "api:ErrorDetail",
+      "@id": "_:b1",
+      "api:hasCode": "403",
+      "api:hasMessage": "Authenticated client could not be found in ACL for the Logistics Object",
+      "api:hasResource": "http://1r.example.com/logistics-objects/11ccfb7c-3643-41db-8098-740fccd97c93"
+   }]
+}
+
+

(Error_403.json)

+

Example B3

+

This is an example for a HTTP GET request that asks the ONE Record server to embed the linked Logistics Objects.

+

Request:

+
GET /logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c?embedded=true HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json
+Accept: application/ld+json
+
+

Response:

+
HTTP/1.1 200 OK
+Content-Type: application/ld+json
+Content-Language: en-US
+Location: https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c
+Type: https://onerecord.iata.org/ns/cargo#Shipment
+Revision: 1
+Latest-Revision: 1
+Last-Modified: Tue, 21 Feb 2023 07:28:00 GMT
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#"
+    },
+    "@type": "cargo:Shipment",
+    "cargo:goodsDescription": "Lots of awesome ONE Record information materials",
+    "cargo:pieces": [
+        {
+            "@type": "cargo:Piece",
+            "@id": " https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+            "cargo:coload": {
+                "@type": "http://www.w3.org/2001/XMLSchema#boolean",
+                "@value": "false"
+            },
+            "cargo:specialHandlingCodes": [
+                {
+                    "@id": "https://onerecord.iata.org/ns/coreCodeLists#SpecialHandlingCode_VAL"
+                }
+            ]
+        }
+    ]
+}
+
+

(Shipment_with_Piece.embedded.json)

+

Example B4

+

This example illustrates an instance of an HTTP GET request that triggers a redirection. Various types of redirection can be employed based on requirements. The provided illustration demonstrates a 301 redirect used for indicating a permanent relocation of the resource.

+

In this case the Location header carries the new URL of the requested resource.

+

Request:

+

GET /logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json
+Accept: application/ld+json
+
+Response:

+
HTTP/1.1 301 Moved Permanently
+Location: http://new1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c 
+
+

Update a Logistics Object

+

In ONE Record, logistics objects MAY be updated. +However, only the Holder of a LogisticsObject can update the data, +while Users of the LogisticsObject can only request changes following a structure described in this section.

+

Technically, the HTTP PATCH method is used to request an update to a LogisticsObject. +According to the W3C HTTP standard, PATCH is used for partial changes to a resource. +This differs from the HTTP PUT method, which is used for the complete replacement of a resource.

+

Linked Data PATCH Format

+

Although ONE Record API specification does not put much emphasis on the use of RDF, +it is important that the specification of RDF is fully respected to ensure that ONE Record remains compatible with RDF technologies, such as the use of graph queries.

+

W3C has developed the Linked Data PATCH Format for describing changes to Linked Data. +It defines a list of operations to be performed against a Linked Data resource, namely the addition or removal of RDF triples in a graph representation of the resource.

+

This Linked Data PATCH Format provides many options for updating RDF but since ONE Record uses JSON-LD as the RDF Serialization, +the ONE Record API specification follows the JSON-LD PATCH specification and limits the options for changing Logistics Objects to two actions only: delete and add.

+

The combination of delete and add is equivalent to replace. +Thus, any property in a Logistics Object can be deleted, added, or replaced.

+

Guidelines for updating Logistics Objects in ONE Record:

+
    +
  • Only the Holder of a Logistics Object MAY make the changes to logistics objects.
  • +
  • Any authenticated User of a Logistics Object CAN request a Change on a Logistics Object, which result in a ChangeRequest with the status REQUEST_PENDING.
  • +
  • The implementer of the ONE record server MUST ensure that the requester gets sufficient access to the resulting ChangeRequest to query the status of the ChangeRequest and to revoke pending ChangeRequests (see also section on revoking Action Requests)
  • +
  • The Holder of a Logistics Object decides about the ChangeRequest and applies changes to a Logistics Object unless there is a business or technical reason to reject it.
  • +
  • Evaluation and Application of a Change MUST occur as a single (atomic) event. Operations are sorted and processed as two groups of (1) delete operations and (2) add operations until all operations are applied, or else the entire update fails. If an error occurs, it is necessary to revert the logistics object back to its previous state before implementing the modification.
  • +
  • If a field update fails, the entire Change is unsuccessful. Partial updates MUST NOT be accepted. The ONE Record server MUST use the property hasError of the ChangeRequest to document the errors.
  • +
  • If the update is successful, the revision number in a Logistics Object's AuditTrail is incremented and the changes are recorded in the Audit Trail. Please refer to the sections on Historical Logistics Objects and Audit Trail of Logistics Objects for more details.
  • +
  • It is RECOMMENDED to get the latest version of Logistics Object before requesting a Change to ensure that the update is made to the latest version of the Logistics Object.
  • +
  • If a ChangeRequest is rejected by the Holder of the Logistics Object, the revision number of the Logistics Object is not incremented but the request is added to the AuditTrail of this Logistics Object, marked with the status REQUEST_REJECTED. A rejected ChangeRequest is kept in the AuditTrail of the Logistics Object.
  • +
  • After a ChangeRequest is accepted, other pending ChangeRequests that affect the same revision MUST be rejected.
  • +
  • The PATCH operation MUST NOT be used to create logistics objects; only linking to an existing object is allowed in a ChangeRequest.
  • +
  • The PATCH operation MUST NOT be used to link a LogisticsEvent to a Logistics Object. The ONE Record server MUST reject requested changes that contain operations to the hasLogisticsEvent property.
  • +
  • The ONE Record server MUST check that the property referencesLogisticsObject matches the URI/endpoint used for the PATCH request.
  • +
  • If datatype in OperationObject is an IRI of the ONE Record cargo ontology and is not a data class that inherits from LogisticsObject, then the ONE Record Server MUST generate an embeddedObjectId for the object in the value property of OperationObject (see section about Blank Nodes and Embedded Objects)
  • +
+

Logistics Objects MUST have a revision number, which is a non negative integer to be incremented after every applied change. +The audit trail contains a field latestRevision which defines the latest revision of the Logistics Object.

+

Endpoint

+
 PATCH {{baseURL}}/logistics-objects/{{logisticsObjectId}}
+
+

Request

+

The following HTTP header parameters MUST be present in the PATCH request:

+ + + + + + + + + + + + + + + + + + + + +
Request HeaderDescriptionExamples
AcceptThe content type that you want the HTTP response to be formatted in.application/ld+json
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
+

The HTTP request body must contain a valid Change object in the format as specified by the Content-Type in the header.

+

The Change is a data class of the ONE Record API ontology. +The properties and relationships to other data classes are visualized in the following class diagram.

+
classDiagram
+    direction LR
+
+    class LogisticsObject{
+    }
+
+    class Organization{
+    }
+
+    class ActionRequest {
+        <<Abstract>>         
+        + hasError[]: Error [*]
+        + isRequestedAt: xsd:dateTime         
+        + isRequestedBy: Organization            
+        + isRevokedBy: Organization 
+        + hasRequestStatus: RequestStatus = REQUEST_PENDING
+        + revokedAt: xsd:dateTime                 
+    }
+    ActionRequest <|-- ChangeRequest
+
+    ActionRequest "1" --> "0..*" Error     
+    ActionRequest "1" --> "1..*" Organization : requestedBy    
+    ActionRequest --> RequestStatus                
+    ActionRequest "1" --> "1..*" Organization : revokedBy
+
+    class ChangeRequest{
+        + hasLogisticsObject: LogisticsObject                                
+        + hasChange: Change        
+    }
+    ChangeRequest "1" --> "1" LogisticsObject
+    ChangeRequest "1" --> "1" Change
+
+    class Change{        
+        + hasOperation[]: Operation [1..*]        
+        + hasDescription: xsd:string [0..1]
+        + hasLogisticsObject: LogisticsObject
+        + hasRevision: xsd:positiveInteger        
+        + notifyRequestStatusChange: xsd:boolean = FALSE
+    }
+    Change "1" --> "1" LogisticsObject
+    Change "1" --> "1..*" Operation
+
+    class Error{        
+        + hasErrorDetail[]: ErrorDetail [1..*]
+        + hasTitle: xsd:string
+    }
+    Error "1" --> "*" ErrorDetail
+
+    class ErrorDetail{
+        + hasCode: xsd:string  [0..1]
+        + hasMessage: xsd:string [0..1]
+        + hasProperty: xsd:anyURI [0..1]
+        + hasResource: xsd:anyURI [0..1]
+    }
+
+    class Operation{
+        + o: OperationObject|string
+        + op: PatchOperation
+        + p: xsd:anyURI
+        + s: xsd:string
+    }
+    Operation "1" --> "1" OperationObject
+    Operation --> PatchOperation
+
+    class OperationObject{
+        + hasDatatype: xsd:anyURI
+        + hasValue: xsd:string   
+    }
+
+    class PatchOperation{
+        <<Enumeration>>
+        ADD
+        DELETE
+    }
+    class RequestStatus{
+        <<Enumeration>>
+        REQUEST_PENDING
+        REQUEST_ACCEPTED
+        REQUEST_REJECTED
+        REQUEST_FAILED
+        REQUEST_REVOKED        
+    }
+

Response

+

A successful request MUST return a `HTTP/1.1 201 Created status code and the following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
LocationThe URI of the newly created ChangeRequesthttps://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b
TypeThe type of the newly created resource as a URIhttps://onerecord.iata.org/ns/api#ChangeRequest
+

Otherwise, an Error object with ErrorDetail as response body MUST be returned with the following HTTP headers:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
Content-LanguageDescribes the language(s) for which the requested resource is intended.en-US
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
201The change request was correctly createdNo body required
400The update request body is invalidError
401Not authenticatedError
403Not authorized to update the Logistics ObjectError
404Logistics Object not foundError
415Unsupported Content Type, response when the client sends a PATCH document format that the server does not support for the resource identified by the Request-URI.Error
422Unprocessable request, when the server understands the PATCH document and the syntax of the PATCH document appears to be valid, but the server is incapable of processing the request.Error
500Internal Server ErrorError
+

Security

+

To engage with the "Update Logistics Object" endpoint, a client needs only to be authenticated. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status.

+

Example C1

+

In the example below, a Piece is modified by setting the property goodsDescription to "BOOKS" and change the property coload from false to true. +This results in the following operations that MUST be part of the Change:

+
    +
  1. add the value "BOOKS" (xsd:string) to the property goodsDescription of Piece
  2. +
  3. delete the value false (xsd:boolean) from property coload of Piece
  4. +
  5. add the value true (xsd:boolean) to property coload of Piece
  6. +
+

Request:

+
PATCH /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json
+Accept: application/ld+json
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Change",
+    "api:hasLogisticsObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    },
+    "api:hasDescription": "Update goods description and coload",
+    "api:hasOperation": [{
+            "@type": "api:Operation",
+            "api:op": { "@id": "api:ADD" },
+            "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+            "api:p": "https://onerecord.iata.org/ns/cargo#goodsDescription",
+            "api:o": [{
+                "@type": "api:OperationObject",
+                "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#string",
+                "api:hasValue": "ONE Record Advertisement Materials"
+            }]
+        },
+        {
+            "@type": "api:Operation",
+            "api:op": { "@id": "api:DELETE" },
+            "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+            "api:p": "https://onerecord.iata.org/ns/cargo#coload",
+            "api:o": [{
+                "@type": "api:OperationObject",
+                "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#boolean",
+                "api:hasValue": "false"
+            }]
+        },
+        {
+            "@type": "api:Operation",
+            "api:op": { "@id": "api:ADD" },
+            "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+            "api:p": "https://onerecord.iata.org/ns/cargo#coload",
+            "api:o": [{
+                "@type": "api:OperationObject",
+                "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#boolean",
+                "api:hasValue": "true"
+            }]
+        }
+    ],
+    "api:hasRevision": {
+        "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger",
+        "@value": "1"
+    }
+}
+
+

(Change_example1.json)

+

Response:

+
HTTP/1.1 204 No Content
+Content-Type: application/ld+json
+Type: https://onerecord.iata.org/ns/api#ChangeRequest
+Location: https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b
+
+

Example C2

+

In the example below, Piece#grossWeight is added. +This results in the following operations that MUST be part of the Change:

+
    +
  1. add the embedded object Value(unit="KGM", value=20.0) to the property Piece#grossWeight
  2. +
+

Request:

+
PATCH /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json
+Accept: application/ld+json
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Change",
+    "api:hasLogisticsObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    },
+    "api:hasDescription": "Add grossWeight",
+    "api:hasOperation": [
+        {
+            "@type": "api:Operation",
+            "api:op": {
+                "@id": "api:ADD"
+            },
+            "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+            "api:p": "https://onerecord.iata.org/ns/cargo#grossWeight",
+            "api:o": [
+                {
+                    "@type": "api:OperationObject",
+                    "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#Value",
+                    "api:hasValue": "_:b0"
+                }
+            ]
+        },
+        {
+            "@type": "api:Operation",
+            "api:op": {
+                "@id": "api:ADD"
+            },
+            "api:s": "_:b0",
+            "api:p": "https://onerecord.iata.org/ns/cargo#unit",
+            "api:o": [
+                {
+                    "@type": "api:OperationObject",
+                    "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#string",
+                    "api:hasValue": "KGM"
+                }
+            ]
+        },
+        {
+            "@type": "api:Operation",
+            "api:op": {
+                "@id": "api:ADD"
+            },
+            "api:s": "_:b0",
+            "api:p": "https://onerecord.iata.org/ns/cargo#value",
+            "api:o": [
+                {
+                    "@type": "api:OperationObject",
+                    "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#double",
+                    "api:hasValue": "20.0"
+                }
+            ]
+        }
+    ],
+    "api:hasRevision": {
+        "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger",
+        "@value": "2"
+    }
+}
+
+

(Change_example2.json)

+

Response:

+
HTTP/1.1 204 No Content
+Content-Type: application/ld+json
+Type: https://onerecord.iata.org/ns/api#ChangeRequest
+Location: https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99c
+
+

Example C3

+

In the example below, Piece#grossWeight is changed from 20.0 KGM to 25.0 KGM . +This results in the following operations that MUST be part of the Change:

+
    +
  1. delete the property value of embedded object Value(unit="KGM", value=20.0) within the property Piece#grossWeight
  2. +
  3. add the property value 25.0 to the embedded object Value(unit="KGM") within the property Piece#grossWeight
  4. +
+
+

Note

+

The @id of the bNode for grossWeight in Example C2 was replaced by the ONE Record server with internal:7fc81d1d-6c75-568b-9e47-48c947ed2a07 after the ChangeRequest was accepted.

+
+

Request:

+
PATCH /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json
+Accept: application/ld+json
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Change",
+    "api:hasLogisticsObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    },
+    "api:hasDescription": "Change grossWeight",
+    "api:hasOperation": [{
+            "@type": "api:Operation",
+            "api:op": {
+                "@id": "api:DELETE"
+            },
+            "api:s": "internal:7fc81d1d-6c75-568b-9e47-48c947ed2a07",
+            "api:p": "https://onerecord.iata.org/ns/cargo#value",
+            "api:o": [{
+                "@type": "api:OperationObject",
+                "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#double",
+                "api:hasValue": "20.0"
+            }]
+        },
+        {
+            "@type": "api:Operation",
+            "api:op": {
+                "@id": "api:ADD"
+            },
+            "api:s": "internal:7fc81d1d-6c75-568b-9e47-48c947ed2a07",
+            "api:p": "https://onerecord.iata.org/ns/cargo#value",
+            "api:o": [{
+                "@type": "api:OperationObject",
+                "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#double",
+                "api:hasValue": "25.0"
+            }]
+        }
+    ],
+    "api:hasRevision": {
+        "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger",
+        "@value": "2"
+    }
+}
+
+

(Change_example3.json)

+

Response:

+
HTTP/1.1 204 No Content
+Content-Type: application/ld+json
+Type: https://onerecord.iata.org/ns/api#ChangeRequest
+Location: https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99d
+
+

Example C4

+

In the example below, Piece#grossWeight is deleted. +This results in the following operations that MUST be part of the Change:

+
    +
  1. delete the embedded object Value(unit="KGM", value=20.0) from the property Piece#grossWeight
  2. +
+

Request:

+
PATCH /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json
+Accept: application/ld+json
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Change",
+    "api:hasLogisticsObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    },
+    "api:hasDescription": "delete grossWeight",
+    "api:hasOperation": [{
+            "@type": "api:Operation",
+            "api:op": {
+                "@id": "api:DELETE"
+            },
+            "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+            "api:p": "https://onerecord.iata.org/ns/cargo#grossWeight",
+            "api:o": [{
+                "@type": "api:OperationObject",
+                "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#Value",
+                "api:hasValue": "_:b0"
+            }]
+        },
+        {
+            "@type": "api:Operation",
+            "api:op": {
+                "@id": "api:DELETE"
+            },
+            "api:s": "_:b0",
+            "api:p": "https://onerecord.iata.org/ns/cargo#unit",
+            "api:o": [{
+                "@type": "api:OperationObject",
+                "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#string",
+                "api:hasValue": "KGM"
+            }]
+        },
+        {
+            "@type": "api:Operation",
+            "api:op": {
+                "@id": "api:DELETE"
+            },
+            "api:s": "_:b0",
+            "api:p": "https://onerecord.iata.org/ns/cargo#value",
+            "api:o": [{
+                "@type": "api:OperationObject",
+                "api:hasDatatype": "http://www.w3.org/2001/XMLSchema#double",
+                "api:hasValue": "20"
+            }]
+        }
+    ],
+    "api:hasRevision": {
+        "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger",
+        "@value": "3"
+    }
+}
+
+

(Change_example4.json)

+

Response:

+
HTTP/1.1 204 No Content
+Content-Type: application/ld+json
+Type: https://onerecord.iata.org/ns/api#ChangeRequest
+Location: https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99d
+
+

Example C5

+

In the example below, CustomsInformations are added to Piece#customsInfo. +This results in following the workflow:

+

1. Create two CustomsInformation objects (see Create a Logistics Object)

+

Request:

+
POST /logistics-objects HTTP/1.1
+Host: 1r.example.com
+
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#"
+    },
+    "@type": "cargo:CustomsInformation",
+    "cargo:country": {
+        "@type": "cargo:CodeListElement",
+        "cargo:code": "DE"
+    },
+    "cargo:subjectCode": {
+        "@type": "cargo:CodeListElement",
+        "cargo:code": "ISS"
+    }
+}
+
+

(CustomsInformation.json)

+

Response:

+
HTTP/1.1 201 Created
+Location: https://1r.example.com/logistics-objects/4d73acf0-3073-4ec9-8aee-b82d64ba3805
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/cargo#CustomsInformation
+
+

Request:

+
POST /logistics-objects HTTP/1.1
+Host: 1r.example.com
+
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#"
+    },
+    "@type": "cargo:CustomsInformation",
+    "cargo:country": {
+        "@type": "cargo:CodeListElement",
+        "cargo:code": "DE"
+    },
+    "cargo:subjectCode": {
+        "@type": "cargo:CodeListElement",
+        "cargo:code": "ISS"
+    },
+    "cargo:contentCode": {
+        "@type": "cargo:CodeListElement",
+        "cargo:code": "RA"
+    },
+    "cargo:otherCustomsInformation": "01234-01"
+}
+
+

(CustomsInformation_2.json)

+

Response:

+
HTTP/1.1 201 Created
+Location: https://1r.example.com/logistics-objects/ba1c2194-2442-400b-b26b-466a01dda8b5
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/cargo#CustomsInformation
+
+

2. Add the URI of the newly created CustomsInformation objects to the property Piece#customsInfos +Request:

+
PATCH /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json
+Accept: application/ld+json
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Change",
+    "api:hasLogisticsObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    },
+    "api:hasDescription": "add CustomsInformations",
+    "api:hasOperation": [{
+            "@type": "api:Operation",
+            "api:op": {
+                "@id": "api:ADD"
+            },
+            "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+            "api:p": "https://onerecord.iata.org/ns/cargo#customsInformation",
+            "api:o": [{
+                "@type": "api:OperationObject",
+                "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#CustomsInformation",
+                "api:hasValue": "https://1r.example.com/logistics-objects/4d73acf0-3073-4ec9-8aee-b82d64ba3805"
+            }]
+        },
+        {
+            "@type": "api:Operation",
+            "api:op": {
+                "@id": "api:ADD"
+            },
+            "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+            "api:p": "https://onerecord.iata.org/ns/cargo#customsInformation",
+            "api:o": [{
+                "@type": "api:OperationObject",
+                "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#CustomsInformation",
+                "api:hasValue": "https://1r.example.com/logistics-objects/ba1c2194-2442-400b-b26b-466a01dda8b5"
+            }]
+        }
+    ],
+    "api:hasRevision": {
+        "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger",
+        "@value": "4"
+    }
+}
+
+

(Change_example5.json)

+

Response:

+
HTTP/1.1 204 No Content
+Content-Type: application/ld+json
+Type: https://onerecord.iata.org/ns/api#ChangeRequest
+Location: https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99e
+
+
+

Note

+

Removing a bNode, the ONE Record server implementors should handle the cleansing of the triples.

+
+

Example C6

+

In the example below, the referencesLogisticsObject in the Change object differs from the Logistics URI that is used as the endpoint for the PATCH request. The ONE Record server returns a 400 Bad Request.

+

Request:

+
PATCH /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Change",
+    "api:hasLogisticsObject": [
+        {
+            "@type": "cargo:LogisticsObject",
+            "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b8c"
+        }
+    ],    
+    "api:hasDescription": "add CustomsInformations",
+    "api:hasOperation": [
+        {
+            "@type": "api:Operation",
+            "api:op": { "@id": "api:ADD" },
+            "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b8c",
+            "api:p": "https://onerecord.iata.org/ns/cargo#customsInformation",
+            "api:o": [
+                {
+                    "@type": "api:OperationObject",
+                    "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#CustomsInformation",
+                    "api:hasValue": "https://1r.example.com/logistics-objects/4d73acf0-3073-4ec9-8aee-b82d64ba3805"
+                }
+            ]
+        }             
+    ],    
+    "api:hasRevision": {
+        "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger",
+        "@value": "4"
+    }
+}
+
+

(Change_example6.json)

+

Response:

+

HTTP/1.1 400 Bad Request
+Content-Type: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+       "api": "https://onerecord.iata.org/ns/api#",
+       "@language": "en-US"
+    },
+    "@type": "api:Error",
+    "@id": "_:b0",
+    "api:hasTitle": "Logistics Object URI does not match",
+    "api:hasErrorDetail": [{
+       "@type": "api:ErrorDetail",
+       "@id": "_:b1",
+       "api:hasCode": "400",
+       "api:hasMessage": "LogisticsObject URI in Change does not match requested Logistics Object URI",
+       "api:hasResource": "http://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    }]
+ }
+
+(Error_400.json)

+

Example C7

+

In the example below, the Change object contains an illegal operation, i.e. an ADD operation that affects the disallowed property hasLogisticsEvent. +The ONE Record server returns a 400 Bad Request.

+

Request:

+
PATCH /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Change",
+    "api:hasLogisticsObject": [
+        {
+            "@type": "cargo:LogisticsObject",
+            "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+        }
+    ],    
+    "api:hasDescription": "add LogisticsEvent",
+    "api:hasOperation": [
+        {
+            "@type": "api:Operation",
+            "api:op": { "@id": "api:ADD" },
+            "api:s": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+            "api:p": "https://onerecord.iata.org/ns/cargo#hasLogisticsEvent",
+            "api:o": [
+                {
+                    "@type": "api:OperationObject",
+                    "api:hasDatatype": "https://onerecord.iata.org/ns/cargo#LogisticsEvent",
+                    "api:hasValue": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c/logistics-events/c9ab534e-3246-48d3-b34d-bb380bd98af7"
+                }
+            ]
+        }             
+    ],    
+    "api:hasRevision": {
+        "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger",
+        "@value": "4"
+    }
+}
+
+

(Change_example7.json)

+

Response:

+

HTTP/1.1 400 Bad Request
+Content-Type: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+       "api": "https://onerecord.iata.org/ns/api#",
+       "@language": "en-US"
+    },
+    "@type": "api:Error",
+    "@id": "_:b0",
+    "api:hasTitle": "Logistics Events can not be updated",
+    "api:hasErrorDetail": [{
+       "@type": "api:ErrorDetail",
+       "@id": "_:b1",
+       "api:hasCode": "400",
+       "api:hasMessage": "Logistics Events of a Logistics Object can not be updated using PATCH",
+       "api:hasResource": "http://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    }]
+ }
+
+(Error_400_example2.json)

+

Get Audit Trail of a Logistics Object

+

Every time a Logistics Object is requested to be updated as described in the previous section, the details of this request are added to an AuditTrail of a Logistics Object. +Before a ChangeRequest is processed by the holder of a Logistics Object, the status of the ChangeRequest MUST be changed from REQUEST_PENDING to REQUEST_ACCEPTED or REQUEST_REJECTED.

+

The ChangeRequest data class object details about the success or failure of this request, e.g. timestamps, any errors that occurred, in addition to the operations to be applied to a LogisticsObject.

+

The AuditTrail is a data class of the ONE Record API ontology. +The properties and relationships to other data classes are visualized in the following class diagram.

+
classDiagram
+    direction RL
+
+    class AuditTrail{                
+        + hasChangeRequest[]: ChangeRequest [*]                
+        + hasLatestRevision: xsd:positiveInteger       
+    }
+    AuditTrail "1" --> "*" ChangeRequest
+
+

Note

+

Users of the Logistics Object can retrieve the AuditTrail of the LogisticsObject. +Holder of the Logistics Object is responsible for updating the AuditTrail.

+
+

The AuditTrail of a Logistics Object can be retrieved by performing a GET request to the Logistics Object URI appended by: "/audit-trail", e.g. +https://1r.example.com/logistics-objects/11ccfb7c-3643-41db-8098-740fccd97c93/audit-trail

+

In order to retrieve the history of a Logistics Object between two dates, a query parameter should be added to the request URL as follows: "?updated-from=YYYYMMDDThhmmssZ&updated-to=YYYYMMDDThhmmssZ". The ONE Record client MUST specify this date-time window.

+

Endpoint

+
 GET {{baseURL}}/logistics-objects/{{logisticsObjectId}}/audit-trail
+
+

Request

+

The following query parameters MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Query parameterDescriptionValid values
updated-from (optional)The start date of the requested audit trail. If not specificed the acutal time is taken.ISO 8601 UTC using format: YYYYMMDDThhmmssZ
updated-to (optional)The end date of the requested audit trail. If not specificed the logistics object creation date is taken.ISO 8601 UTC using format: YYYYMMDDThhmmssZ
status (optional)The type of change requests in the audit trail. If not specified all types are returned.
  • PENDING
  • ACCEPTED
  • REJECTED
+

The following HTTP header parameters MUST be present in the request:

+ + + + + + + + + + + + + + + + + +
Request HeaderDescription
AcceptThe content type that you want the HTTP response to be formatted in. Valid content types include: ▪ application/x-turtle or text/turtle ▪ application/ld+json
Content-TypeThe content type that is contained with the HTTP body. Valid content types include: ▪ application/x-turtle or text/turtle ▪ application/ld+json
+

Response

+

A successful request MUST return a HTTP/1.1 200 OK status code. +The response body follows the API AuditTrail class structure.

+ + + + + + + + + + + + + + + + + + + + + + + +
AuditTrailDescriptionRequiredClass
hasChangeRequestList of change requests that were sent as PATCH for a Logistics Objectyesapi:ChangeRequest
hasLatestRevisionThe latest revision of the Logistics Objectyesxsd:positiveInteger
+

Each change request follows the API ChangeRequest class structure.

+

The following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
Content-LanguageDescribes the language(s) for which the requested resource is intended.en-US
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
200The request to retrieve the Logistics Object has been successfulAudit Trail
301The URI of the Logistics Object has permanently changed.No response body
302The URI of the Logistics Object has temporarily moved.No response body
401Not authenticatedError
403Not authorized to retrieve the Logistics Object Audit TrailError
404Logistics Object not foundError
415Unsupported Content TypeError
500Internal Server ErrorError
+

Security

+

To engage with the "Get Audit Trail of a Logistics Object" endpoint, a client needs proper authentication and authorization to access the designated resource. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status. Conversely, for requests without proper authorization, a 403 "Not Authorized" response should be provided.

+

The authorization to access the audit trail should be derived from the logistics objects. However, the implementor of a ONE Record server can decide to separate the control access between a logistics object and its audit trail.

+
+

Note

+

The Audit trail comprehensively documents the chronological history of a logistics object. Individuals with access to the audit trail are able to view the complete evolution of the logistics object over time. Due to this, it is imperative for the implementer of the ONE Record server to exercise caution when granting access to this particular resource.

+
+

Example D1

+

The following example shows an AuditTrail including a ChangeRequest.

+

Request:

+
GET /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c/audit-trail HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json
+Accept: application/ld+json
+
+

Response:

+

HTTP/1.1 200 OK
+Content-Type: application/ld+json
+Content-Language: en-US
+
+{
+  "@context": {
+    "cargo": "https://onerecord.iata.org/ns/cargo#",
+    "api": "https://onerecord.iata.org/ns/api#"
+  },
+  "@type": "api:AuditTrail",
+  "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c/audit-trail",
+  "api:hasChangeRequest": [
+    {
+      "@type": "api:ChangeRequest",
+      "@id": "https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b",
+      "api:hasChange": {
+      ...this contains a complete Change object...
+      },
+      "api:hasError": [],      
+      "api:isRequestedAt": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2020-09-07T11:55:45.768Z"
+      },
+      "api:isRequestedBy": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda",
+      "api:hasRequestStatus": {
+        "@id": "api:REQUEST_STATUS_ACCEPTED"
+      }
+    }
+  ],
+  "api:hasLatestRevision": {
+    "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger",
+    "@value": "2"
+  }
+}
+
+(AuditTrail.json)

+

Example D2

+

An example of an AuditTrail with ChangeRequests with Errors, e.g. the revision of the Logistics Object used in the submitted Change is outdated

+

Request:

+
GET /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c/audit-trail HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json
+Accept: application/ld+json
+
+

Response:

+

HTTP/1.1 200 OK
+Content-Type: application/ld+json
+Content-Language: en-US
+
+{
+  "@context": {
+    "cargo": "https://onerecord.iata.org/ns/cargo#",
+    "api": "https://onerecord.iata.org/ns/api#"
+  },
+  "@type": "api:AuditTrail",
+  "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c/audit-trail",
+  "api:hasChangeRequest": [
+    {
+      "@type": "api:ChangeRequest",
+      "@id": "https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b",
+      "api:hasChange": {
+      ...this contains a complete Change object...
+      },
+      "api:hasError": [
+        {
+          "@type": "api:Error",
+          "@id": "https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b/errors/98843671-388c-53c6-ba79-7be266f61aa0",
+          "api:hasTitle": "LogisticsObject revision does not match",
+          "api:hasErrorDetail": [
+            {
+              "@type": "api:ErrorDetail",
+              "@id": "_:b1",
+              "api:hasCode": "409",
+              "api:hasMessage": "LogisticsObject revision does not match",
+              "api:hasResource": "http://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+            }
+          ]
+        }
+      ],
+      "api:isRequestedAt": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2020-09-07T11:55:45.768Z"
+      },
+      "api:isRequestedBy": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda",
+      "api:hasRequestStatus": {
+        "@id": "api:REQUEST_STATUS_REJECTED"
+      }
+    }
+  ],
+  "api:hasLatestRevision": {
+    "@type": "http://www.w3.org/2001/XMLSchema#positiveInteger",
+    "@value": "2"
+  }
+}
+
+(AuditTrail_example2.json)

+

Retrieve a historical Logistics Object

+

In ONE Record, data is updated in real time and every time a ChangeRequest is applied successfully, a new version of the Logistics Object and only the latest content is available via its URI. +However, there is a need to retrieve a specific version of a data object at a specific point in time, for example the Master Air Waybill (MAWB).

+
+

Note

+

Reverting to a previous version of a Logistics Object with PATCH is not supported as out of scope of ONE Record.

+
+

An ONE Record server MUST enable the ONE Record client to request an historical version of a Logistics Object using the ?at= query parameter of the Logistics Object GET endpoint. +This ?at= parameter MUST accept past datetime strings in ISO 8601 UTC using the following format: YYYYMMDDThhmmssZ

+

Example: https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c?at=20190926T075830Z

+

This datetime value MUST be in the past. +If this parameter is before the creation date of the Logistics Object, 404 Not Found is returned. +If this parameter is in the future, 400 Bad Request is returned.

+

To ensure consistency when following the linked objects in a response, all linked Logistics Object, i.e. their Logistics Object URIs. in the response body MUST also contain the ?at=query parameter with the same provided datetime value.

+

To retrieve an historical logistic object we use the "Get a logistics object" endpoint. Additional information on how to perform a correct request can be found in the section "Get a logistics object".

+

Example E1

+

Request:

+
GET /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c?at=20190926T075830Z HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json
+Accept: application/ld+json
+
+

Response:

+
HTTP/1.1 200 OK
+Content-Type: application/ld+json
+Content-Language: en-US
+Location: https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c?at=20190926T075830Z
+Type: https://onerecord.iata.org/ns/cargo#Piece
+Revision: 3
+Latest-Revision: 4
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "@language": "en-US"
+    },
+    "@type": "cargo:Piece",
+    "@id": " https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c?at=20190926T075830Z",
+    "cargo:coload": {
+        "@type": "http://www.w3.org/2001/XMLSchema#boolean",
+        "@value": "true"
+    },
+    "cargo:goodsDescription": "ONE Record Advertisement Materials",
+    "cargo:specialHandlingCodes": [
+        {
+            "@id": "https://onerecord.iata.org/ns/coreCodeLists#SpecialHandlingCode_VAL"
+        }
+    ],
+    "cargo:customsInformation": [
+        {
+            "@type": "cargo:CustomsInformation",
+            "@id": "https://1r.example.com/logistics-objects/4d73acf0-3073-4ec9-8aee-b82d64ba3805?at=20190926T075830Z"
+        },
+        {
+            "@type": "cargo:CustomsInformation",
+            "@id": "https://1r.example.com/logistics-objects/ba1c2194-2442-400b-b26b-466a01dda8b5?at=20190926T075830Z"
+        }
+    ]
+}
+
+

(Piece_with_id.json)

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/notifications/index.html b/development/API-Security/notifications/index.html new file mode 100644 index 00000000..5172add5 --- /dev/null +++ b/development/API-Security/notifications/index.html @@ -0,0 +1,3425 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Notifications - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Notifications

+ +

ONE Record utilizes a Publish & Subscribe pattern to enable exchanging data updates in a distributed network of ONE Record compliant platforms.

+

A key pillar of the implementation of this concept is asynchronous communication via HTTP. +To enable asynchronous communication via HTTP, every ONE Record server MUST provide a Notification REST API endpoint that can be used by ONE Record clients to submit Notifications about data changes and updates.

+

This chapter describes the the requirements of a Notifications API which a ONE Record server MUST implement (1) to receive information about new created or updated Logistics Objects, (2) or to receive status updates of action requests from other ONE Record nodes.

+

For the former, the initialization of this data exchange channel is described in the Subscription chapter. +The latter is set up when notifyRequestStatusChange is set to true in the request for a Change, AccessDelegation , or Subscription.

+

Guidelines for Notifications in ONE Record:

+
    +
  • Every ONE Record server MUST implement a Notifications endpoint to receive data from ONE Record clients
  • +
  • The ONE Record Notifications endpoint MUST be accessible to any authenicated ONE Record client
  • +
  • The ONE Record Notificatons endpoint MUST expect a Notification object in the POST request body
  • +
  • The ONE Record Notificatons MUST respond with a HTTP response when it receives the Notification
  • +
  • The ONE Record Notificatons MUST support HTTP 1.1
  • +
  • The ONE Record Notificatons MUST support TLS 1.2
  • +
+

Notification Data Model

+

The Notification is a data class of the ONE Record API ontology. +The properties and relationships to other data classes are visualized in the following class diagram.

+
    classDiagram
+
+    direction LR   
+
+    class LogisticsObject{                
+    }
+
+    class Organization{        
+    }  
+
+    class ActionRequest {
+        <<Abstract>>         
+        + hasError[]: Error [*]
+        + isRequestedAt: xsd:dateTime         
+        + isRequestedBy: Organization            
+        + isRevokedBy: Organization 
+        + hasRequestStatus: RequestStatus = REQUEST_PENDING
+        + revokedAt: xsd:dateTime                 
+    }
+    ActionRequest <|-- AccessDelegationRequest
+    ActionRequest <|-- ChangeRequest
+    ActionRequest <|-- SubscriptionRequest
+
+    ActionRequest "1" --> "1..*" Organization : requestedBy    
+    ActionRequest --> RequestStatus                
+    ActionRequest "1" --> "1..*" Organization : revokedBy
+
+    class Notification{
+        + hasChangedProperty[]: xsd:anyURI [*]        
+        + hasEventType: NotificationEventType
+        + isTriggeredBy: ActionRequest [0..1]  
+        + hasLogisticsObject: LogisticsObject [0..1]
+        + hasLogisticsObjectType: xsd:anyURI [0..1]     
+    }
+    Notification "1"--> "0..1" LogisticsObject
+    Notification "1" --> "1" NotificationEventType
+    Notification "1" --> "0..1" ActionRequest  
+
+    class NotificationEventType{
+        <<Enumeration>>
+        LOGISTICS_OBJECT_CREATED
+        LOGISTICS_OBJECT_UPDATED
+
+        LOGISTICS_EVENT_RECEIVED
+
+        CHANGE_REQUEST_PENDING
+        CHANGE_REQUEST_ACCEPTED                
+        CHANGE_REQUEST_REJECTED
+        CHANGE_REQUEST_FAILED        
+        CHANGE_REQUEST_REVOKED
+
+
+        ACCESS_DELEGATION_REQUEST_PENDING
+        ACCESS_DELEGATION_REQUEST_ACCEPTED                
+        ACCESS_DELEGATION_REQUEST_REJECTED
+        ACCESS_DELEGATION_REQUEST_FAILED
+        ACCESS_DELEGATION_REQUEST_REVOKED
+
+        SUBSCRIPTION_REQUEST_PENDING
+        SUBSCRIPTION_REQUEST_ACCEPTED                
+        SUBSCRIPTION_REQUEST_REJECTED
+        SUBSCRIPTION_REQUEST_FAILED
+        SUBSCRIPTION_REQUEST_REVOKED
+    }
+
+    class RequestStatus{
+        <<Enumeration>>
+        REQUEST_PENDING
+        REQUEST_ACCEPTED
+        REQUEST_REJECTED
+        REQUEST_FAILED
+        REQUEST_REVOKED        
+    }
+

Send Notification

+

Endpoint

+
 POST {{baseURL}}/notifications
+
+

Request

+

The following HTTP header parameters MUST be present in the request:

+ + + + + + + + + + + + + + + +
HeaderDescriptionExamples
AcceptThe content type in which the ONE Record client wants the HTTP response formatted.application/ld+json
+

The HTTP body must contain a valid Notification in the format as specified by the Content-Type in the header.

+

The publisher sends a notification request to the subscriber when a logistics object is created or updated. +If the subscriber chose to receive the entire logistics object body via sendLogisticsObjectBody=true field, then the whole object is sent.

+
+

Note

+

If the embedded object of a LogisticsObject changed, the Notification#hasChangedProperty will contain the IRI of the embeddedObject, for example: +The hasGrossWeight property - which is of type Value - of a Piece is changed via ChangeRequest, the hasChangedProperty of the Notification will contain https://onerecord.iata.org/ns/cargo#hasGrossWeight

+
+

Response

+

One of the following HTTP status codes MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
204The request has been successful-
400Notification format is invalidError
401Not authenticated, invalid or expired tokenError
403  Not authorized to perform actionError
404  Resource Not FoundError
405  Method not allowedError
415  Unsupported content typeError
500  Internal Server ErrorError
+

A successful request MUST return a HTTP/1.1 204 No Content status code.

+

Security

+

To engage with the "Send Notifications" endpoint, a client needs to be authenticated. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status.

+

Example 1A

+

The following example shows a LOGISTICS_OBJECT_CREATED Notification without the content of the object, +because sendLogisticsObjectBody in Subscription is set to False.

+

Request:

+

POST /notifications HTTP/1.1
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {        
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Notification",    
+    "api:hasEventType": {
+        "@id": "api:LOGISTICS_OBJECT_CREATED"
+    },
+    "api:hasLogisticsObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    },
+    "api:hasLogisticsObjectType": {
+        "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+        "@value": "https://onerecord.iata.org/ns/cargo#Piece"
+    },
+    "api:isTriggeredBy": {
+        "@id": "https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed"
+    }
+}
+
+(Notification_example1.json)

+

Response: +

HTTP/1.1 204 No Content
+

+

Example 1B

+

The following example shows a LOGISTICS_OBJECT_CREATED Notification with the content of the object, +because sendLogisticsObjectBody in Subscription is set to True.

+

POST /notifications HTTP/1.1
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Notification",
+    "api:hasEventType": {
+        "@id": "api:LOGISTICS_OBJECT_CREATED"
+    },
+    "api:hasLogisticsObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c",
+        "@type": "cargo:Shipment",
+        "cargo:goodsDescription": "Lots of awesome ONE Record information materials",
+        "cargo:pieces": [{
+            "@type": "cargo:Piece",
+            "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+        }]
+    }, 
+    "api:hasLogisticsObjectType": {
+        "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+        "@value": "https://onerecord.iata.org/ns/cargo#Shipment"
+    },   
+    "api:isTriggeredBy": {
+        "@id": "https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed"
+    }
+}
+
+(Notification_example2.json)

+

Response: +

HTTP/1.1 204 No Content
+

+

Example 1C

+

The following example shows a LOGISTICS_OBJECT_UPDATED Notification without the content of the object, +because sendLogisticsObjectBody in Subscription is set to False. +

POST /notifications HTTP/1.1
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {        
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Notification",
+    "api:hasChangedProperty": [
+        "https://onerecord.iata.org/ns/cargo#grossWeight"
+    ],
+    "api:hasEventType": {
+        "@id": "api:LOGISTICS_OBJECT_UPDATED"
+    },
+    "api:hasLogisticsObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    },
+    "api:hasLogisticsObjectType": {
+        "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+        "@value": "https://onerecord.iata.org/ns/cargo#Piece"
+    },
+    "api:isTriggeredBy": {
+        "@id": "https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed"
+    }
+}
+
+(Notification_example3.json)

+

Response: +

HTTP/1.1 204 No Content
+

+

Example 1D

+

The following example shows a LOGISTICS_EVENT_RECEIVED Notification after a LogisticsEvent is submitted.

+
+

Note

+

Notifications will be triggered for the creation of a new Logistics Event on a Logistics Object solely when the subscription property 'includeSubscriptionEventType' contains the value 'LOGISTICS_EVENT_RECEIVED'. On the contrary, this notification will be omitted.

+
+

POST /notifications HTTP/1.1
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {        
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Notification",
+    "api:hasEventType": {
+        "@id": "api:LOGISTICS_EVENT_RECEIVED"
+    },
+    "api:hasLogisticsObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b3c"
+    },
+    "api:hasLogisticsObjectType": {
+        "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+        "@value": "https://onerecord.iata.org/ns/cargo#Shipment"
+    } 
+}
+
+(Notification_example4.json)

+

Response: +

HTTP/1.1 204 No Content
+

+

Example 1E

+

The following example shows a CHANGE_REQUEST_ACCEPTED Notification after the ChangeRequest is accepted by the holder of the logistics object.

+

POST /notifications HTTP/1.1
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {        
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Notification",
+    "api:hasEventType": {
+        "@id": "api:CHANGE_REQUEST_ACCEPTED"
+    },
+    "api:hasLogisticsObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    },
+    "api:hasLogisticsObjectType": {
+        "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+        "@value": "https://onerecord.iata.org/ns/cargo#Shipment"
+    },
+    "api:isTriggeredBy": {
+        "@id": "https://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b"
+    }
+}
+
+(Notification_example5.json)

+

Response: +

HTTP/1.1 204 No Content
+

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/security/access-control/index.html b/development/API-Security/security/access-control/index.html new file mode 100644 index 00000000..b9869171 --- /dev/null +++ b/development/API-Security/security/access-control/index.html @@ -0,0 +1,2998 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Access Control - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Access Control

+ +

In ONE Record, access to resources can be specified by using Access Control Lists (ACLs) associated to specific Logistics Objects. +Each Logistics Object resource possesses a related ACL containing a set of Authorization statements that describe:

+
    +
  • who has access to that resource;
  • +
  • what types (or modes) of access they have.
  • +
+

Each Authorization is a single rule for access, such as "entities one and two may write to Logistics Object logisticObjectRef", described with a set of RDF properties.

+

ONE Record recommends the use of the ACL ontology in order to express the Authorizations. As the ACL is specific to each ONE Record Server and it is not a mandatory requirement to make it available to external entities, any other kind of data model/ontology can be used instead.

+

Permissions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
PermissionDescription
GET_LOGISTICS_OBJECTAuthorized to retrieve the content of a LogisticsObject
PATCH_LOGISTICS_OBJECTAuthorized to request a change of a Logistics Object
POST_LOGISTICS_EVENTAuthorized to add a Logistics Event to a LogisticsObject
GET_LOGISTICS_EVENTAuthorized to retrieve the details of a LogisticsEvent
+

Rules and recommendations related to Access Control:

+
    +
  • No Access Control Lists on property level
  • +
  • Access Control MUST be on Logistics Object level
  • +
  • Every ONE Record server MUST support at least the following permissions: GET_LOGISTICS_OBJECT, PATCH_LOGISTICS_OBJECT, POST_LOGISTICS_EVENT, GET_LOGISTICS_EVENT
  • +
  • Each ONE Server MUST deny access to certain operations by default. Therefore, if an access permission is not explicitly set, a requesting ONE Record client MUST NOT be allowed to perform the respective operations until the permission is granted. If an operation is attempted to be performed and the permissions for that operation have not been granted, the ONE Record server MUST return a 403 Forbidden HTTP error.
  • +
  • The ONE Record API specification does not define a specific model for ACL, but suggests the utilization of Access Control Ontology defined by W3C.
  • +
+

Authenticated access is similar to public access, but it is not anonymous. +Therefore, access is granted only to ONE Record clients that have authenticated and have an organizational URI to be identifiable. +In this way, a ONE Record server can track resource access and usage.

+

In ONE Record, access to resources MAY be handled by using Access Control Lists (ACLs) stored in the backend systems of the ONE Record Servers and defined using the Web Access Control standard from W3C.

+

Web Access Control and Access Control List (ACL)

+

According to W3C specifications, Web Access Control it is a standard that enforces access control based on the Access Control List (ACL) RDF resource associated with the requested resource. +It's concerned with giving access to agents (users, groups and more) to perform various kinds of operations (read, write, append, etc) on resources. +In Web Access Control, an ACL consists of a set of Authorizations. +Each Authorization is a single rule for access, such as "entities A and B may write to resource C", described with a set of RDF properties.

+

In the context of ONE Record, three types of authorization can be identified:

+
    +
  1. Single Authorization – when a single organization (identified by its Organization URI) from the ONE Record network has access to a Logistics Object.
  2. +
  3. Group Authorization – when a group of organizations has access to the Logistics Object. The ONE Record Server can define internally groups of access such as Airlines, Ground Handlers, Customs, etc.
  4. +
  5. Public Authorization – when every authenticated organization can access the Logistics Object URI can retrieve the data.
  6. +
+

The implementor of ONE Record server MUST implement Single Authorization and Public Authorization while Group Authorization is RECOMMENDED.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/security/authn-application-layer/index.html b/development/API-Security/security/authn-application-layer/index.html new file mode 100644 index 00000000..e65bdec5 --- /dev/null +++ b/development/API-Security/security/authn-application-layer/index.html @@ -0,0 +1,3953 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Authentication & Authorization - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Authentication & Authorization

+ +

The authentication mechanism employed by ONE Record servers adheres to the OpenID Connect standard. To authenticate successfully, a party must possess an ID Token issued by an authorized identity provider (IdP). This page provides an explanation of OpenID Connect and its application within the network of ONE Record servers (ONE Record network).

+

OpenID Connect

+

OpenID Connect (OIDC) is an interoperable authentication protocol based on the OAuth 2.0 framework of specifications (IETF RFC 6749 and RFC 6750). It allows third-party applications to verify the identity of the end-user and to obtain basic user profile information. OIDC uses JSON web tokens (JWTs), which you can obtain using flows conforming to the OAuth 2.0 specifications. To know more about OIDC see https://openid.net/.

+

The ONE Record server employs the OpenID Connect standard to authenticate other servers within the network.

+

OpenID Connect Roles

+

OpenID Connect outlines various actors that play specific and distinct roles in the authentication and authorization process. In the context of the ONE Record servers network, our focus will be on the main roles that hold significance.

+
    +
  • +

    Client Application: The client represents a ONE Record server that wants to access an external resouce (i.e a logistics object situated on a different ONE Record server). In this page, a client application is referred as ONE Record client

    +
  • +
  • +

    Identity Provider: The Identity Provider (IdP) holds the responsibility of authenticating a ONE Record server. It verifies the server's identity and generates an ID token that the requesting server can utilize for authentication within the ONE Record network.

    +
  • +
  • +

    Resource Server: The Resource Server is the host of protected resources that a ONE Record server aims to access. In the ONE Record context, these resources may include logistics objects, logistics events, and more. In this page, a resource server is referred as ONE Record Server.

    +
  • +
+

It's essential to understand that OpenID Connect is built on top of OAuth 2.0, which provides the framework for token-based authentication and authorization. OpenID Connect adds an authentication layer and standardizes the exchange of identity information, making it easier for ONE Record servers to authenticate other servers in the network.

+

OpenId Connect Grant Types

+

OpenID Connect (OIDC) defines various grant types that facilitate secure authentication and authorization processes in web and mobile applications. These grant types determine how tokens are exchanged between the involved parties. The "Authorization Code" grant type is widely used and involves the exchange of an authorization code for access tokens, enhancing security by keeping tokens away from the client. The "Implicit" grant type is suitable for browser-based applications, providing access tokens directly, while the "Client Credentials" grant type is employed by confidential clients to authenticate themselves and obtain access tokens directly from the authorization server. Lastly, the "Refresh Token" grant type enables the renewal of access tokens without requiring users to reauthenticate, improving user experience and security.

+

It is important to node that these grants define only the authentication procedure while the authorization to access specific resources is handled with Access Contol Lists.

+

The server's implementer holds the authority to select the preferred grant type. However, the JSON Web Token MUST follow the specifications defined in the JWT section. Within this page, a demonstration of the "Client Credential" grant type will be showcased, noted for its suitability in facilitating machine-to-machine interactions.

+

JSON Web Token

+

A JSON Web Token (JWT), pronounced "jot," is an established standard RFC 7519 that defines a concise and self-contained method for securely exchanging data in the form of a JSON object between different parties. It is essential to understand that while all JWTs are tokens, not all tokens necessarily follow the JWT standard.

+

Due to its compact nature, a JWT can be easily conveyed via a URL, as a POST parameter, or within an HTTP header, ensuring swift transmission. Within a JWT, all pertinent details about an entity are included, eliminating the need for multiple database queries. Furthermore, the recipient of a JWT can verify the token's authenticity without having to contact a server.

+

The structure of a JWT consists of three parts separated by dots ('.'). These parts are:

+
    +
  • Header
  • +
  • Payload
  • +
  • Signature
  • +
+

Example JWT Token: +

xxxx.yyyy.zzzz
+

+ +

The header generally consists of two components: the token type (JWT) and the cryptographic signing algorithm employed, like HMAC SHA256 or RSA SHA256. However, additional properties are allowed according to the JSON Web Signature (JWS) standard

+

Example header: +

{
+  "alg": "RS256",
+  "typ": "JWT",
+  "jku": "https://auth.example.com/.well-known/jwks.json",
+  "kid":"NjVBRjY5MDlCMUIwNzU4RTA2QzZFMDQ4QzQ2MDAyQjVDNjk1RTM2Qh",
+}
+
+The header in the example declares that the encoded object is a JWT and it's signed with RSA SHA256 algorithm. The optional "jku" and "kid" Header parameter contains informaion about the public key that matches the key used to digitally sign the JWS. The key is represented as a JSON Web Key (JWK).

+

In order to be compliant with ONE Record specification, the JWT token must contains the "alg" and the "typ". The other header parameter are optional but can be used to enhance the authentication process.

+

Payload

+

The payload contains the claims, which are statements about the ONE Record client server or other data. The claims are divided into three types:

+
    +
  • +

    Registered claims: These are predefined claims that are not mandatory but recommended. They include information such as the issuer (iss), subject (sub), audience (aud) and expiration time (exp). Additional registered claims can be found in the RFC7519 specification

    +
  • +
  • +

    Public claims: JWT users have the freedom to define public claims according to their requirements. However, to prevent conflicts, it is recommended to either register these public claims in the IANA JSON Web Token Registry or define them using a URI with a namespace that can withstand collisions.

    +
  • +
  • +

    Private claims: These are custom claims that are meant to be shared and used between specific parties. These claims are not part of registered or public claims

    +
  • +
+

Example payload:

+
{
+  "sub": "1234567890",
+  "name": "John Doe",
+  "admin": true
+}
+
+

Signature

+

The signature is generated by combining the encoded header, encoded payload, and a secret key (or private key in the case of RSA) using the signing algorithm specified in the header. The signature is used to verify that the token hasn't been tampered with during transmission and that it comes from a trusted source.

+

Example signature: +

RSASHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), PUBLIC_KEY, PRIVATE_KEY )
+
+The example shows how to generate a signature. The signature will be then encoded in base64 and added at the end of the JWT token, as explained in the section above.

+

JSON Web Token Claims

+

JSON Web Tokens (JWTs) consist of claims, which are statements providing information about a particular subject. As explained in the previous section, claims are store in the payload of the JWT token. Despite the fact that claims are optional, in ONE Record network, a JWT token must carry the following claims:

+
    +
  • "iss" (Issuer) Claim : The "iss" (issuer) claim identifies the principal that issued the JWT.
  • +
  • "exp" (Expiration Time) Claim : The "exp" (expiration time) claim identifies the expiration time on or after which the JWT MUST NOT be accepted for processing.
  • +
  • "logistics_agent_uri" Claim : The "logistics_agent_uri" claim carries the URI of a cargo:LogisticAgent and which identifies the logistics agent in the ONE Record network.
  • +
+
{
+  "iss": "https://auth.example.com",
+  "logistics_agent_uri": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda",
+  "exp": "2023-03-031T10:38:01.000Z"  
+}
+
+

The "iss" must be present to allowed multiple IdP in the network while the "exp" is necessary to define the expiration time of the ID token. +The "logistics_agent_uri" is necessary for authenticate the party and it's used to fill the isRequestedBy property in action requests. +Other claims can be added to the JWT Token according to the IdP configuration but might not be used by the ONE Record server.

+

Validate JSON Web Tokens

+

Validation of JSON Web Tokens should be done using third party libraries that supports the signing algorithm of the JWT Token. It is strongly advised to avoid manually validating JWTs, as it can be error-prone and might overlook critical aspects, resulting in severe security vulnerabilities. Fortunately, there are various JWT libraries available for different platforms and programming languages that handle JWT validation automatically. To find a suitable JWT library for your specific platform and programming language, you can visit JWT.io.

+

JSON Web Key Sets

+

The JSON Web Key Set (JWKS) is a collection of keys that includes the public keys required to validate any JSON Web Token (JWT) issued by the Identity Provider (IdP) and signed using the RS256 signing algorithm. For every tenant, OIDC provides a JWKS endpoint accessible at https://{yourDomain}/.well-known/jwks.json. This endpoint contains the JSON Web Key (JWK) required to validate all JWTs issued by OIDC for that specific tenant. For more information about JWKS, please refer to the specification RFC7517.

+

IATA mantains a page with the list of authorized IdP together with:

+
    +
  • the url to request a token.
  • +
  • the url to refresh a token.
  • +
  • the location of the JSON Web Key Set.
  • +
+

Any trusted IdP must immediately communicate any setup change to IATA.

+

Example - Client Credential Grant

+

In this section, a example of the Client Credential grant will be demostrated in the context of ONE Record.

+

The OIDC Client Credential Flow can be used to secure machine-to-machine (m2m) communications, where a software program, rather than a user, needs to be authenticated. In this type of grant, the client credentials are verified and an ID Token is generated. This ID token is provided in a form of a signed JSON Web Token (JWT). Any ONE Record Server can verify the authenticity of the JWT token, and so the identity of the client server, using JWKS provided by the IdP without the need of a new API call.

+

Flow Diagram

+

The following diagram shows a generic implementation of the Client Credential Flow :

+
sequenceDiagram
+    participant CA as Client Application (One Record Client)
+    participant SA as Server Application (One Record Server)
+    participant IdP as Identity Provider (IdP)
+
+    CA->>+IdP: 1. Authenticate with Client ID and Client Secret    
+    IdP->>IdP: 2. Validate Client ID and Client Secret 
+    IdP->>-CA: 3. ID Token
+
+
+    CA->>+SA: 4. Request resource with ID token  
+    SA->>SA: 5.  Validate the ID token with JWKS provided by the IdP
+    SA->>-CA: 6. Response with the resource
+
+
    +
  1. The Client Application sends credentials to the Identity Provider
  2. +
  3. The IdP validates the credentials
  4. +
  5. The IdP generates an ID token and send it to the Client Application as response
  6. +
  7. The Client Application request a resource on the Server Application attaching the ID token
  8. +
  9. The Server Application validates the ID token using the JWKS provided by the IdP
  10. +
  11. The Server Application responds with the requested resource
  12. +
+

This diagram does not shows how JWKS are shared between the IdP and the Server Application. More information can be found below in the JSON Web Key Sets section.

+

Request a Token in Client Credential Grant

+

The ONE Record server will perform a POST request in order to get an ID Token. The ID Token received can be used to authenticate towards a ONE Record server.

+

Endpoint

+

The endpoint to request a token will be provided by the Identity Provider. +Example: https://auth.example.com/token

+

Request Header Parameter

+ + + + + + + + + + + + + + + + + + + + +
Request HeaderDescriptionExamples
AuthorizationProvides credentials that authenticates a ONE Record client with an IfP. This header must be set to Basic if the IdP authentication method is set to Basic. The client_id and client_secret are provided when a client subscribes to an IdP.Basic b25lOnJlY29yZA==
Content-TypeDefine the content type of the requestapplication/x-www-form-urlencoded
+

Request Body Parameter

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Body propertyDescriptionExamples
grant_typeProvides the grant type of the request and must be set to "client_credentials"client_credentials
client_idProvides the client id generated by the IdP. This property must be set if the IdP authentication method is set to POST
client_secretProvides the client secret generated by the IdP. This property must be set if the IdP authentication method is set to POST
+

Reponse

+

One of the following HTTP status codes MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ResponseDescriptionResponse Body
200ID Token CreatedReturn a newly created ID Token
400Bad RequestError
401UnauthorizedError
500Internal Server ErrorError
+

Reponse Body

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Body propertyDescriptionExamples
access_tokenA JWT token representing a sessionsdaksmcna3249mn432mn423842....
expires_inThe number of second till session expiration600
token_typeThe type of the token. This is always set to bearerbearer
+
+

Note

+

OIDC is built upon the foundation of OAuth 2.0 (as defined in RFC 67490). It's important to note that the ID Token, which contains user identity information, is returned within the `access_token`` field as described by the OAuth specification.

+
+

Error Body

+ + + + + + + + + + + + + + + + + + + + +
Body propertyDescriptionExamples
errorName of the errorinvalid_client_id
error_descriptionDescription of the errorthe client id provided is invalid
+

Refresh token

+

The Client Credential Grant used by ONE Record does not support refresh tokens (RFC 6749 Section 4.4.2). +Refresh tokens primarily serve the purpose of allowing applications to prevent users from having to provide their username and password multiple times. +Since ONE Record server authentication does not involve any user interaction, there is no need for refresh tokens in this scenario.

+

Implementation example

+

The following section describes an example of authentication between two ONE Record servers.

+
sequenceDiagram
+    participant 1Rc as ONE Record Client
+    participant 1Rs as ONE Record Server
+    participant IdP as Identity Provider (IdP)
+
+    opt Get JSON Web Key Set
+        1Rs->>+IdP: Request JSON Web Key Set
+        IdP-->>-1Rs: JSON Web Key Set
+        1Rs->>1Rs: Cache JWKS
+    end
+
+    1Rc->>+IdP: Authenticate with Client ID and Client Secret    
+    IdP->>IdP: Validate Client ID and Client Secret 
+    IdP-->>-1Rc: ID Token
+
+    1Rc->>+1Rs: HTTP request with ID token
+    1Rs->>1Rs: Verify ID token with JSON Web Key and check Access Control Lists
+    alt is invalid or expired ID token
+        1Rs-->>1Rc: Error with status code 401
+    else is not authorized
+        1Rs-->>1Rc: Error with status code 403
+    else is valid token and authorized
+        1Rs-->>1Rc: Requested resource with status code 2xx
+    end
+    deactivate 1Rs
+
    +
  1. (Optional) The ONE Record server get the JWKS from the IdP +
    GET /.well-known/jwks.json
    +Host: auth.example.com
    +
  2. +
+

HTTP/1.1 200 OK
+Cache-Control: public, max-age=15, stale-while-revalidate=15, stale-if-error=86400
+{
+   "keys":[
+      {
+         "alg":"RS256",
+         "kty":"RSA",
+         "use":"sig",
+         "x5c":[
+            "MIIC+DCCAeCgAwIBAgIJBIGjYW6hFpn2MA0GCSqGSIb3DQEBBQUAMCMxITAfBgNVBAMTGGN1c3RvbWVyLWRlbW9zLmF1dGgwLmNvbTAeFw0xNjExMjIyMjIyMDVaFw0zMDA4MDEyMjIyMDVaMCMxITAfBgNVBAMTGGN1c3RvbWVyLWRlbW9zLmF1dGgwLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMnjZc5bm/eGIHq09N9HKHahM7Y31P0ul+A2wwP4lSpIwFrWHzxw88/7Dwk9QMc+orGXX95R6av4GF+Es/nG3uK45ooMVMa/hYCh0Mtx3gnSuoTavQEkLzCvSwTqVwzZ+5noukWVqJuMKNwjL77GNcPLY7Xy2/skMCT5bR8UoWaufooQvYq6SyPcRAU4BtdquZRiBT4U5f+4pwNTxSvey7ki50yc1tG49Per/0zA4O6Tlpv8x7Red6m1bCNHt7+Z5nSl3RX/QYyAEUX1a28VcYmR41Osy+o2OUCXYdUAphDaHo4/8rbKTJhlu8jEcc1KoMXAKjgaVZtG/v5ltx6AXY0CAwEAAaMvMC0wDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUQxFG602h1cG+pnyvJoy9pGJJoCswDQYJKoZIhvcNAQEFBQADggEBAGvtCbzGNBUJPLICth3mLsX0Z4z8T8iu4tyoiuAshP/Ry/ZBnFnXmhD8vwgMZ2lTgUWwlrvlgN+fAtYKnwFO2G3BOCFw96Nm8So9sjTda9CCZ3dhoH57F/hVMBB0K6xhklAc0b5ZxUpCIN92v/w+xZoz1XQBHe8ZbRHaP1HpRM4M7DJk2G5cgUCyu3UBvYS41sHvzrxQ3z7vIePRA4WF4bEkfX12gvny0RsPkrbVMXX1Rj9t6V7QXrbPYBAO+43JvDGYawxYVvLhz+BJ45x50GFQmHszfY3BR9TPK8xmMmQwtIvLu1PMttNCs7niCYkSiUv2sc2mlq1i3IashGkkgmo="
+         ],
+         "n":"yeNlzlub94YgerT030codqEztjfU_S6X4DbDA_iVKkjAWtYfPHDzz_sPCT1Axz6isZdf3lHpq_gYX4Sz-cbe4rjmigxUxr-FgKHQy3HeCdK6hNq9ASQvMK9LBOpXDNn7mei6RZWom4wo3CMvvsY1w8tjtfLb-yQwJPltHxShZq5-ihC9irpLI9xEBTgG12q5lGIFPhTl_7inA1PFK97LuSLnTJzW0bj096v_TMDg7pOWm_zHtF53qbVsI0e3v5nmdKXdFf9BjIARRfVrbxVxiZHjU6zL6jY5QJdh1QCmENoejj_ytspMmGW7yMRxzUqgxcAqOBpVm0b-_mW3HoBdjQ",
+         "e":"AQAB",
+         "kid":"NjVBRjY5MDlCMUIwNzU4RTA2QzZFMDQ4QzQ2MDAyQjVDNjk1RTM2Qh",
+         "x5t":"NjVBRjY5MDlCMUIwNzU4RTA2QzZFMDQ4QzQ2MDAyQjVDNjk1RTM2Qh"
+      }
+   ]
+}
+
+The IdP uses a private key to sign JWTs. +The IdP provides the public key on a URL in the form of a JSON Web Key Set (JWKS).

+
    +
  1. ONE Record client gets ID token from an IdP
  2. +
+

The ONE Record client must authenticate for this request. +As seen in the Request token API, the IdP define the authentication method as BASIC or POST

+
    +
  • POST: client_id and client_secret in the HTTP request body
  • +
  • BASIC: client_id and client_secretas username and password in the HTTP Basic auth header following the encoding explained in the API description.
  • +
+

Request: +

POST /token
+Host: auth.example.com
+Authorization: Basic bXljbGllbnRpZDpteWNsaWVudHNlY3JldA==
+Content-Type: application/x-www-form-urlencoded
+
+grant_type: "client_credentials"
+client_id: "secretid"
+client_secret: "secretpassword"
+

+

Response: +

HTTP/1.1 200 OK
+Content-Type: application/json;charset=UTF-8
+Cache-Control: no-store
+Pragma: no-cache
+
+{
+  "access_token" : "eyJhbGciOiJIUzI1NiIsImprdSI6Imh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbS8ud2VsbC1rbm93bi9qd2tzLmpzb24iLCJraWQiOiJjYmQzZDBiZi02YzIwLTRlZDMtOGFlYy1jNGFmMGI2NTdjMmEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2F1dGguZXhhbXBsZS5jb20iLCJzdWIiOiJodHRwczovLzFyLmV4YW1wbGUuY29tL2xvZ2lzdGljcy1vYmplY3RzLzk1N2UyNjIyLTlkMzEtNDkzYi04YjhmLTNjODA1MDY0ZGJkYSIsImV4cCI6IjIwMjMtMDMtMDMxVDEwOjM4OjAxLjAwMFoifQ.1mj-448srB9EEjXZWHosD79KW46Wfm7LQ6pfhrYZg4k",
+  "token_type" : "Bearer",
+  "expires_in" : 86400
+}
+

+

Using the JWT debugger to decode the ID token, returns the following JSON object:

+

Header: +

{
+  "alg": "HS256",
+  "jku": "https://auth.example.com/.well-known/jwks.json",
+  "kid": "cbd3d0bf-6c20-4ed3-8aec-c4af0b657c2a",
+  "typ": "JWT"
+}
+
+Payload: +
{
+  "iss": "https://auth.example.com",
+  "logistics_agent_uri": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda",
+  "exp": "2023-03-031T10:38:01.000Z"  
+}
+

+
    +
  1. ONE Record client sends request to ONE Record server +Having received an ID token, the ONE Record client can then send a request to a ONE Record server, using that token.
  2. +
+
GET /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJodHRwczovLzFyLmV4YW1wbGUuY29tL2xvZ2lzdGljcy1vYmplY3RzLzk1N2UyNjIyLTlkMzEtNDkzYi04YjhmLTNjODA1MDY0ZGJkYSIsImlzcyI6Imh0dHBzOi8vYXV0aC5leGFtcGxlLmNvbSIsImV4cCI6Ijg2NDAwIn0.IDnawFcz7mfHDMasHLNN7NsnFFZIxp9mVPEF9eyQou0
+
+
    +
  1. Server verifies JWT Token, checks ACLs, and returns requested Logistics Object
      +
    • If present a "kid" is present, the ONE Record can use it to find the public key and verify the JWT Token.
    • +
    • The ONE Record server MUST return a 401 Authorized Error if the token is expired or not valid.
    • +
    +
  2. +
  3. ONE Record server checks access of requesting client using ACLs
  4. +
  5. ONE Record server response to ONE Record client's request
  6. +
+
HTTP/1.1 200 OK
+Content-Type: application/ld+json
+Content-Language: en-US
+Location: https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c
+Type: https://onerecord.iata.org/ns/cargo#Piece
+Revision: 1
+Latest-Revision: 1
+
+{
+   "@context":{
+     "api": "https://onerecord.iata.org/ns/api#",
+     "@language": "en-US"
+   },
+    "@type": "https://onerecord.iata.org/ns/cargo#Piece",
+    "@id": " https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c",
+    "https://onerecord.iata.org/ns/cargo#goodsDescription": "ONE Record Advertisement Materials",
+    "https://onerecord.iata.org/ns/cargo#Piece#handlingInstructions": [
+        {
+            "@type": "https://onerecord.iata.org/ns/cargo#HandlingInstructions",
+            "https://onerecord.iata.org/ns/cargo#HandlingInstructions#serviceType": "SPH",
+            "https://onerecord.iata.org/ns/cargo#HandlingInstructions#serviceDescription": "Valuable Cargo",
+            "https://onerecord.iata.org/ns/cargo#HandlingInstructions#serviceTypeCode": "VAL"
+        }
+    ]
+}
+
+

Identity Provider

+

Identity Providers play a crucial role in the ONE Record network, responsible for authenticating parties and safeguarding the network from external threats and malicious entities.

+

Due to their critical role, IATA consistently ensures that IdPs adhere to the highest security standards and have a stringent onboarding process for new parties in place. This ongoing monitoring and verification help maintain the integrity and security of the network.

+

ONE Record servers have the option to place trust in Identity Providers (IdPs) that are not included in IATA's trusted list. However, in such cases, the servers themselves will be responsible for ensuring the trustworthiness of those external IdPs.

+

Onboarding of an Identity Provider

+

The onboarding of a new Identity Provider in ONE Record network is complex procedure which establish the integrity of the IdP. For more information, please contact the API maintainers.

+

Onboarding of a party

+

The Identity provider is responsible for the onboarding of a party in the network. A procedure to assert the identity of a new party must be in place following the industry security standard. For more information, please contact the API maintainers.

+

Multiple Identity Providers

+

The ONE Record network allows for the existence of multiple Identity Providers (IdPs). Although not obligatory, different key players may choose different Identity Providers according to their preferences.

+

Consequently, the ONE Record API must have the capability to handle multiple IdPs. Each server should be able to establish a list of trusted IdPs that ONE Record clients can use for authentication. This specification outlines how to interact with an IdP, but variations in the JWT token implementation can occur, and it is the responsibility of the IdP to provide public information about each variation.

+

To implement multiple IdPs, a ONE Record Server utilizes the 'iss' claim to identify the issuer of the token (IdP). Once the IdP is identified, the ONE Record server can utilize the appropriate JWKS (JSON Web Key Set) to validate the ID token.

+

IATA will maintain and publish a list of accredited Identity Providers. ONE Record nodes have the ability to communicate with IATA to obtain information about a specific IdP.

+

API Authentication and Autorization

+

In the following table we summarize the authentication and authorization needed for each API defined by ONE Record API specifications.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Resource / EndpointHTTP ActionAuthentication requiredAuthorization required
/GETYesNo
/logistics-objectsPOSTOnly Internal ServiceOnly Interal Service
/logistics-objects/{{logisticsObjectId}}GETYesYes
/logistics-objects/{{logisticsObjectId}}PATCHYesNo
/logistics-objects/{{logisticsObjectId}}/audit-trailGETYesYes 1
/logistics-objects/{{logisticsObjectId}}/logistics-eventsGETYesYes
/logistics-objects/{{logisticsObjectId}}/logistics-eventsPOSTYesYes 2
/logistics-objects/{{logisticsObjectId}}/logistics-events/{{logisticsEventId}}GETYesYes
/subscriptionsGETYesNo
/subscriptionsPOSTYesNo
/access-delegationPOSTYesNo
/action-requests/{{actionRequestId}}GETYesYes
/action-requests/{{actionRequestId}}PATCHOnly Internal ServiceOnly Internal Service
/action-requests/{{actionRequestId}}DELETEYesYes
/notificationsPOSTYesNo
+

The term "Only Internal Service" emphasizes that the service is exclusively accessible to internal actors and should be blocked for third-party ONE Record servers.

+

More information about the authorization mechanism can be found in the access control page.

+
+
+
    +
  1. +

    The audit trail can inherit the authorization from the Logistics Object. 

    +
  2. +
  3. +

    The implementor can decide to give access to all authenticated users. 

    +
  4. +
+
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/security/authn-transport-layer/index.html b/development/API-Security/security/authn-transport-layer/index.html new file mode 100644 index 00000000..be3a88a3 --- /dev/null +++ b/development/API-Security/security/authn-transport-layer/index.html @@ -0,0 +1,3005 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Transport Layer Security - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Transport Layer Security

+ +

Transport Layer Security (TLS)

+

Securing data exchange in the ONE Record network is NOT optional. +One way to secure the communication channel on transport layer is using TLS. +TLS stands for Transport Layer Security. It is a cryptographic protocol that provides secure communication over the internet. +TLS is the successor to the earlier SSL (Secure Sockets Layer) protocol, and is used to secure a wide range of internet communications, including email, instant messaging, virtual private networks (VPNs), and e-commerce transactions. +TLS is an essential component of public internet security, as it helps to protect sensitive information such as passwords, credit card numbers, and personal data from interception and theft by hackers and other malicious actors.

+

It is used to encrypt data sent between a client (such as a web browser or a ONE Record client) and a server (such as a website, a REST API or a ONE Record server) to prevent unauthorized access or tampering of the data while it is in transit. +It works by establishing a secure, encrypted connection between the client and server, which is authenticated using digital certificates.

+

Without TLS, a third party could intercept and read sensitive information such as API credentials and private data as it is transmitted. However, relying solely on TLS encryption, does not ensure security.

+

Workflow:

+
    +
  1. A ONE Record client connects to the ONE Record server
  2. +
  3. The ONE Record server presents its TLS certificate (issued by a trusted authority)
  4. +
  5. The ONE Record client verifies the ONE Record server's certificate
  6. +
  7. ONE Record client and ONE Record server exchange data over an encrypted TLS connection
  8. +
+
    sequenceDiagram
+        participant C as ONE Record Client
+        participant S as ONE Record Server
+
+        C->>S: Establish TCP Connection to ONE Record server
+        S-->>C: Present TLS certificate to ONE Record client
+        C->>C: Verify TLS certificate
+        C->>S: Exchange data over encrypted TLS connection
+        S-->>C: Exchange data over encrypted TLS connection       
+

Guidelines on the usage of TLS in ONE Record:

+
    +
  • Every ONE Record server MUST force the use of TLS for every ONE Record endpoint.
  • +
  • Eery ONE Record MUST support TLS 1.2 or newer. Furthermore, every ONE Record MUST set the minium TLS version to 1.2. A minimum TLS version only accepts incoming HTTPS connections from ONE Record clients that support the selected TLS protocol version or a newer version.
  • +
+
+

Note

+

Because the certificates used for TLS are only as trustworthy as the Certificate Authority (CA) that issues them, IATA maintains a list of trusted CAs. +The CAs on this list are subject to rigorous audits.

+
+

Mutual Transport Layer Security (mTLS)

+

Mutual Transport Layer Security (mTLS) is an end-to-end mutual authentication security method that ensures that the client and server exchange information about their claimed identities and that traffic is secure and trusted in both directions. This is an extension of TLS, which only proves the identity of the server to the client and leaves the authentication of the client to the server to the application layer, e.g., using oAUTH2.

+

mTLS is often used in a 0-trust environment because it strictly limits which clients are allowed to connect to a server, regardless of where the client is located (e.g., VPN, internal network, etc.) and regardless of any credentials. +mTLS is more commonly used in (closed) environments where a limited number of services and servers communicate with each other. This has limited applicability to the ONE Record open data ecosystem approach.

+

Workflow:

+
    +
  1. A ONE Record client connects to the ONE Record server
  2. +
  3. The ONE Record server presents its TLS server certificate to the ONE Record client
  4. +
  5. The ONE Record client verifies the ONE Record server's certificate
  6. +
  7. The ONE Record client presents its TLS client certificate to the ONE Record server
  8. +
  9. The ONE Record server verified the ONE Record client's certificate
  10. +
  11. THE ONE Record server grants access
  12. +
  13. ONE Record client and ONE Record server exchange data over an encrypted TLS connection
  14. +
+
    sequenceDiagram
+        participant C as ONE Record Client
+        participant S as ONE Record Server
+
+        C->>S: Establish TCP Connection to ONE Record server
+        S-->>C: Present TLS certificate to ONE Record client
+        C->>C: Verify TLS certificate
+        C->>S: Present TLS certificate to ONE Record server
+        S->>S: Verify TLS certificate (& grant access)        
+        C->>S: Exchange data over encrypted TLS connection
+        S-->>C: Exchange data over encrypted TLS connection       
+

Advantages of mTLS:

+
    +
  • More secure than TLS, because it validates not only server's certificate, but also client'certificate
  • +
  • Authentication of client on protocol layer.
  • +
+

Note on disadvantages of mTLS:

+
    +
  • Complex to implement, rollout for high number of clients/server. Requires an additional secure communication channel to exchange certificates (inl. private key).
  • +
  • Complex to manage, because ONE Record server and ONE Record client must maintain certificates of all ONE Record applications with which they exchange data, considering expiry dates, revocations, drop of root CAs
  • +
  • Computationally costly and slower than TLS, because of the extra mTLS handshake for every connection
  • +
  • TLS and mTLS works best when an open connection is used for multiple requests
  • +
  • Less user-friendly and rarely used in end-user API applications
  • +
  • Depending on setup, termination of mTLS may hinder the passing of authentication details to ONE Record server for authorization.
  • +
+

Guidelines for the usage of mTLS in ONE Record:

+
    +
  • mTLS is RECOMMENDED for highly sensitive data exchange using ONE Record
  • +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/security/security-overview/index.html b/development/API-Security/security/security-overview/index.html new file mode 100644 index 00000000..9d138639 --- /dev/null +++ b/development/API-Security/security/security-overview/index.html @@ -0,0 +1,2933 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Overview - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Overview

+ +

This section describes the mechanisms and guidelines for securing the ONE Record API, +which enables the connection between ONE Record clients and servers on the ONE Record network.

+

Background

+

When exchanging data, each party needs to know with certainty the true identity of the other party and that they have the authority to receive or share the data. +They also need to be certain that the data being shared is private, secured, and confidential and cannot be intercepted or changed by any unauthorized third party. +The ONE Record security framework works globally and for all stakeholders in the full logistics and transport supply chain, +and in compliance with corporate and local data security requirements.

+
+

Security overview +

+
Security overview
+
+

IT and business experts from the industry from ONE Record Task Force have explored and discussed the different connectivity configurations within the ONE Record network and two models – possibly complementary – were retained.

+

ONE Record Security specifications are built around two concepts: mutual TLS (short for Transport Layer Security) and OAuth2 (an authorization protocol). +Mutual TLS secures all the Node-to-Node channels whereas OAuth2 adds an extra security layer for identification and authentication.

+

IATA has conceptualized a first practical implementation, which is promoted as the official security model for ONE Record. This implementation is split in two modules: +• TLS authentication support, including the definition of certificate profiles and practical use of digital certificates for client and server certificates; +• Token-based authentication support, including a practical implementation using OIDC as authentication protocol, based on the concept of a “Trusted Identity Provider”. +The next sections provide more detailed descriptions on the chosen security models and common use cases.

+

This section presents these models and showcases the implications and benefits that they bring to the air cargo industry.

+
    +
  • Authentication (authn) has to do with identity: are you who you’re claiming to be?
  • +
  • Authorization (authz) has to do with policy: are you allowed to do the thing you’re trying to do?
  • +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/server-information/index.html b/development/API-Security/server-information/index.html new file mode 100644 index 00000000..3eb9bd88 --- /dev/null +++ b/development/API-Security/server-information/index.html @@ -0,0 +1,3204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Server Information - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Server Information

+ +

Get Server Information

+

As a ONE Record client, it is helpful to know the capabilities of a ONE Record server and to be able to retrieve this information in a systematic way. +Therefore, every ONE Record server MUST provide an endpoint that can be used to retrieve this technical server information. +This ServerInformation include details about the ONE Record server's ONE Record capabilities, the data holder (as a link to an Organization using the Organization URI), the supported Logistics Object types (incl. data model versions) and the supported serialization formats.

+

The ServerInformation is a data class of the ONE Record API ontology. The properties and relationships to other data classes are visualized in the following class diagram.

+
classDiagram   
+    direction LR   
+
+    class Organization{        
+    }  
+
+    class ServerInformation{
+        + hasDataHolder: Organization                
+        + hasServerEndpoint: xsd:anyURI        
+        + hasSupportedApiVersion[]: xsd:string [1..*]
+        + hasSupportedContentType[]: xsd:string [1..*]        
+        + hasSupportedEncoding[]: xsd:string [*]
+        + hasSupportedLanguage[]: xsd:string [1..*]
+        + hasSupportedOntology[]: xsd:anyURI [1..*]
+        + hasSupportedOntologyVersion[]: xsd:anyURI [1..*]
+    }        
+    ServerInformation "1" --> "1" Organization
+

Endpoint

+
 GET {{baseURL}}/
+
+

Request

+

The following HTTP header parameters MUST be present in the request:

+ + + + + + + + + + + + + + + +
Request HeaderDescriptionExamples
AcceptThe content type that you want the HTTP response to be formatted in.application/ld+json
+

Response

+

One of the following HTTP status codes MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
200The request to retrieve the ServerInformation has been successfulServerInformation
301  Indicate that the server has moved permanently to a new locationNo response body
401  Not authenticated or expired tokenError
403  Not authorized to perform actionError
404  Resource Not FoundError
405  Method not allowedError
415  Unsupported content typeError
500  Internal Server ErrorError
+

A successful request MUST return a HTTP/1.1 200 OK status code and the following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Response HeaderDescriptionExample
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
Content-LanguageDescribes the language(s) for which the requested resource is intended.en-US
Last-ModifiedThe date and time of the most recent change to the server information. See https://developer.mozilla.org/en-US/docs/Web/Tue, 21 Feb 2023 07:28:00 GMT
+

The HTTP body must contain a valid ServerInformation object in the format as specified by the Content-Type in the header.

+

Security

+

Any authenticated ONE Record client that is aware of this endpoint should have the capability to request Server Information from the ONE Record server. Therefore, access control should not be applied to this endpoint, and authentication alone should suffice.

+

Example A1

+

Request:

+
GET / HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+

Response:

+

HTTP/1.1 200 OK
+Content-Type: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@id": "https://1r.example.com/",
+    "@type": "api:ServerInformation",
+    "api:hasDataHolder": {
+        "@type": "cargo:Company",
+        "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+    },
+    "api:hasServerEndpoint": "http://1r.example.com",
+    "api:hasSupportedApiVersion": [
+        "2.0.0-dev"
+    ],
+    "api:hasSupportedContentType": [
+        "application/ld+json"
+    ],
+    "api:hasSupportedLanguage": [
+        "en-US"
+    ],    
+    "api:hasSupportedOntology": [
+        "https://onerecord.iata.org/ns/cargo/3.0.0",
+        "https://onerecord.iata.org/ns/api/2.0.0-dev"
+    ]
+}
+
+(ServerInformation.json)

+

Example A2

+

Request:

+
GET / HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+
+

Response:

+
HTTP/1.1 301 Moved Permanently
+Location: https://1r.example.org/
+
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/subscriptions/index.html b/development/API-Security/subscriptions/index.html new file mode 100644 index 00000000..069b748f --- /dev/null +++ b/development/API-Security/subscriptions/index.html @@ -0,0 +1,3887 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Subscriptions - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Subscriptions

+ +

Publish & Subscribe in ONE Record

+

ONE Record utilizes a publish & subscribe pattern to enable exchanging data updates in a distributed network of ONE Record nodes. +More precisely, In ONE Record, so-called Notification data objects are exchanged +between applications to inform other ONE Record nodes about data updates.

+

This chapter describes the publish & subscribe concept and how it MUST be implemented in ONE Record.

+
+

Note

+

Receiving data updates (via notifications) from other ONE Record nodes requires implementation of the Notifications API endpoint +(see Notifications)

+
+

Guidelines for Subscriptions in ONE Record:

+
    +
  • A Subscription MUST be immutable (unchangeable object), i.e. a Subscription cannot be changed after it is created and published.
  • +
  • Updating a Subscription requires to delete/revoke the active Subscription and create a new Subscription that MUST be communicated to other ONE Record nodes.
  • +
  • The publisher of a Notification MUST ensure the guaranteed delivery.
  • +
  • It is RECOMMENDED to implement for each subscriber and each topic a message queue that is maintained by the publisher. While in transit, data is kept in message queues that ensure integrity and availability of the system. If a subscribing application is unavailable, messages are safely retained until the subscribing application returns to be available.
  • +
  • The publisher MUST ensure the guaranteed delivery. That means keeping data until the subscriber confirms it has received a particular Notification.
  • +
+

Subscription Data Model

+

The Subscription and SubscriptionRequest are data classes of the ONE Record API ontology. +The properties and relationships to other data classes are visualized in the following class diagram.

+
classDiagram
+    direction LR
+
+    class Organization{
+    }
+
+    class SubscriptionRequest{
+        + hasSubscription: Subscription
+    }   
+    SubscriptionRequest "1" --> "1" Subscription
+
+    class Subscription{        
+        + hasContentType[]: xsd:string [*]
+        + hasDescription: xsd:string [0..1]
+        + expiresAt: xsd:dateTime [0..1]                                
+        + hasSubscriber: Organization        
+        + hasTopicType: TopicType        
+        + notifyRequestStatusChange: xsd:boolean = FALSE
+        + sendLogisticsObjectBody: xsd:boolean = FALSE 
+        + includeSubscriptionEventType[]: SubscriptionEventType [1..*]     
+        + hasTopic: xsd:anyURI        
+    }    
+    Subscription "1" --> "1" Organization: hasSubscriber
+    Subscription --> TopicType
+    Subscription "1" --> "1..*" SubscriptionEventType
+
+    class TopicType{
+        <<Enumeration>>
+        LOGISTICS_OBJECT_TYPE
+        LOGISTICS_OBJECT_IDENTIFIER
+    }
+
+    class SubscriptionEventType{
+        <<Enumeration>>
+        LOGISTICS_OBJECT_CREATED
+        LOGISTICS_OBJECT_UPDATED
+        LOGISTICS_EVENT_RECEIVED
+    }
+

Two scenarios were identified for initiating the publish/subscribe process:

+

1) Publisher initiates Subscription: +After creating and publishing an Logistics Object, the publisher wants to subscribe another organization to receive Notifications about the newly created Logistics Object.

+

2) Subscriber initiates Subscription: +An organization wants to receive Notifications about a specific Logistics Object or a type of Logistics Objects.

+

Both scenarios are described with examples below. For simplicity reasons, the security part was not detailed in the following diagrams.

+

Get Subscription information as Publisher

+

If the publisher of a Logistics Object - also called Holder of the Logistics Object - wants to subscribe a user of a Logistics Object - also called Subscriber in this scenario - to send Notifications about data updates and/or Logistics Events, the publisher can request the potential subscriber to provide subscription information.

+

There are two different forms of this scenario:

+ +

+

Workflow

+

As result, for both scenarios the interaction between two ONE Record participants follows the following workflow:

+
sequenceDiagram
+
+  participant PUB as Publisher
+  participant SUB as Subscriber
+
+  PUB->>+SUB: (1) Request subscription information for specific Logistics Object or Logistics Object type<br> GET /subscriptions HTTP/1.1
+  SUB-->>-PUB: (2) Returning Subscription objects<br> HTTP/1.1 OK<br>Subscription
+
+  note over PUB, SUB: After Subscription initiation
+  PUB->>SUB: (3) Send Notifications about data updates and events<br> POST /notifications HTTP/1.1
+

(Optional) Step 0 - Create and Publish a Logistics Object

+

This step is optional, because a subscription MUST also be possible for already existing Logistics Objects.

+

Step 1 - Retrieve Subscription information

+

The publisher MAY propose a Subscription to a subscriber by requesting the Subscription information from the potential subscriber. +The publisher sends a GET request to the subscriptions endpoint of a Subscriber with the proposed Logistics Object type or a specific Logistics Object URI using the query parameters topicType and topic. If the subscription proposal targets a specific Logistics Object, the subscribers MUST set the topicType=LOGISTICS_OBJECT_IDENTIFIER and provide an accessible Logistics Object URI as topic parameter. Example:

+
GET /subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_IDENTIFIER&topic=https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+
+

Step 2 - Acknowledge Subscription request +In order to acknowledge a proposal the subscriber response to the request with the Subscription information. Example: +

HTTP/1.1 200 OK 
+Content-Type: application/ld+json; version=2.0.0-dev
+Content-Language: en-US
+
+{
+  "@context": {
+    "cargo": "https://onerecord.iata.org/ns/cargo#",
+    "api": "https://onerecord.iata.org/ns/api#"
+  },
+  "@id": "https://1r.example.com/subscriptions/5f1a4869-e324-45b1-9ab0-60271ba54185",
+  "@type": "api:Subscription",
+  "api:hasContentType": "application/ld+json",
+  "api:hasSubscriber": {
+    "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+  },
+  "api:hasTopicType": {
+    "@id": "api:LOGISTICS_OBJECT_IDENTIFIER"
+  },
+  "api:includeSubscriptionEventType": [
+    {
+      "@id": "api:LOGISTICS_OBJECT_UPDATED"
+    },
+    {
+      "@id": "api:LOGISTICS_OBJECT_CREATED"
+    },
+    {
+      "@id": "api:LOGISTICS_EVENT_RECEIVED"
+    }
+  ],
+  "api:hasTopic": {
+    "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+    "@value": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+  }
+}
+

+

(Subscriptions_example1.json)

+

It is the responsibility of the publisher to check the response, i.e. to compare the requested topic/topicType with the topic/topicType in the returned Subscription data object.

+

The publisher uses the response to store it in a SubscriptionRequest, which can later be referenced in Notifications (cf. isTriggeredBy property in Notification) and used to revoke the subscription. +For example, the URI of the newly created SubscriptionRequest could be https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaee

+

The publisher MUST ensure that the subscriber gets sufficient access to the resulted SubscriptionRequest to request the status of the SubscriptionRequest and can revoke AccessDelegationRequest (see also section about revoking Action Requests

+

Here an example of a SubscriptionRequest:

+
{
+    "@context": {
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:SubscriptionRequest",
+    "@id": "https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaee",
+    "api:hasSubscription": {
+        "@id": "https://1r.example.com/subscriptions/5f1a4869-e324-45b1-9ab0-60271ba54185",
+        "@type": "api:Subscription",
+        "api:hasContentType": "application/ld+json",
+        "api:hasSubscriber": {
+            "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+        },
+        "api:hasTopicType": {
+            "@id": "api:LOGISTICS_OBJECT_IDENTIFIER"
+        },
+        "api:includeSubscriptionEventType": [
+            {
+                "@id": "api:LOGISTICS_OBJECT_UPDATED"
+            },
+            {
+                "@id": "api:LOGISTICS_OBJECT_CREATED"
+            },
+            {
+                "@id": "api:LOGISTICS_EVENT_RECEIVED"
+            }
+        ],
+        "api:hasTopic": {
+            "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+            "@value": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+          }
+    },
+    "api:isRequestedBy": {
+        "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+    },
+    "api:hasRequestStatus": {
+        "@id": "api:REQUEST_PENDING"
+    },
+    "api:isRequestedAt": {
+        "@type": "http://www.w3.org/2001/XMLSchema#dateTime",
+        "@value": "2023-04-20T10:38:01.000Z"
+    }
+}
+
+

(SubscriptionRequest_example.json)

+
+

Note

+

The @id found in the subscription details provided by the Subscriber is not mandatory, but it can serve as a means for the Subscriber to manage various subscriptions. The Subscriber has the freedom to determine the format of this identifier. To access the SubscriptionRequest, both the Subscriber and the Publisher must utilize the id assigned by the Publisher for the SubscriptionRequest (https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaee in the example), rather than the id of the Subscription.

+
+

Step 3 - Send Notification to Subscribers

+

Once the subscription information is received the publisher sends notifications to the subscriber using the details provided. +If a subscriber was not available at the time, then the publisher MUST need to queue and retry to notify the Subscriber. +Example:

+

POST /notifications HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {        
+        "api": "https://onerecord.iata.org/ns/api#"
+    },
+    "@type": "api:Notification",    
+    "api:hasEventType": {
+        "@id": "api:LOGISTICS_OBJECT_CREATED"
+    },
+    "api:hasLogisticsObject": {
+        "@id": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    },
+    "api:hasLogisticsObjectType": {
+        "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+        "@value": "https://onerecord.iata.org/ns/cargo#Piece"
+    },
+    "api:isTriggeredBy": {
+        "@id": "https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed"
+    }
+}
+
+(Notification_example1.json)

+
+

Note

+

Notifications will be triggered for the creation of a new Logistics Event on a Logistics Object solely when the subscription property 'includeSubscriptionEventType' contains the value 'LOGISTICS_EVENT_RECEIVED'. On the contrary, this notification will be omitted.

+
+

Endpoint

+
 GET {{baseURL}}/subscriptions?topicType={{topicType}}&topic={dataclass/logisticObjectURI}}
+
+

Request

+

The following HTTP query parameters MUST be supported:

+ + + + + + + + + + + + + + + + + + + + +
Query parameterDescriptionValid values / Examples
topicTypeUsed by the publisher to specify if Subscription information for a specific Logistics Object or a data class should be in the response body. When passed in a URL, the topicType must be URL encoded (i.e # becomes %23 or can be replaced with /)
topicUsed by the publisher to specify the data class or Logistics Object URI the Subscription information should be related to. topic MUST be a valid URI
  • https://onerecord.iata.org/ns/cargo#Piece
  • https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c
+

The following HTTP header parameters MUST be present in the request:

+ + + + + + + + + + + + + + + +
HeaderDescriptionExamples
AcceptThe content type that a ONE Record client wants the HTTP response to be formatted in. This SHOULD include the version of the ONE Record API, otherwise the latest supported ONE Record API MAY be applied.
  • application/ld+json
  • application/ld+json; version=2.0.0-dev
  • application/ld+json; version=1.2
+

Response

+

A successful request MUST return a HTTP/1.1 200 OK status code. +The body of the response includes the list of subscriptions in the RDF serialization format that has been requested in the Accept header of the request. +This list of subscriptions MAY also be empty.

+

The following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
Content-LanguageDescribes the language(s) for which the requested resource is intended.en-US
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
200The request to retrieve the Subscription Information has been successfulSubscriptions
400The request is invalidError
401Not authenticatedError
403Not authorized to retrieve the Subscription InformationError
500Internal Server ErrorError
+

Security

+

To engage with the "Get Subscription" endpoint, a client needs proper authentication. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status.

+

Example A1

+

Request subscription information for specific Logistics Object URI.

+

Request:

+
GET /subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_IDENTIFIER&topic=https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+
+

Response:

+
HTTP/1.1 200 OK 
+Content-Type: application/ld+json; version=2.0.0-dev
+Content-Language: en-US
+
+{
+  "@context": {
+    "cargo": "https://onerecord.iata.org/ns/cargo#",
+    "api": "https://onerecord.iata.org/ns/api#"
+  },
+  "@id": "https://1r.example.com/subscriptions/5f1a4869-e324-45b1-9ab0-60271ba54185",
+  "@type": "api:Subscription",
+  "api:hasContentType": "application/ld+json",
+  "api:hasSubscriber": {
+    "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+  },
+  "api:hasTopicType": {
+    "@id": "api:LOGISTICS_OBJECT_IDENTIFIER"
+  },
+  "api:includeSubscriptionEventType": [
+    {
+      "@id": "api:LOGISTICS_OBJECT_UPDATED"
+    },
+    {
+      "@id": "api:LOGISTICS_OBJECT_CREATED"
+    },
+    {
+      "@id": "api:LOGISTICS_EVENT_RECEIVED"
+    }
+  ],
+  "api:hasTopic": {
+    "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+    "@value": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+  }
+}
+
+

(Subscriptions_example1.json)

+

Example A2

+

Request subscription information for a Logistics Object type

+

Request:

+
GET /subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE&topic=https://onerecord.iata.org/ns/cargo#Shipment
+Host: 1r.example.com
+Content-Type: application/ld+json; version=2.0.0-dev
+
+

Response:

+
HTTP/1.1 200 OK 
+Content-Type: application/ld+json; version=2.0.0-dev
+Content-Language: en-US
+
+{
+  "@context": {
+    "cargo": "https://onerecord.iata.org/ns/cargo#",
+    "api": "https://onerecord.iata.org/ns/api#",
+    "publisher": "https://1r.example.com/",
+    "subscriber": "https://1r.example.com/"
+  },
+  "@id": "publisher:subscriptions/5f1a4869-e324-45b1-9ab0-60271ba54185",
+  "@type": "Subscription",
+  "api:contentType": "application/ld+json",
+  "api:hasSubscriber": {
+    "@id": "subscriber:logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+  },
+  "api:includeSubscriptionEventType": [
+    {
+      "@id": "api:LOGISTICS_OBJECT_UPDATED"
+    },
+    {
+      "@id": "api:LOGISTICS_OBJECT_CREATED"
+    },
+    {
+      "@id": "api:LOGISTICS_EVENT_RECEIVED"
+    }
+  ],
+  "api:hasTopicType": {
+    "@id": "api:LOGISTICS_OBJECT_TYPE"
+  },
+  "api:hasTopic": {
+    "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+    "@value": "https://onerecord.iata.org/ns/cargo#Shipment"
+  }
+}
+
+

(Subscriptions_example2.json)

+

Example A3

+

Request subscription information for a not supported Logistics Object type

+

Request:

+
GET /subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE&topic=https://onerecord.iata.org/ns/cargo#ForkLift
+Host: 1r.example.com
+Accept: application/ld+json
+
+

Response:

+

HTTP/1.1 400 Bad Request 
+Content-Type: application/ld+json; version=2.0.0-dev
+Content-Language: en-US
+
+{
+    "@context": {
+       "api": "https://onerecord.iata.org/ns/api#",
+       "@language": "en-US"
+    },
+    "@type": "api:Error",
+    "@id": "_:b0",
+    "api:hasTitle": "Logistics Object Type not supported",
+    "api:hasErrorDetail": [{
+       "@type": "api:ErrorDetail",
+       "@id": "_:b1",
+       "api:hasCode": "400",
+       "api:hasMessage": "Provided Logistics Object Type is not supported"
+    }]
+ }
+
+(Subscriptions_example3_Error_400.json)

+

Example A4

+

Required parameter topic= is missing in the HTTP query parameters.

+

Request:

+
GET /subscriptions?topicType=https://onerecord.iata.org/ns/api%23LOGISTICS_OBJECT_TYPE
+Host: 1r.example.com
+Accept: application/ld+json
+
+

Response:

+

HTTP/1.1 400 Bad Request 
+Content-Type: application/ld+json; version=2.0.0-dev
+Content-Language: en-US
+
+{
+    "@context": {
+       "api": "https://onerecord.iata.org/ns/api#",
+       "@language": "en-US"
+    },
+    "@type": "api:Error",
+    "@id": "_:b0",
+    "api:hasTitle": "Missing query parameter",
+    "api:hasErrorDetail": [{
+       "@type": "api:ErrorDetail",
+       "@id": "_:b1",
+       "api:hasCode": "400",
+       "api:hasMessage": "The required query parameter `topic` is missing."
+    }]
+ }
+
+(Subscriptions_example3_Error_400_example2.json)

+

Subscribe to Logistics Objects

+

In the second scenario, the subscriber initiates the subscription process by actively sending subscription information to the publisher. +The subscription information can either specify a type of Logistics Object or a specific Logistics Object. +The publisher creates a SubscriptionRequest from the submitted Subscription.

+
  sequenceDiagram
+
+  participant SUB as Subscriber
+  participant PUB as Publisher
+
+  SUB->>+PUB: Subscribe to either a concrete Logistics Objector a Logistics Object type <br> POST /subscriptions HTTP/1.1
+  PUB-->>-SUB: Acknowledge Subscription request and return location of SubscriptionRequest<br>HTTP/1.1 204 No Content <br> Location: <URI of SubscriptionRequest>
+
+  note over PUB, SUB: After subscription proposal process
+  PUB->>SUB: Send Notifications about data updates and events<br> POST /notifications HTTP/1.1
+

The ONE Record server must validate that : +- the topicType is one of the types described in the ONE Record API ontology +- the topic is a valid Logistics Object (i.e. https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c)or a supported Logistics Objects type (i.e https://onerecord.iata.org/ns/cargo#Shipment)

+

The Callback URL can be derived from the Organization IRI provided in the hasSubscriber property of the body request.

+

Endpoint

+
 POST {{baseURL}}/subscriptions
+
+

Request

+

The following HTTP header parameters MUST be present in the request:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExamples
AcceptThe content type that a ONE Record client wants the HTTP response to be formatted in. This SHOULD include the version of the ONE Record API, otherwise the latest supported ONE Record API MAY be applied.
  • application/ld+json
  • application/ld+json; version=2.0.0-dev
  • application/ld+json; version=1.2
Content-TypeThe content type that is contained with the HTTP body. Valid content types.application/ld+json
+

The HTTP body must contain a valid Subscription object in the format as specified by the Content-Type in the header.

+

Response

+

A successful request MUST return a HTTP/1.1 201 Created status code and the following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExamples
LocationThe URI of the newly created Logistics Objecthttps://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed
TypeThe type of the newly created Logistics Object as a URIhttps://onerecord.iata.org/ns/api#SubscriptionRequest
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
201Subscription Request has been createdNo response body
400Bad RequestError
401Not authenticatedError
403Not authorizedError
415Unsupported Content TypeError
500Internal Server ErrorError
+

Security

+

To engage with the "Get Subscription" endpoint, a client needs proper authentication. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status.

+

Example B1

+

Request subscription for a specific Logistics Object URI.

+

Request:

+

POST /subscriptions HTTP/1.1
+Host: 1r.example.com
+Accept: application/ld+json; version=2.0.0-dev
+Content-Type: application/ld+json; version=2.0.0-dev
+
+{
+  "@context": {
+    "cargo": "https://onerecord.iata.org/ns/cargo#",
+    "api": "https://onerecord.iata.org/ns/api#"
+  },
+  "@type": "api:Subscription",
+  "api:hasContentType": "application/ld+json",
+  "api:hasSubscriber": {
+    "@id": "https://1r.example.com/logistics-objects/957e2622-9d31-493b-8b8f-3c805064dbda"
+  },
+  "api:hasTopicType": {
+    "@id": "api:LOGISTICS_OBJECT_IDENTIFIER"
+  },
+  "api:includeSubscriptionEventType": [
+    {
+      "@id": "api:LOGISTICS_OBJECT_UPDATED"
+    },
+    {
+      "@id": "api:LOGISTICS_OBJECT_CREATED"
+    },
+    {
+      "@id": "api:LOGISTICS_EVENT_RECEIVED"
+    }
+  ],
+  "api:hasTopic": {
+    "@type": "http://www.w3.org/2001/XMLSchema#anyURI",
+    "@value": "https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+  }
+}
+
+(Subscription_example1.json)

+

Response:

+
HTTP/1.1 201 Created
+Location: https://1r.example.com/action-requests/599fea49-7287-42af-b441-1fa618d2aaed
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/api#SubscriptionRequest
+
+

Subscriptions with 3rd parties

+

It is feasible to initiate a subscription on behalf of a third party. In such instances, the individual making the request will differ from the individual intended to receive the notifications.

+

The entity responsible for implementing the ONE Record Server is obligated to establish a mechanism to verify the legitimacy of the intended recipient for receiving these notifications. There are scenarios where the implementor might choose to disallow this capability and verify that the authenticated user matches the intended receiver.

+
+

Note

+

Notifications are sent to the subscriber's Notification endpoint. It MUST be assumed that the subscriber performs the internal forwarding of the received notifications to the backend systems or third parties for further processing.

+
+

Unsubscribe

+

Due to changing information needs, a subscribed user of a logistics object may no longer wish to receive notifications of logistics object updates. +To unscribe, an active Subscriber MUST revoke a SubscriptionRequest. +This is explained in the Revoke Action Request section.

+

The ActionRequest URI required for the Revocation is +provided to the User with the isTriggeredBy +property in the Notification) data object. +Or it is given to the user in the HTTP response header Location to the subscription request.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/supplementary-materials/edi-integration/index.html b/development/API-Security/supplementary-materials/edi-integration/index.html new file mode 100644 index 00000000..62cd0d88 --- /dev/null +++ b/development/API-Security/supplementary-materials/edi-integration/index.html @@ -0,0 +1,3338 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EDI Integration - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

EDI Integration

+ +
+

Note

+

This page is a Draft and it's not approved by the COTB

+
+

Accepting the coexistence and integration of various communication channels between stakeholders along the supply chain, +this section provides an overview of integrating legacy EDI messages (e.g., Cargo-IMP / Cargo-XML) and ONE Record Web APIs.

+

While both technologies offer data exchange capabilities, APIs and EDI operate quite differently. +However, by adopting a data-centric approach, companies can effectively integrate ONE Record with legacy EDI messaging systems. +This enables efficient data exchange and collaboration not only in the air cargo industry but along the global supply chain.

+

This document does not delve into the specifics of information mapping between the various standards, nor does it compare the benefits and limitations of each technology. +Instead, we exemplify the communication of stakeholders - airlines, freight forwarders, and ground handling agents - +via legacy EDI messaging systems and ONE Record Web APIs with a high-level architecture.

+

Electronic Data Interchange (EDI) and Cargo-IMP/Cargo-XML

+

Electronic Data Interchange (EDI) is the electronic exchange of business documents between trading partners using a standardized format. +EDI facilitates the automated exchange of information, such as purchase orders, invoices, and shipping notices, streamlining business processes and reducing manual data entry.

+

In the air cargo industry, EDI messaging systems are employed to exchange information among stakeholders, including airlines, freight forwarders, and ground handling agents. +These systems define standards for message formats and data elements to facilitate seamless data exchange.

+

Two common EDI standards in the air cargo industry are Cargo-IMP and Cargo-XML:

+
    +
  • Cargo-IMP (Cargo Interchange Message Procedures): An older standard for EDI messages in air freight, defining a series of message formats and data elements for electronic data interchange.
  • +
  • Cargo-XML: A newer standard based on XML, designed to replace Cargo-IMP. Cargo-XML is more flexible and extensible, supporting a wider range of data elements and overcoming limitations of Cargo-IMP, such as size constraints, character sets, and data types.
  • +
+

In general, EDI messaging systems and ONE Record both serve as data exchange standards in the air cargo industry, but they differ significantly in structure, format, and approach to data exchange.

+

EDI Messaging Systems: EDI is based on a set of standards that define the structure and format of messages exchanged between trading partners. +These standards are typically industry-specific and are designed to facilitate the electronic exchange of business documents. +EDI systems follow a document-centric approach and typically operate on a data-pushing model, where messages are sent (pushed) to trading partners. +In most cases, the message itself contains the business documents, such as purchase orders, invoices, and shipping notices.

+

ONE Record: ONE Record serves as a data-sharing standard, establishing a unified view of shipments through a singular record and a single source of truth (SOT). +This standard outlines a common, extensible data model for the exchange of information, which is facilitated by standardized and secure web APIs. +Unlike EDI, ONE Record operates on a data-centric approach and follows a data-sharing model, where information is accessed and shared as needed. +In many scenarions, so called ONE Record Notifiactions are sent, informing the data consumer that data is available has been changed and notify about the location of the data. +(cf. Notifications)

+

Key Differences

+
    +
  • Document-Centric vs. Data-Centric: EDI systems are document-centric, focusing on the exchange of structured documents. In contrast, ONE Record is data-centric, focusing on the seamless sharing of single data objects with properties and are linked each other.
  • +
  • Data Pushing vs. Data Sharing: EDI relies on pushing data through messages to trading partners, while ONE Record promotes sharing data via web APIs, enabling real-time access and updates.
  • +
+

This distinction is crucial when considering the integration of ONE Record with EDI messaging systems. Understanding these differences ensures a more effective integration, leveraging the strengths of both approaches.

+

Integration Alternatives

+

The integration of ONE Record with EDI messaging systems can be approached in various ways, depending on the specific requirements of the stakeholders involved. The following scenarios outline potential integration approaches:

+
    +
  1. +

    Legacy Integration: In this scenario, both the forwarder and the airline rely on legacy EDI messaging systems. There is no integration with ONE Record, and communication is solely based on existing EDI standards.

    +
  2. +
  3. +

    ONE Record Integration: In this scenario, ONE Record integrates with legacy EDI messaging systems. The airline and the forwarder use the ONE Record API to communicate with each other.

    +
  4. +
  5. +

    Hybrid Integration: In this scenario, a combination of ONE Record and legacy EDI messaging systems is used. For example, the forwarder may use ONE Record to communicate with the airline, while the airline communicates with the ground handling agent (GHA) using legacy EDI messaging systems. This might be the most common scenario in the air cargo industry for the next years.

    +
  6. +
+

The following tables present a list of possible scenarios and the corresponding approaches:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ScenarioForwarderAirlineGHAApproach
1ONE RecordLegacyLegacy100% legacy
2LegacyONE RecordLegacy100% legacy
3LegacyLegacyONE Record100% legacy
4ONE RecordONE RecordLegacyONE Record between FF and Airline, then downgrade to EDI for GHA.
5LegacyONE RecordONE RecordONE Record possible only with GHA. Airline upgrades from EDI to ONE Record.
6ONE RecordLegacyONE RecordLegacy between Airline and GHA; Data exchange between FF and GHA might possible using ONE Record (e.g. via physicalQR-labels), but can bring problems due to Airline´s constrains.
+

The following visualizaion shows the various data exchange scenarios examplified by the integration of +Freight Forwarders (FF), Carrier (Airline) and Ground Handling Agents (GHA) using EDI and ONE Record.

+
graph LR
+    F1["FF 1"] <-- EDI --> A1[Carrier 1]
+    F2["FF 2"] <-- ONE Record --> A1
+    F3["FF 3"] <-- ONE Record --> A1
+    F4["FF 4"] <-- EDI --> A4[Carrier 4]
+    F5["FF 5"] <-- ONE Record --> A5[Carrier 5]
+    F3 <-- ONE Record --> A2[Carrier 2]
+    F3 <-- EDI --> A3[Carrier 3]
+    A1 <-- EDI --> G1[GHA 1]
+    A1 <-- ONE Record --> G2[GHA 2]              
+    A2 <-- EDI --> G3[GHA 3]    
+    A3 <-- EDI --> G4[GHA 4]
+    A4 <-- ONE Record --> G4
+    A4 <-- ONE Record --> G5[GHA 5]    
+    A5 <-- ONE Record --> G5
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Freight ForwarderCapabilityCarrierCapabilityGHACapability
FF 1EDICarrier 1EDI + ONE RecordGHA 1EDI
FF 2ONE RecordCarrier 2EDI + ONE RecordGHA 2ONE Record
FF 3EDI + ONE RecordCarrier 3EDIGHA 3EDI
FF 4EDICarrier 4EDI + ONE RecordGHA 4EDI + ONE Record
FF 5ONE RecordCarrier 5ONE RecordGHA 5ONE Record
+

Implementation Approaches

+

The integration of ONE Record with EDI messaging systems can be implemented using various approaches, depending on the specific requirements of the stakeholders involved. +The following implementation approaches outline potential strategies for integrating ONE Record with EDI messaging systems:

+

Native ONE Record Support: In this approach, ONE Record is integrated directly with the Transport Management System / Cargo Handling Information System. +This approach eliminates the need for a middleware connector and streamlines the integration process.

+

The Transport Management System is extended to support the ONE Record standard natively. +This approach eliminates the need for a middleware connector and streamlines the integration process.

+
graph TD
+    B1[Business partner 1] <--Cargo-IMP/Cargo-XML--> A[EDI messaging interface]
+    B2[Business partner 2] <--ONE Record--> T
+    A[EDI messaging interface] <--> T[ONE Record-native Transport Management System]    
+

Middleware Integration: In this approach, middleware platforms are used to integrate ONE Record with EDI messaging systems. These platforms provide data transformation, routing, and orchestration capabilities to facilitate seamless data exchange between the systems.

+
+

Middleware/Mediator Design Pattern

+

The middleware/mediator design pattern is a software architectural pattern that provides a centralized mechanism to facilitate communication and manage interactions between multiple components or systems. Instead of components communicating directly with each other, they communicate through the mediator, which coordinates the interactions and ensures that components remain loosely coupled. This pattern is particularly useful in scenarios where complex interactions need to be managed and where reducing direct dependencies between components enhances modularity and maintainability.

+

Key Characteristics:

+
    +
  • Centralized Communication: All interactions between components are routed through the mediator, simplifying the communication process.
  • +
  • Loose Coupling: Components do not need to be aware of each other; they only need to know the mediator. This reduces dependencies and enhances flexibility.
  • +
  • Simplified Interactions: The mediator encapsulates the logic for communication and coordination, making the system easier to manage and modify.
  • +
  • Enhanced Scalability: Adding or removing components becomes easier as changes are managed through the mediator rather than through multiple direct connections.
  • +
+

Applications:

+
    +
  • Integration Systems: Facilitating communication between different systems or services (e.g., integrating EDI messaging systems with ONE Record).
  • +
  • UI Components: Managing interactions between various user interface elements.
  • +
  • Event Handling: Centralizing event management in applications with complex event interactions.
  • +
+

By employing the middleware/mediator design pattern, systems can achieve better organization, reduced complexity, and improved maintainability.

+
+

The communication layer that already exists in the EDI messaging system is extended to support the integration of ONE Record. +The logic to interact is abstracted in a Communication Middleware. This middleware is responsible for handling the communication between the EDI messaging system and the ONE Record server.

+
graph TD
+    B1[Business partner 1] <--Cargo-IMP/Cargo-XML--> A[EDI messaging interface]
+    B2[Business partner 2] <--ONE Record--> O[ONE Record interface]
+    A[EDI messaging interface] <--> B(Communication Middleware)
+    O[ONE Record interface] <--> B
+    B <--> T[Transport Management System]    
+

Example: Interaction in hybrid scenario

+

The following sequence diagram represent an example of communication in case of scenario 5 of the previous table, i.e. +we consider a scenario where an airline, adopting the ONE Record standard, seeks to communicate with a forwarder still reliant on EDI messaging systems.

+

The central component of the architecture is the carrier communication interface that serves as a bridge between the ONE Record server and the EDI messaging system. +The connector is responsible for translating data between the ONE Record data model and the EDI message format, ensuring seamless data exchange between the systems.

+

For the sake of simplicity, we assume that the airline establishes a connector for each third-party company seeking to connect with EDI messages. +However, it is also possible and more efficient to use a single reusable/configurable connector component.

+

The communication interface provides the following capabilities:

+

Receive EDI Messages:

+
    +
  • Create logistics objects (createLogisticsObject)
  • +
  • Update logistics objects (createChangeRequest)
  • +
  • Create logistics events (createLogisticsEvent)
  • +
+

Receive ONE Record Notifications:

+
    +
  • Retrieve logistics objects (getLogisticsObject)
  • +
  • Generate corresponding EDI messages
  • +
+

From the ONE Record perspective, the connector acts as a proxy for the third-party company, representing it within the ONE Record network by executing ONE Record API calls based on the received EDI messages.

+

From the EDI perspective, the connector represents the airline's EDI message endpoint, triggered by notifications from the airline's ONE Record server.

+

This setup ensures efficient and seamless data exchange between ONE Record and EDI messaging systems, maintaining compatibility with legacy systems while leveraging modern data standards. +By implementing a versatile connector capable of managing multiple connections, the integration process becomes more scalable and flexible, accommodating evolving business needs.

+

The following sequence diagram illustrates the interaction between the forwarder, carrier communication interface, carrier messaging system, ONE Record server, and ground handling agent in a hybrid scenario.

+
sequenceDiagram
+    participant F as Forwarder/CCS
+    box Carrier Communication Interface
+    participant C as Carrier Messaging System
+    participant S as Carrier ONE Record Server
+    end
+    participant G as GHA
+
+    F->>C: Sends (x)FWB
+    C->>S: Publishes xFWB as LOs
+    C-->>F: Responds with FMA
+    S->>G: Notifies about LOs-Created
+    F->>C: Sends updated FWB
+    C->>S: Creates ChangeRequest on behalf of the Forwarder
+    S->>S: Accepts Fowarder ChangeRequest
+    S->>G: Notifies about LOs-Updated
+    G->>S: Requests Change to LogisticsObjects
+    S->>C: Notify a new ChangeRequest 
+    F->C: Error handling with legacy process
+    S->>S: Evaluates and accept GHA ChangeRequest
+

Implementation Guidelines

+

When integrating ONE Record with EDI messaging systems, several guidelines should be considered to ensure a successful integration.

+

Single Source of Truth (SOT)

+

A key consideration when integrating ONE Record with EDI messaging systems is maintaining a Single Source of Truth (SOT).

+

SOT is a fundamental principle in data exchange via ONE Record, stating that every data object should exist only once within the ONE Record data network. +This ensures data consistency, accuracy, and integrity across the system.

+

In cases where the original data source is not available within ONE Record, the necessary data should be retrieved from EDI messaging systems. +This data must then be hosted and published as soon as possible by other ONE Record-ready parties to maintain the SOT principle.

+

Best Practices

+

When integrating ONE Record with EDI messaging systems, consider the following best practices and integration considerations to ensure a seamless and efficient data exchange process:

+
    +
  1. +

    Understand the Differences: Recognize the distinctions between the document-centric approach of EDI systems and the data-centric approach of ONE Record. This understanding is crucial for effective integration.

    +
  2. +
  3. +

    Mapping Data Elements: Develop a comprehensive mapping of data elements between EDI message formats (Cargo-IMP/Cargo-XML) and the ONE Record data model. Ensure all necessary data is accurately translated between the two systems to maintain data consistency and integrity.

    +
  4. +
  5. +

    Message Transformation: Implement message transformation mechanisms to convert data between the ONE Record data model and the EDI message format. These mechanisms facilitate the exchange of information and ensure accurate data representation.

    +
  6. +
  7. +

    Leverage Web APIs: Utilize ONE Record's standardized and secure web APIs to facilitate data exchange. Ensure your systems can interact with these APIs efficiently and effectively.

    +
  8. +
  9. +

    Ensure Data Consistency: Implement validation checks, error handling procedures, and regular data reconciliation to maintain data consistency and accuracy during the exchange process.

    +
  10. +
  11. +

    Security Measures: Prioritize data security during integration. Use encryption, secure authentication methods, and other best practices to protect sensitive information exchanged between systems. Secure communication channels, data encryption, and access control mechanisms are essential to safeguard data.

    +
  12. +
  13. +

    Compliance: Ensure compliance with industry standards and regulations. Adherence to relevant standards and guidelines is critical for seamless integration and maintaining industry best practices.

    +
  14. +
  15. +

    Scalability and Flexibility: Design the integration with scalability and flexibility in mind. The system should accommodate future growth and changes in business needs without requiring significant rework.

    +
  16. +
  17. +

    Interoperability: Ensure interoperability between ONE Record and EDI messaging systems. Effective communication and data exchange without loss or corruption are essential for successful integration.

    +
  18. +
  19. +

    Monitoring and Logging: Implement monitoring and logging mechanisms to track data exchange between ONE Record and EDI messaging systems. These mechanisms provide visibility into the data flow and help identify and resolve issues promptly.

    +
  20. +
  21. +

    Performance: Consider performance aspects to ensure efficient and timely data exchange. Maintaining operational efficiency and meeting business requirements depends on the performance of the integration.

    +
  22. +
  23. +

    Testing: Conduct comprehensive testing of the integration between ONE Record and EDI messaging systems. Testing should cover data mapping, message transformation, error handling, security, compliance, scalability, interoperability, monitoring, and performance to ensure a robust integration solution.

    +
  24. +
+

By following these best practices and addressing these integration considerations, organizations can achieve a seamless integration of EDI messaging systems with the ONE Record WebAPI, enhancing data exchange efficiency and accuracy in the air cargo industry.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/supplementary-materials/index.html b/development/API-Security/supplementary-materials/index.html new file mode 100644 index 00000000..664d80bf --- /dev/null +++ b/development/API-Security/supplementary-materials/index.html @@ -0,0 +1,2802 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Index - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Index

+ +

Supplemenatry materials for ONE Record API specification

+

This folder contains supplementary materials for the ONE Record API specification. The materials are intended to provide additional context and guidance for implementing the ONE Record API.

+

Supplementary material typically includes relevant information that is not part of the formal specification but is useful for understanding the context, rationale, and implementation of the ONE Record API.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/tools/unit-tests/index.html b/development/API-Security/tools/unit-tests/index.html new file mode 100644 index 00000000..1d861999 --- /dev/null +++ b/development/API-Security/tools/unit-tests/index.html @@ -0,0 +1,3021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unit Test Suite - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Unit Test Suite

+ +

ONE Record API Unit Test suite

+

ONE Record is the new IATA standard for data sharing and creates a single record view of the shipment.

+

The ONE Record standard is highly technical and there is a risk that different parties interpret the specifications differently, which would lead to data quality issues and disruption of connectivity between different network players. 

+

Due to this rationale, we construct a unit test suite with the aim of verifying that any implementation aligns with the API specifications. +The unit test suite is freely available for self testing and can be run locally using Postman or any software compatible with Postman collections.

+

Suite structure

+

The Unit Test suite is divided in several sections:

+
    +
  • +

    Server Information

    +
  • +
  • +

    Logistics Objects

    +
  • +
  • +

    Logistics Events

    +
  • +
  • +

    Subscriptions

    +
  • +
  • +

    Access Delegations

    +
  • +
  • +

    Action Requests

    +
  • +
+

Every section is crafted to assess a distinct segment of the ONE Record API, operating autonomously from the other sections. Within each section, calls must be carried out sequentially. For instance, within the Logistics Events section, the prerequisite folder generates all necessary logistics objects for the test. The Create folder performs tests related to the creation of Logistics Events, while the Get folder attempts to fetch the Logistics Events generated by the preceding calls.

+

How to run the Unit Tests suite

+

As a prerequisite for utilizing the Unit Test suite, it is necessary to install Postman or a compatible software. +Once Postman is installed, please adhere to the subsequent steps to execute the Unit Tests suite.

+ +

Postman Environment

+
    +
  • Import the Collection in Postman
  • +
+

Postman Collection

+
    +
  • Navigate to the Environments tab, choose the Unit Test Setup environment, and configure the baseUrl to point to the API server under test.
  • +
+

Environment Configuration

+
    +
  • Access the Collections in the right menu and open the previously imported ONE Record API Unit Tests collection.
  • +
+

Unit Test suite

+
    +
  • Utilize the Authorization tab to configure the authorization method implemented in your server.
  • +
+

Authorization setup

+
    +
  • Once the authorization is configured, you have the option to either execute the calls individually or employ the Collection Run feature.
  • +
+

Each call comprises a set of tests that will be applied to both the response payload and response headers during execution. It's crucial to emphasize that the presentation of test results may vary depending on the tool being used.

+

In case of issues with the Unit Test Suite, please contact the IATA Digital Cargo team (see Community page).

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/API-Security/verifications/index.html b/development/API-Security/verifications/index.html new file mode 100644 index 00000000..f77fb8e3 --- /dev/null +++ b/development/API-Security/verifications/index.html @@ -0,0 +1,3333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Verifications - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Verifications

+ +
+

Note

+

This page is a Draft and it's not approved by the COTB

+
+

In addition to allowing third parties to propose modifications to specific properties of a LogisticsObject +(See Update a Logistics Object), +the ONE Record standard provides a solution for flagging anomalies, missing properties, or errors within these objects +through a procedure called VerificationRequest.

+

Error Handling with Verification Request

+

The following diagram illustrates a basic data exchange process between a forwarder and a carrier, focusing on error handling using a Verification Request. +The forwarder creates a LogisticsObject of type Shipment and +notifies the carrier. Upon receiving the shipment, the carrier identifies any discrepancies in the goods description and reports these issues back to the forwarder +using by sending a Verification object. The forwarder creates a +VerificationRequest linking the Verification object sent +by the carrier. Depending on the case, the forwarder acknowledges or rejects the Verification Request.

+
sequenceDiagram
+    participant Forwarder
+    participant Carrier
+
+    Forwarder->>Forwarder: Create shipment LogisticsObject on its ONE Record server
+    Forwarder->>Carrier: Notify about the creation of the shipment using notification endpoint
+    Carrier->>Carrier: Review the shipment object and identify issues in goods description
+    Carrier->>Forwarder: Request a verification of the incorrect goods description property
+    Forwarder-->>Carrier: Response with link to VerificationRequest object
+    Forwarder->>Forwarder: Acknowledge VerificationRequest and rectify the shipment object
+    Forwarder->>Carrier: Notify about the update of the shipment 
+

Guidelines for Verifications in ONE Record:

+
    +
  • The hasLogisticsObject and the hasRevision allows the party to target a specific version of a logistics object
  • +
  • The hasError property is an array of Error objects. As in all other Action Requests, notifyRequestStatusChange allows to receive notification on status change.
  • +
  • Each issue or anomaly on a specific logistics object will be incapsulated into a Error object which contains two attributes: HasTitle and HasErrorDetail.
  • +
  • Should users need to convey a specific message, indicate a particular property, or transmit an error code, they can utilize the ErrorDetail object for this purpose.
  • +
+

Request Verification

+

Endpoint

+
POST {{baseURL}}/logistics-objects/{{logisticsObjectId}}
+
+

Request

+

The following HTTP header parameters MUST be present in the POST request:

+ + + + + + + + + + + + + + + + + + + + +
Request HeaderDescriptionExamples
AcceptThe content type that you want the HTTP response to be formatted in.application/ld+json
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
+

The HTTP request body must contain a valid Verification object in the format as specified by the Content-Type in the header.

+

The Verification is a data classes of the ONE Record API ontology. +The properties and relationships to other data classes are visualized in the following class diagram.

+
    classDiagram
+
+    direction LR   
+
+    class LogisticsObject{                
+    }
+
+    class Error{        
+        + hasErrorDetail[]: ErrorDetail [1..*]
+        + hasTitle: xsd:string
+    }
+    Error "1" --> "*" ErrorDetail
+
+    class ErrorDetail{
+        + hasCode: xsd:string  [0..1] [0..1]
+        + hasMessage: xsd:string [0..1]
+        + hasProperty: xsd:anyURI [0..1]
+        + hasResource: xsd:anyURI [0..1]
+    }
+
+
+    class Verification{      
+        + hasLogisticsObject: LogisticsObject
+        + hasError[]: Error[1..*]        
+        + hasRevision: xsd:positiveInteger        
+        + notifyRequestStatusChange: xsd:boolean = FALSE
+    }
+    Verification "1" --> "1" LogisticsObject
+    Verification "1" --> "1..*" Error
+

Response

+

A successful request MUST return a `HTTP/1.1 201 Created status code and the following HTTP headers parameters MUST be present in the response:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
LocationThe URI of the newly created VerificationRequesthttps://1r.example.com/action-requests/6b948f9b-b812-46ed-be39-4501453da99b
TypeThe type of the newly created resource as a URIhttps://onerecord.iata.org/ns/api#VerificationRequest
+

Otherwise, an Error object with ErrorDetail as response body MUST be returned with the following HTTP headers:

+ + + + + + + + + + + + + + + + + + + + +
HeaderDescriptionExample
Content-TypeThe content type that is contained with the HTTP body.application/ld+json
Content-LanguageDescribes the language(s) for which the requested resource is intended.en-US
+

The following HTTP status codes MUST be supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescriptionResponse body
201The change request was correctly createdNo body required
400The verification request body is invalidError
401Not authenticatedError
403Not authorized to update the Logistics ObjectError
404Logistics Object not foundError
415Unsupported Content Type, response when the client sends a POST document format that the server does not support for the resource identified by the Request-URI.Error
422Unprocessable request, when the server understands the POST document and the syntax of the POST document appears to be valid, but the server is incapable of processing the request.Error
+

Security

+

To engage with the "Verification" endpoint, a client needs proper authentication. If requests lack proper authentication, the ONE Record server should respond with a 401 "Not Authenticated" status.

+

Example A1

+

A carrier identifies an issue on a Piece with the URI https://1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c

+

Request:

+

POST /logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c HTTP/1.1
+Host: 1r.example.com
+Content-Type: application/ld+json; version=2.0.0-dev
+Accept: application/ld+json; version=2.0.0-dev
+
+{
+    "@context": {
+        "cargo": "https: //onerecord.iata.org/ns/cargo#",
+        "api": "https: //onerecord.iata.org/ns/api#",
+        "xsd": "http://www.w3.org/2001/XMLSchema"
+    },
+    "@type": "api:Verification",
+    "api:hasLogisticsObject": {
+        "@id": "https: //1r.example.com/logistics-objects/1a8ded38-1804-467c-a369-81a411416b7c"
+    },
+    "api:hasError": [{
+            "@type": "api:Error",
+            "api:hasTitle": "The gross weight is missing",
+            "api:hasErrorDetail": {
+                "@type": "api:ErrorDetail",
+                "api:hasCode": "AWB07",
+                "api:hasMessage": "weight code",
+                "api:hasProperty": {
+                    "@value": "https: //onerecord.iata.org/ns/cargo#grossWeight",
+                    "@type": "xsd:anyURI"
+                }
+            }
+        }, {
+            "@type": "api:Error",
+            "api:hasTitle": "Empty goodsDescription. Please use goodsDescription to specify the description of the cargo",
+            "api:hasErrorDetail": {
+                "@type": "api:ErrorDetail",
+                "api:hasProperty": {
+                    "@value": "https: //onerecord.iata.org/ns/cargo#goodsDescription",
+                    "@type": "xsd:anyURI"
+                }
+            }
+        }
+    ],
+    "api:hasRevision": {
+        "@type": "http: //www.w3.org/2001/XMLSchema#positiveInteger",
+        "@value": "1"
+    }
+}
+
+(Verification.json)

+

Response: +

HTTP/1.1 201 Created
+Location: https://1r.example.com/action-requests/e4cf1ea5-96fc-4025-be21-159b779e3200
+Content-Type: application/ld+json; version=2.0.0-dev
+Type: https://onerecord.iata.org/ns/api#VerificationRequest
+

+

see also Example A2 in Action Requests for an example of a Verification Request.

+

Open Issues & Discussions

+

Audit Trail update

+
+

Note

+

(under discussion). see Introduction of VerificationRequest #218

+
+

For full transparency, all VerificationRequest objects MUST be linked in the AuditTrail. For this reason the hasChangeRequest in the audit trail should be renamed into hasActionRequest and it should contains both Verification Requests and Change Requests.

+

ChangeRequest update

+
+

Note

+

(under discussion). see Introduction of VerificationRequest #218

+
+

In order to reference a VerificationRequest while requesting a Change (see Update a Logistics Object, we would like to add a new optional property in the Change object: +- hasVerificationRequest : link to the VerificationRequest that caused the change.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/activity-model/index.html b/development/Data-Model/activity-model/index.html new file mode 100644 index 00000000..a93d1de1 --- /dev/null +++ b/development/Data-Model/activity-model/index.html @@ -0,0 +1,3346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Activity Model - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Activity Model

+ +

ONE Record data model 3.0 introduced an activity model. It is built on the superclasses LogisticsService, LogisticsActivity, LogisticsAction, and PhysicalLogisticsObject. +The activity model is developed based the design principles Single Source of Truth and Physics-orientation. Further emphasis lays on practicality over abstractation. +This page details the core concepts including examples.

+

LogisticsServices

+

A LogisticsService (a subtype of LogisticsObject) describes a set of scheduled and sequenced LogisticsActivities provided by one party to another. +The properties are described here.

+
+

LogisticsService +

+
LogisticsService and connected objects
+
+

Booking

+
    +
  • TBD
  • +
+

LogisticsActivities

+

A LogisticsActivity (a subtype of LogisticsObject) describes an activity or process state which is scheduled and executed by an orchestrating party. +It involves a set of dedicated tasks in the form of specific LogisticsActions to be performed on PhysicalLogisticsObjects. +Some activities are directly bound to a specific PhysicalLogisticsObject. +It can be part of one or multiple LogisticsServices. +It has an execution status that is actively maintained. +The properties are described here.

+
+

LogisticsActivity +

+
LogisticsActivity and connected objects
+
+

UnitComposition

+

An UnitComposition (a subtype of LogisticsActivity) describes the process state of a packed/loaded LoadingUnit (Container, ULD, Pallet, ...). +It requires a 1:1 connection to a LoadingUnit as long as its execution status is Active. +Composing (a LogisticsAction) is used to model the tasks of composing (cargo:Composition) or decomposing (cargo:Decomposition) Pieces for the UnitComposition. +An UnitComposition typically begins with a Composition at one location (eg. warehouse of origin) and ends with a Decomposition at another location (eg. warehouse of departure). +The properties are described here.

+
+

UnitComposition +

+
UnitComposition and connected objects
+
+

TransportMovement

+
    +
  • TBD
  • +
+

Storage

+
    +
  • TBD
  • +
+

LogisticsActions

+

A LogisticsAction (a subtype of LogisticsObject) describes a specific task performed on one or a set of PhysicalLogisticsObjects in the context of a LogisticsActivity. +LogisticsActions serve the purpose of connecting different PhysicalLogisticsObjects to each other and to an LogisticsActivity. +It is set at a specific point in time. This can also be a time frame (start and end time). The time type can be either requested, planned or actual. +The properties are described here.

+
+

LogisticsAction +

+
LogisticsAction and connected objects
+
+

Composing

+
    +
  • TBD
  • +
+

Loading

+
    +
  • TBD
  • +
+

Storing

+
    +
  • TBD
  • +
+

Check

+
    +
  • TBD
  • +
+

PhysicalLogisticsObjects

+

A PhysicalLogisticsObject (a subtype of LogisticsObject) is the digital twin of a physically distinguishable object in the air cargo supply chain. +It interacts with other PhysicalLogisticsObjects and LogisticsActivities through LogisticsActions. +Some PhysicalLogisticsObjects are directly connected to an LogisticsActivity describing its state. +The properties are described here.

+
+

PhysicalLogisticsObject +

+
PhysicalLogisticsObject and connected objects
+
+

Piece

+
    +
  • TBD
  • +
+

LoadingUnit

+
    +
  • TBD
  • +
+

TransportMeans

+
    +
  • TBD
  • +
+

Examples

+

Booking with 2 loose and 1 palletized pieces on one flight

+
+

Example 1 +

+
Booking with 2 loose and 1 palletized pieces on one flight
+
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/businessrequirements/index.html b/development/Data-Model/businessrequirements/index.html new file mode 100644 index 00000000..ac2476ce --- /dev/null +++ b/development/Data-Model/businessrequirements/index.html @@ -0,0 +1,2843 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Overview - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Overview

+ +

ONE Record data model has been designed based on technical requirements on one hand (moving from an EDI landscape to data sharing) and on business requirements on the other hand.

+

This part focuses on Business requirements that come from various sources: +- IATA CSC Resolutions and Recommended Practices as published in the IATA CSC Resolutions Manual (including standards and regulations) +- IATA Working group specific outcomes that fall under IATA Boards governance

+

In order to ensure ONE Record compliance with business requirements we have analyzed the existing documentation and proposed an approach to use ONE Record to convey relevant information.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/co2emissions/index.html b/development/Data-Model/co2emissions/index.html new file mode 100644 index 00000000..e386434f --- /dev/null +++ b/development/Data-Model/co2emissions/index.html @@ -0,0 +1,2945 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CO2 Emission - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

CO2 Emission

+ +

Requirements

+

CO2 Emissions transparency is an essential topic in order to move toward a more sustainable industry. IATA has been addressing CO2 Emissions measurement methodology, joint with ICAO, in the Recommended Practice 1678, more details can be found on IATA’s website dedicated page: https://www.iata.org/en/programs/cargo/sustainability/carbon-footprint/
+Our objective is to provide necessary information in the data model to be able to calculate or predict CO2 emissions for transport movements. Required information relate to: +- Typical CO2 coefficient +- Distance of the transport movement, calculated and measured +- Fuel consumed, calculated and measured +- Method used for calculation of the CO2 emissions

+

Chosen approach

+

Calculation of CO2 emissions require some data element that are relevant on TransportMovement and TransportMeans, it was decided to add a specific CO2Emissions object to contain calculated values.

+

CO2Emissions object is generic enough to allow for various calculation methods to be used. The calculation itself is not part of ONE Record scope but we want ot make sure all required information are available.

+

Data model

+

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/code-lists/index.html b/development/Data-Model/code-lists/index.html new file mode 100644 index 00000000..cad1d9d5 --- /dev/null +++ b/development/Data-Model/code-lists/index.html @@ -0,0 +1,3198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Code Lists - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Code Lists

+ +

ONE Record data model 3.0.0 introduced code lists for type safety. These replaced data properties holding enumerations and strings referencing a particular code list.

+

Code lists are built on using custom objects. Many code lists are published as named individuals in the ONE Record coreCodeLists ontology.

+

For unpublished or open code lists, the embedded object CodeListElement is used. A code list is open when it is not restricted to standard values.

+

The approach also allows to refer codes defined as linked data outside of ONE Record. This includes, for example, code lists published as part of the UN/CEFACT Web Vocabulary +.

+

This page provides guidance on how to use code lists in practical use cases.

+

CodeListElement

+

The CodeListElement is an embedded object. It is the superclass of all other code lists in ONE Record. +As such, all codes defined as named individuals are viewed as instances of the CodeListElement. +It features the following properties if a custom instance as embedded object is required:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDescription
codeCode or short version of a code, for example "CH" for Switzerland when referring to the UN/LOCODE code list
codeDescriptionDescription or long version of the code, for example "Switzerland" for Switzerland when referring to the UN/LOCODE code list
codeLevelInteger indicating the level of a code if a code list is hierarchical, for example HS-Codes
codeListName Official name of the code list without version number when direct reference is not possible, for example "UN/LOCODE" when referring to the UN/LOCODE code list
codeListReference  URL to access the code list the code is taken from, for example "https://unece.org/trade/cefact/unlocode-code-list-country-and-territory" for UN/LOCODE.
codeListVersion Version of the code list, for example "223-1" for UN/LOCODE. Used if the property codeListName is used or the version is not apparent from the resource referred to in property codeListReference.
+
+

Note

+

The properties code and either codeListName or codeListReference at least SHOULD be used if instanced.

+
+

Examples

+

Example 1: Enumeration

+

In the following example, a named individual defined in the cargo ontology is used to set the loadType of a Piece to LOOSE.

+
{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#"
+    },
+    "@type": "cargo:Piece",
+
+    "cargo:loadType": "cargo:LOOSE"
+}
+
+

(examples-dm/code-lists-enumberation.json)

+

Example 2: Closed Code List

+

In the following example, a named individual defined in the coreCodeLists ontology is used to set the securityStatus of a SecurityDeclaration to NSC.

+
{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "ccodes": "https://onerecord.iata.org/ns/coreCodeLists#"
+    },
+    "@type": "cargo:SecurityDeclaration",
+
+    "cargo:securityStatus": "ccodes:SecurityStatus_NSC"
+}
+
+
+

Note

+

This code list is defined in the ONE Record coreCodeLists ontology.

+
+

(examples-dm/code-lists-closed-code-list.json)

+

Example 3: Open Code List, defined Code

+

In the following example, named individuals are used to set the specialHandlingCodes of a Piece as EAW and NSC.

+
{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "ccodes": "https://onerecord.iata.org/ns/coreCodeLists#"
+    },
+    "@type": "cargo:Piece",
+
+    "cargo:specialHandlingCodes": "ccodes:SpecialHandlingCode_EAW",
+    "cargo:specialHandlingCodes": "ccodes:SecurityStatus_NSC"
+}
+
+

(examples-dm/code-lists-open-code-list-1.json)

+
+

Note

+

Both code lists are defined in the ONE Record coreCodeLists ontology. Note that a SecurityStatus is also an acceptable Special Handling Code.

+
+

Example 4: Open Code List, custom Code

+

In the following example, a named individual defined is used to set the specialHandlingCodes of a Piece as EAW. Additionally, a new embedded object is created to set CUS, a custom organization-specific special handling code, using the properties of the CodeListElement.

+
{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "ccodes": "https://onerecord.iata.org/ns/coreCodeLists#"
+    },
+    "@type": "cargo:Piece",
+
+    "cargo:specialHandlingCodes": "ccodes:SpecialHandlingCode_EAW",
+    "cargo:specialHandlingCodes": [
+        {
+            "@type": "ccodes:SpecialHandlingCode",            
+            "cargo:code": "CUS",
+            "cargo:codeDescription": "Custom Special Handling Code",
+            "cargo:codeListName": "Some Airline Custom Handling Codes",
+            "cargo:codeListVersion": "2024-04"
+        }
+    ]
+}
+
+

(examples-dm/code-lists-open-code-list-2.json)

+
+

Note

+

The code instanced SHOULD be of type required by the property, in this case as SpecialHandlingCode for property specialHandlingCodes.

+
+

Example 5: CodeListElement, undefined Code List

+

In the following example, a new embedded object of type CodeListElement is created to set the hsCode of a Product.

+
{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#"
+    },
+    "@type": "cargo:Product",
+
+    "cargo:hsCode": [
+        {
+            "@type": "cargo:CodeListElement",            
+            "cargo:code": "9023",
+            "cargo:codeDescription": "Instruments, apparatus, models",
+            "cargo:codeLevel": 4,
+            "cargo:codeListName": "Harmonized System",
+            "cargo:codeListVersion": "Nomenclature 2024"
+        }
+    ]
+}
+
+

(examples-dm/code-lists-code-list-element.json)

+

Example 6: Code List defined in other Vocabulary

+

In the following example, a named individual defined in the UN/CEFACT Web Vocabulary is used to set the currencyUnit of a CurrencyValue describing the declaredValueForCarriage of a Waybill to CHF.

+
{
+    "@context": {
+        "cargo": "https://onerecord.iata.org/ns/cargo#",
+        "unece": "https://vocabulary.uncefact.org/"
+    },
+    "@type": "cargo:Waybill",
+
+    "cargo:waybillType": "cargo:MASTER",
+    "cargo:declaredValueForCarriage": [
+        {
+            "@type": "cargo:CurrencyValue",            
+            "cargo:numericalValue": 5000.00,
+            "cargo:currencyUnit": "unece:CurrencyCodeList#CHF"
+        }
+    ]
+}
+
+

(examples-dm/code-lists-other-linked-data-code-list.json)

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/concepts/index.html b/development/Data-Model/concepts/index.html new file mode 100644 index 00000000..4fa7cec9 --- /dev/null +++ b/development/Data-Model/concepts/index.html @@ -0,0 +1,2982 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Concepts - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Concepts

+ +

ONE Record Data Model Ontologies

+

The ONE Record data model is specified as an ontology which is also referred to as a semantic model. The ONE Record data model consists of two ontologies: the ONE Record cargo ontology and the ONE Record core code lists ontology

+

The ONE Record cargo ontology contains industry concepts, their properties, and their relationships between them. This ontology can be used by analysts, developers, and users to understand the data classes in ONE Record and their relationship to each other.

+

The ONE Record core code lists ontology contains industry code lists as named individuals.

+

Both ontologies are maintained on GitHub.

+

Logistics Objects

+

The ONE Record cargo ontology is organized as a set of data classes that represent real world concepts in transport and logistics, also referred to as digital twins. +These generic data classes are referred to as Logistics Objects in the world of ONE Record. +Each digital twin is an instance of a data classes that inherits from the Logistics Object data class. +The data exchange that is facilitated by the ONE Record API is mainly the exchange of Logistics Objects. +This is transition from the traditional logistics and transport EDI systems that only exchanged messages and documents. +The concept of Logistics Objects is far more extensive since Logistics Objects can be more granular and have very specific usage in different use cases within the logistics and transport domain. +Examples of a Logistics Object are a Piece, an IotDevice, a Sensor or a BookingOptionRequest and many more.

+

Linked Data

+

A central approach of ONE Record is to enable the creation of a comprehensive network of +data, i.e. data related to specific consignments and shipments are accessible as a +unique and single shipment record, i.e. "one record" in that network of linked data. To achieve this, the ONE Record data model is based on a ONE Record cargo industry ontology using the Resource Description Framework (RDF) format.

+

Used Namespace Prefixes in ONE Record Context

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PrefixNamespaceDescription
cargohttps://onerecord.iata.org/ns/cargoThis refers to the ONE Record cargo ontology.
ccodeshttps://onerecord.iata.org/ns/coreCodeListsThis refers to the ONE Record core code lists ontology.
apihttps://onerecord.iata.org/ns/apiThis refers to the ONE Record API ontology.
xsdhttp://www.w3.org/2001/XMLSchemaW3C vocabulary, primarily used for primitive data types (e.g. string, dateTime)
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/designprinciples/index.html b/development/Data-Model/designprinciples/index.html new file mode 100644 index 00000000..f66886dc --- /dev/null +++ b/development/Data-Model/designprinciples/index.html @@ -0,0 +1,3136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Design Principles - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Design Principles

+ +

ONE Record Vision

+

The vision for ONE Record is an end-to-end digital logistics and transport supply chain where data is easily and transparently exchanged in a digital ecosystem of air cargo stakeholders, communities and data platforms. ONE Record is an open standard for data sharing and creates a single record view of the shipment. This standard defines a common data model for the data that is shared via standardized and secured web API. The standard is based on mature but progressive data sharing technologies that are well aligned with the best practices used by leading airlines. This makes it directly accessible to IT teams and service providers. +ONE Record standard aims to become an essential part of the Internet of Logistics (IoL) data exchange infrastructure that is emerging. +An expert group with stakeholders from the whole logistics and transport chain has been gathered to define the ONE Record data model under IATA’s guidance since 2018.

+

The ONE Record Data Model

+

The Data Model is an essential part of ONE Record and aims to provide the air cargo industry with a standard data structure for data exchange using JSON-LD that facilitates data integration with existing and new data services. +Such a data structure needs to be as simple as possible and needs to be shared and understood by any stakeholder involved. This means that the way data objects are defined is applicable to the relationship between a shipper and a forwarder as well as between a forwarder and a carrier.

+

+ +

+

Goals of ONE Record Data Model

+ +

This document focuses on the Airline Core Ontology referring to the interaction of General Cargo between shippers and freight forwarders as well as between freight forwarders and Airlines. It is designed to be expandable to other types of cargo such as dangerous goods and special cargo with add-ons to cover as well other logistics partners included in the end-to-end transport supply chain of air cargo.

+

+ +

+

Scope of the data model

+ +

Principles

+

To achieve the data model objectives, four core design principles have been identified as per below:

+

+ +

+

Core principles

+ +

Piece centric

+

As defined by the IATA Recommended Practice 1689, a piece is a uniquely identified physical single unit. A Piece may form all or a part of a shipment in the logistics supply chain. +As a basic architectural principle, the ONE Record data model is built around the logistic object “piece”. Having the piece at the center of the data model encourages all parties in the supply chain to deliver detailed data at a high level of granularity.

+

Physics oriented

+

The data model intends to reflect as much as possible the actual operational data, it has been designed around the concept of Digital Twin: the main objects of the data model represent either physical assets or the physical journey within the logistics supply chain. +For instance, the objects Item, Pieces or ULD are easily identified in operations and they bear the same meaning in the data model.

+

One single source of truth

+

The ONE Record data model aims at minimizing redundancy of data. In other words, data should be defined and stored at a single place in the data model. Having data only in a single place has several benefits: +- There’s only one single source of truth, instead of having multiple sources that can have contradicting values +- Ownership of the data is clear and data management is simplified +- Efficiency and performance of the data model are optimized +- Data quality is improved, as there will be no corruption of data due to conversion, trans-mission errors or delayed updates

+

Data driven

+
A data-driven data model
+

Cargo industry of today relies on many documents that are sent from stakeholder to stakeholder, some of them being legally binding. The ONE Record data model aims to be data-driven, not document-driven. +As documents remain essential for the legal side of logistics, the data model aims to be exhaustive enough to make sure that all required information is captured. Any stakeholder who has access to the proper information should be able to create or re-create any document he needs for operations purposes.

+
Semantic web and linked data
+

As Tim Berners-Lee, inventor of the World Wide Web, describes it, “the Semantic Web isn’t just about putting data on the web. It is about making links, so that a person or machine can explore the web of data. With linked data, when you have some of it, you can find other, related, data.” +With the correct usage of web technologies and standard mechanisms, as defined and de-scribed in the API & Security specifications of ONE Record, the linked data enables to connect and query data from different sources. +This gives the flexibility for every stakeholder to choose if they want to host their data and make it available to others or use a common platform, from another stakeholder or an IT service provider. +The ontology, defined in the Turtle syntax, is the faithful transcription of the logical data model in a machine-readable format. +In the ONE Record data model this principle also allows to: +- Keep the relation between objects simple +- Avoid redundancy of links and information

+

For instance, if a Product is linked to a Piece and a Piece is linked to a Shipment, an explicit link between Product and Shipment is not required.

+
Events
+

The status of a Logistic Object is a key element of the transparency and tracking possibilities that ONE Record wants to provide. The generic object Event enables to capture the evolution of all objects in the logistics and transport supply chain. +Events can, for instance, be used to monitor Cargo iQ milestones, the state of physical assets or the status of transport segments such as Departed, Arrived, etc. This includes the planned events as per the routemap as well.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/dg/index.html b/development/Data-Model/dg/index.html new file mode 100644 index 00000000..f1db93c3 --- /dev/null +++ b/development/Data-Model/dg/index.html @@ -0,0 +1,2949 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dangerous Goods - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Dangerous Goods

+ +

Requirements

+

The requirements for Dangerous Goods are strongly based on the Cargo-XML message xSDG that contains all required information for the transport of dangerous goods. The details of the information can be found in the Cargo-XML toolkit and thus will not be fully transcribed in this document.

+

Chosen approach

+

The different data required in the xSDG message are split among objects Piece, Product, Item and some dedicated objects: DgProductRadioactive, DgRadioactiveIsotope and DgDeclaration. A focus is made on making sure that all legal data required are within ONE Record data model.

+

As Dangerous Goods cargo require specific data, ProductDg, ItemDg and PieceDg objects are added to simplify the data model, they are subtypes of Product, Item and Piece objects.

+

In details information related to the packaging concept of Dangerous Goods is added on the PieceDg object to fully integrate these requirements.

+

DgProductRadioactive and DgRadioactiveIsotope objects contain specific data related to radioactive products and are linked to ProductDg object.

+

DgDeclaration object is used to contain data related to the existing Dangerous Goods Declaration, it is linked to one or many PieceDg objects.

+

+ +

Data model

+

All Dangerous Goods requirements result in the creation of new subtypes or objects, they are described in details below. +  + +

+

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/distribution/index.html b/development/Data-Model/distribution/index.html new file mode 100644 index 00000000..fd380222 --- /dev/null +++ b/development/Data-Model/distribution/index.html @@ -0,0 +1,3029 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Distribution - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Distribution

+ +

Requirements

+

The Modernizing Cargo Distribution working group (MCD) has defined the standardized Sales & Booking process to highlight the business and data requirements of Distribution. +The current Sales & Booking process is the following:

+

+ +

In addition a specific Cancellation process has been defined:

+

+ +

In this process, the quote request should contain a minimum set of information:

+

+ +

The second step, airline presenting booking options, needs to ensure that the following data are included:

+

+ +

The booking confirmation step ends the Quote & Book process, it should ensure that some data are validated and agreed between the two parties. The data are:

+

+ +

Further discussions with MCD working group members allowed to identify the need to properly track the shipment status and data throughout the shipment lifecycle. Essential shipment data such as Weight can evolve as the Quote & Book process moves forward, the data model and ONE Record specifications need to ensure that this is possible. +The group came up with a proposal for a standard shipment lifecycle as depicted below:

+

+ +

This is an example of a typical shipment lifecycle that should help standardize some of the events and milestones that are required on the business side of the Quote & Book process.

+

Chosen approach in the data model

+

The chosen approach is on multiple levels to make sure that all requirements are met.

+

Definition of appropriate objects to reflect Distribution

+

Four main objects have been defined to represent the Distribution: +- Booking Shipment: In the context of Distribution, and only distribution, the BookingShipment is a simplified mix between Piece and Shipment to meet a quote request minial requirements. +- Booking Option Request: It refers to the quote request. +- Booking Option: A Booking Option is an offer made by a carrier that is supposed to be bookable. +- Booking Request: It refers to the booking confirmation request, equivalent to (X)FFR message. +- Booking: Used for confirmed bookings, it contains all information that have been agreed between customer and carrier.

+

+ +

Along those two main objects, a few simpler objects are added to ensure that all information are available for the Sales & Booking process. It includes Routing, ScheduledLegs, BookingTimes, BookingSegment, CarrierProduct, Price, Ratings and Ranges.

+

Ranges are included to address challenges where cargo tendered to Airline has variance versus the booking option request dimension and/or weight.

+

As the Sales & Booking process may occur before actual operations, we have chosen to allow for some data property at BookingOptionRequest level that are to be used for the sole purpose of the quote request. Thus the expectedCommodity and requestedHandling data properties are used at an early stage to indicate what the forwarder intends to ship. The BookingShipment object, which is still being finalized, is also used for that purpose, with more detailed information on intended shipment.

+

The expectedCommodity values are to be discussed and decided by the MCD working group, the requestedHandling values shall refer to special handling codes.

+

ONE Record mechanisms to ensure keeping track of data throughout the lifecycle

+

Like all Logistic Objects, Shipments can have Events. An Event can record the state of a shipment (e.g. “Quote Requested, Booking requested, etc.) and reflect the lifecycle.

+

The Audit Trail specified in ONE Record API can be used to recover older versions of the objects based on, for instance, a specific date and time.

+

Data model

+

Details of the objects and their data properties can be found in the Ontology or the PDF version of the data model.

+

The impacts on the conceptual data model and the way these objects are supposed to interact with each other are quite straightforward and explained in the figure below.

+

+ +

# API mechanism

+

Based on the Data Model, a standard API workflow has been designed. The use case shows an interaction between a Customer (Freight Forwarder) and a Carrier where both stakeholders have their own ONE Record servers. Using a 3rd-party service provider would be the same workflow.

+

Sales Booking-1

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/examples-dm/code-lists-closed-code-list.json b/development/Data-Model/examples-dm/code-lists-closed-code-list.json new file mode 100644 index 00000000..3c96934f --- /dev/null +++ b/development/Data-Model/examples-dm/code-lists-closed-code-list.json @@ -0,0 +1,9 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "ccodes": "https://onerecord.iata.org/ns/coreCodeLists#" + }, + "@type": "cargo:SecurityDeclaration", + + "cargo:securityStatus": "ccodes:SecurityStatus_NSC" +} \ No newline at end of file diff --git a/development/Data-Model/examples-dm/code-lists-code-list-element.json b/development/Data-Model/examples-dm/code-lists-code-list-element.json new file mode 100644 index 00000000..7686576d --- /dev/null +++ b/development/Data-Model/examples-dm/code-lists-code-list-element.json @@ -0,0 +1,17 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#" + }, + "@type": "cargo:Product", + + "cargo:hsCode": [ + { + "@type": "cargo:CodeListElement", + "cargo:code": "9023", + "cargo:codeDescription": "Instruments, apparatus, models", + "cargo:codeLevel": 4, + "cargo:codeListName": "Harmonized System", + "cargo:codeListVersion": "Nomenclature 2024" + } + ] +} \ No newline at end of file diff --git a/development/Data-Model/examples-dm/code-lists-enumberation.json b/development/Data-Model/examples-dm/code-lists-enumberation.json new file mode 100644 index 00000000..97edf81c --- /dev/null +++ b/development/Data-Model/examples-dm/code-lists-enumberation.json @@ -0,0 +1,8 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#" + }, + "@type": "cargo:Piece", + + "cargo:loadType": "cargo:LOOSE" +} \ No newline at end of file diff --git a/development/Data-Model/examples-dm/code-lists-open-code-list-1.json b/development/Data-Model/examples-dm/code-lists-open-code-list-1.json new file mode 100644 index 00000000..daad9e52 --- /dev/null +++ b/development/Data-Model/examples-dm/code-lists-open-code-list-1.json @@ -0,0 +1,10 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "ccodes": "https://onerecord.iata.org/ns/coreCodeLists#" + }, + "@type": "cargo:Piece", + + "cargo:specialHandlingCodes": "ccodes:SpecialHandlingCode_EAW", + "cargo:specialHandlingCodes": "ccodes:SecurityStatus_NSC" +} \ No newline at end of file diff --git a/development/Data-Model/examples-dm/code-lists-open-code-list-2.json b/development/Data-Model/examples-dm/code-lists-open-code-list-2.json new file mode 100644 index 00000000..d1158be2 --- /dev/null +++ b/development/Data-Model/examples-dm/code-lists-open-code-list-2.json @@ -0,0 +1,18 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "ccodes": "https://onerecord.iata.org/ns/coreCodeLists#" + }, + "@type": "cargo:Piece", + + "cargo:specialHandlingCodes": "ccodes:SpecialHandlingCode_EAW", + "cargo:specialHandlingCodes": [ + { + "@type": "ccodes:SpecialHandlingCode", + "cargo:code": "CUS", + "cargo:codeDescription": "Custom Special Handling Code", + "cargo:codeListName": "Some Airline Custom Handling Codes", + "cargo:codeListVersion": "2024-04" + } + ] +} \ No newline at end of file diff --git a/development/Data-Model/examples-dm/code-lists-other-linked-data-code-list.json b/development/Data-Model/examples-dm/code-lists-other-linked-data-code-list.json new file mode 100644 index 00000000..745eeb0f --- /dev/null +++ b/development/Data-Model/examples-dm/code-lists-other-linked-data-code-list.json @@ -0,0 +1,16 @@ +{ + "@context": { + "cargo": "https://onerecord.iata.org/ns/cargo#", + "unece": "https://vocabulary.uncefact.org/" + }, + "@type": "cargo:Waybill", + + "cargo:waybillType": "cargo:MASTER", + "cargo:declaredValueForCarriage": [ + { + "@type": "cargo:CurrencyValue", + "cargo:numericalValue": 5000.00, + "cargo:currencyUnit": "unece:CurrencyCodeList#CHF" + } + ] +} \ No newline at end of file diff --git a/development/Data-Model/examples-dm/readme/index.html b/development/Data-Model/examples-dm/readme/index.html new file mode 100644 index 00000000..b09ec1be --- /dev/null +++ b/development/Data-Model/examples-dm/readme/index.html @@ -0,0 +1,2778 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Readme - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Readme

+ +

file examples for Data Model

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/features/index.html b/development/Data-Model/features/index.html new file mode 100644 index 00000000..9d6dd0a8 --- /dev/null +++ b/development/Data-Model/features/index.html @@ -0,0 +1,2839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Overview - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Overview

+ +

TBD

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/ic/index.html b/development/Data-Model/ic/index.html new file mode 100644 index 00000000..be93212c --- /dev/null +++ b/development/Data-Model/ic/index.html @@ -0,0 +1,2953 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Interactive Cargo - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Interactive Cargo

+ +

Requirements

+

The Interactive Cargo requirements are still a work in progress however the dedicated taskforce has drafted a Recommended Practice that expresses requirements as to what kind of data should be recorded. The recommended practice follows the guiding principles of ONE Record, meaning that the integration of the requirements are quite straightforward and in line with the existing data model.

+

The recommended practice highlights:

+

IoT Devices: +- They are “tangible objects that provide the technological interface to interact with or obtain information about physical and other digital entities in an Internet-of-Things (IoT) ecosystem. The IoT device extends physical entities and allows them to be part of the digital world.” +- IoT devices must contain some information to identify them: manufacturer, model, name, description and serial number. +- IoT devices may include sensors that record measurements

+

Sensor: +- They refer to “a device that senses and reports physical or chemical properties from the physical environment and transforms them into digital data that can be transmitted over a network.” +- Sensors contain information to identify them: name, description, serial number, type +- The type gives information on the type of measurements (property) recorded by the sensor, the RP highlights multiple types of sensors e.g. geolocation, thermometer or humidity. +- Most observed properties have a datatype double and a unit of measurement. Only the geolocation differs as the geolocation contains a triplet of values latitude, longitude, altitude.

+

Chosen approach

+

To meet the requirements of the Interactive Cargo RP there IotDevice, Sensor, and Measurements objects that have been created. In order to respect the Digital Twin principle and align on the real world, multiple IotDevice objects can be linked to any Logistic Object that refers to known physical entities. Such LO can be a Piece, a ULD, a specific location, etc.

+

Then an IotDevice can be linked to multiple Sensor objects that record a single type Measurements.

+

+ +

Data Model

+

To take into account the specificity of the Geolocation sensor type, subtypes of Sensor and Measurements have been added to ease the usage of the data model.

+

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/img/DM-ActivityModel-Example-Loose-Pallet.jpg b/development/Data-Model/img/DM-ActivityModel-Example-Loose-Pallet.jpg new file mode 100644 index 00000000..d53cd255 Binary files /dev/null and b/development/Data-Model/img/DM-ActivityModel-Example-Loose-Pallet.jpg differ diff --git a/development/Data-Model/img/DM-ActivityModel-LogisticsAction.jpg b/development/Data-Model/img/DM-ActivityModel-LogisticsAction.jpg new file mode 100644 index 00000000..4f1ec444 Binary files /dev/null and b/development/Data-Model/img/DM-ActivityModel-LogisticsAction.jpg differ diff --git a/development/Data-Model/img/DM-ActivityModel-LogisticsActivity.jpg b/development/Data-Model/img/DM-ActivityModel-LogisticsActivity.jpg new file mode 100644 index 00000000..8df9a360 Binary files /dev/null and b/development/Data-Model/img/DM-ActivityModel-LogisticsActivity.jpg differ diff --git a/development/Data-Model/img/DM-ActivityModel-LogisticsService.jpg b/development/Data-Model/img/DM-ActivityModel-LogisticsService.jpg new file mode 100644 index 00000000..4e80a90c Binary files /dev/null and b/development/Data-Model/img/DM-ActivityModel-LogisticsService.jpg differ diff --git a/development/Data-Model/img/DM-ActivityModel-PhysicalLogisticsObject.jpg b/development/Data-Model/img/DM-ActivityModel-PhysicalLogisticsObject.jpg new file mode 100644 index 00000000..6d440cc2 Binary files /dev/null and b/development/Data-Model/img/DM-ActivityModel-PhysicalLogisticsObject.jpg differ diff --git a/development/Data-Model/img/DM-ActivityModel-UnitComposition.jpg b/development/Data-Model/img/DM-ActivityModel-UnitComposition.jpg new file mode 100644 index 00000000..c765a1fa Binary files /dev/null and b/development/Data-Model/img/DM-ActivityModel-UnitComposition.jpg differ diff --git a/development/Data-Model/implementation-guidelines/index.html b/development/Data-Model/implementation-guidelines/index.html new file mode 100644 index 00000000..96a019fb --- /dev/null +++ b/development/Data-Model/implementation-guidelines/index.html @@ -0,0 +1,3045 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Implementation Guidelines - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Implementation Guidelines

+ +

Paper transport documents in ONE Record

+

The general concept of legal entities like MAWB or HAWB in ONE Record does not differ from the established concepts in term of legal preconditions or validity. All the legal requirements remain in place and must be fulfilled. But because of the architecture of ONE Record, changes in the practical management of data are required. In the context of ONE Record, a legal entity like the AWB has the following characteristics: +- A defined set of data fields, as described in the corresponding Logistics Object

+

These data fields are either attributes (e.g. type of AWB) or defined as links to other LOs in the data model (e.g. Booking or Shipment).

+
    +
  • From defined owners
  • +
+

Due to legal requirements, some fields must be provided by the accountable party. E.g. in case of MAWB, the forwarder must be owner of most data fields, although some data fields (like the transport segments with the planned routing) are owned by the carrier, and some are owned by shippers (e.g. the commodity information).

+
    +
  • For a special purpose (“e.g. Master Air Waybill”)
  • +
+

The traditional paper documents fulfil a defined legal purpose. To fulfil this purpose is the only function of the correlating Logistics Object (e.g. “AWB Logistics Object”).

+
    +
  • At a special point in time, consented by two parties (e.g. “Shipper” and “Carrier”)
  • +
+

The data of the LO is intentionally shared by the contractual parties at a defined point in time, to freeze that version of the data set as the one used for the contractual purpose. Data might change afterwards, but the changed revisions will not be taken into consideration, unless a new version of the legal entity is generated and consented on.

+

Master AWB

+

Digital AWB approach

+

The digital AWB approach follows the four principles of avoiding redundancy, marking outdated data fields as deprecated, removing all data fields without a legal impact and, fourthly, separating all non-legal, physical characteristics in a separate LO (Shipment).

+

Firstly: remove redundancies with any other data source and data fields covered by ONE Record mechanisms. Most data classically found in the AWB are essential parts of the Booking Option and Booking Option Request as well as the Piece and Shipment objects. As those LOs are created earlier in the logical chain, the data in the booking process is in the lead and referred to in the AWB. Data like WAYBILL_NUMBER, the total gross weight, the origin and destination, or the number of pieces originate from the Booking, not the AWB. Additionally, some information is not required anymore, especially the total-fields, as the mechanism to be used in ONE Record would be to count the correlated items themselves.

+

Secondly: Mark outdated data fields clearly as deprecated. All the data fields found under the WayBill Lane in the cIMP/cXML data catalogue are considered to be outdated, especially the IATA Rates. The whole architecture of these fields, presenting characteristics of groups of pieces, is already not supported by most carriers nowadays. Additionally, the structure of this LO is not compatible with the principles of ONE Record.

+

Thirdly: Remove all data fields that have no legal impact on the AWB. A lot of information was traditionally part of the AWB, as the AWB used to be the major – and often exclusive – source of information on the shipment. With ONE Record, any data can shared in correlation with the AWB number or any other unique ID, but then don’t have to be part of the AWB. This mostly effects fields like the accounting information, the airline product names and codes, or the insurance information. Also, parts of the other charges section not be part of the contract between forwarder and carrier, as the add up during the execution of the AWB.

+

Fourthly: All physical characteristics of the totality of pieces under one contract can be found in the Shipment LO. This does not include piece-related information, as they are characteristics of pieces themselves, but physical characteristics that are shared by all pieces under that contract. +The data fields of the AWB LO and owners of each of these fields are better described in the Use Case document for the ONE Record data model (insert reference).

+
Pieces / ULDs in AWB wording
+

The legal terminology for BUPs in the AWB is not consistent, as BUPs don´t count as ULDs, but as pieces. To solve this problem, the following solution is suggested: Whenever a BUP is pre-sented by the forwarder, additionally to the ULD LO, a single Piece LO is created with the dimensions and gross weight of the packed ULD.

+
4.2. House AWB
+

The House Waybill is made up from data provided by the Customer in the Shippers Letter of Instruction (SLI) which is then enhanced by the forwarder as necessary to include specific data required by the forwarder, carrier and other authorities. This then provides the door to door route map of the pieces linked to the House Waybill for cIQ transportation plan.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/index.html b/development/Data-Model/index.html new file mode 100644 index 00000000..09de879f --- /dev/null +++ b/development/Data-Model/index.html @@ -0,0 +1,2920 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Introduction - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Introduction

+ +

+

Purpose

+

This ONE Record data model specification is part of the ONE Record standard. +It details core concepts of the data model described in the ONE Record cargo and ONE Record core code lists ontologies. +It aims to provide explanations and examples for usage of the data model for implementers.

+

Prerequisites

+

It is assumed that the reader is familiar with air cargo vocabulary and the concept of linked data.

+

Supporting Documents

+
    +
  • TDB
  • +
+

Document Version

+

Version: 0.0.1

+

Status: Not endorsed

+
+

Note

+

Discussion on the data model is highly encouraged and please contact onerecord@iata.org with any comments or suggested improvements.
+The version of the ONE Record data model is incremented when the data model is endorsed by the IATA Cargo Operations Technology Board (COTB).

+
+

Conventions

+

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.

+

License

+

This document is licensed under MIT license (see License for details).

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/la/index.html b/development/Data-Model/la/index.html new file mode 100644 index 00000000..99db3646 --- /dev/null +++ b/development/Data-Model/la/index.html @@ -0,0 +1,3374 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Live Animals - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Live Animals

+ +

Requirements

+

Shipper’s certification for Live Animals

+

The shipper’s certification for Live Animals is an essential document required to transport live animals. The requirements are described in the Live Animals Regulation as published by IATA.

+

+ +

CITES ePermit

+

The CITES permit is a the key instrument to control the trade in the species it protects. An extensive work has been done in order to define the requirements for the CITES ePermit, including the ePermit Core Component Data Model V2.0. +The details of the ePermit and the associated data model are in the “CITES electronic permitting toolkit Version 2.0” document that can be found here.

+

Chosen approach

+

Requirements have shown that the data model requires new objects to capture the specific information for Live Animals. These objects are: +- PieceLiveAnimals object, subtype of the Piece class containing data specific for Live Animals +- EPermitConsignement object to reflect the pieces (Animals) contained in a eCITES permit +- LiveAnimalsEpermit object to reflect the eCITES permit document requirements and allow for its creation from the ONE Record data model +- EpermitSignature object to take into account Signature requirements in the eCITES permit, mainly identifying the signatory and recording the date of signature

+

+ +

The mapping with the CITES ePermit data model has been made to ensure all required information are available, it is available in details in the Excel version of the data model on GitHub in the document IATA-1R-DataModel-LiveAnimalsIntegration Nov 2020.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ObjectData propertyDescriptioneCITES boxePermit class
Epermit
EpermitpermitNumber"The original number is a unique number allocated to
each document by the relevant Management
Authority."1HeaderExchangedDocument-ID
EpermitpermitTypeCodeCode specifying the document name.1HeaderExchangedDocument-TypeCode
EpermitpermitTypeOtherDescription if TypeCode is Other1HeaderExchangedDocument-Name
EpermitpermitCopyIndicatorIndicates if the permit is a copy (true) or an original (false)1HeaderExchangedDocument-CopyIndicator
EpermittransactionPurposeTextPurpose of the transaction in free text5aHeaderExchangedDocument-Purpose
EpermittransactionPurposeCodeCode indicating the purpose of the transaction5aHeaderExchangedDocument-PurposeCode
EpermitspecialConditionsSpecial conditions5HeaderExchangedDocument-Information
EpermitpermitValidUntilPermit Valid until2HeaderExchangedDocument-ReferenceReferencedDocument-EffectiveSpecifiedPeriod
EpermitpermitValidfromPermit Valid fromHeaderExchangedDocument-ReferenceReferencedDocument-EffectiveSpecifiedPeriod
EpermitissuingAuthoritySignatureSignature details of the Issuing Authority (box 6)6FirstSignatoryDocumentAuthentication
EpermitapplicantSignatureSignature details of the Applicant (box 4)4SecondSignatoryDocumentAuthentication
EpermitissuerSignature"Signature details of the Permit issuer (box 13)includes date of issuance of the permit and associated location"13
EpermitexaminingSignatureSignature details of the Examining authority (box 14)14FourthSignatoryDocumentAuthentication
Epermitconsignor"Consignor company detailsincluding complete name and address (box 4already in applicantSignaure ?)"
Epermitconsignee"Consignee company detailsincluding complete name and address (box 3)"3
EpermittransportContractTypeCodeCode specifying the transport document name15SpecifiedSupplyChainConsignment-TransportContractReferencedDocument-TypeCode
EpermittransportContractIdReference to the Air Waybill or other transport contract document15SpecifiedSupplyChainConsignment-TransportContractReferencedDocument-ID
EpermitconsignmentsReference to the pieces and properties linked to the Permit7 to 12IncludedSupplychainConsignment
EpermitConsignment
EpermitConsignmentconsignementItemsReference to the pieces
EpermitConsignmentexaminingQuantityQuantity measured by examining authority (box 14)14SpecifiedSupplyChainConsignment-ExaminationTransportEvent-UnitQuantity
EpermitConsignmentusedToDateQuotaQuantitytotal number of specimens exported in the current calendar year and the current annuela quota for the species concerned (box 12b)11aIncludedSupplychainConsignmentItem-ApplicableCrossBorderRegulatoryProcedure-UsedToDateQuantity
EpermitSignature
EpermitSignaturesignatureTypeCode"Code specifying a type of government action such asinspectiondetentionfumigation
EpermitSignaturesecurityStampIdSecurity stamp ID5b…Signatory…ID
EpermitSignaturesignatureStatementSignatory signature authentication text…Signatory…Statement
EpermitSignaturesignatoryIdSignatory company name…Signatory…ProviderTradeParty
EpermitSignaturesignatoryAddressFull address of the signatory company…Signatory…ProviderTradeParty-PostalTradeAddress
EpermitSignaturesignatoryRepresentantName of the official representative person of the Issuing Authority…Signatory…ProviderTradeParty-SpecifiedRepresentativePerson
EpermitSignaturesignatureLocationPlace where signature occurred or was registered…Signatory…IssueLogisticsLocation
Piece
PieceshippingMarks(see SLI)
PieceLiveAnimals
PieceLiveAnimalsoriginTradeCountrycountry of origin (box 12)12IncludedSupplychainConsignmentItem-PhysicalLogisticsShippingMarks-OriginTradeCountry
PieceLiveAnimalsexportTradeCountryCountry of last re-export (box 12a)12aIncludedSupplychainConsignmentItem-PhysicalLogisticsShippingMarks-ExportTradeCountry
PieceLiveAnimalsoriginReferencePermitDatetimeIssuing date for Origin reference permit or re-export reference Certificate (box 12)12IncludedSupplychainConsignmentItem-PhysicalLogisticsShippingMarks-AssociatedReferencedDocument-IssueDateTime
PieceLiveAnimalsoriginReferencePermitTypeCodeidentifier of Origin reference permit or re-export reference Certificate (box 12/12a)12/12aIncludedSupplychainConsignmentItem-PhysicalLogisticsShippingMarks-AssociatedReferencedDocument-TypeCode
PieceLiveAnimalsoriginReferencePermitIdidentifier of Origin reference permit or re-export reference Certificate (box 12/12a)12/12aIncludedSupplychainConsignmentItem-PhysicalLogisticsShippingMarks-AssociatedReferencedDocument-ID
PieceLiveAnimalsquantityAnimalsQuantity including units (box 11)11IncludedSupplychainConsignmentItem-PhysicalLogisticsShippingMarks-TransportLogisticsPackage-ItemQuantity
PieceLiveAnimalsgoodsTypeCode"Appendix number of the convention (III or III) (box 10)"10
PieceLiveAnimalsgoodsTypeExtensionCodeSource of the appendix number (box 10)10IncludedSupplychainConsignmentItem-IncludedSupplyChainTradeLineItem-TypeExtensionCode
PieceLiveAnimalsspecimenDescription"Description of specimensincluding age and sex if LA (box 9)"9
PieceLiveAnimalsspecimenTypeCode"Description of specimensCITES type code (box 9)"9
PieceLiveAnimalsspeciesCommonNameSpecies common name (box 8)8IncludedSupplychainConsignmentItem-IncludedSupplyChainTradeLineItem-SpecifiedTradeProduct-CommonName
PieceLiveAnimalsspeciesScientificNameSpecies scientific name (box 7)7IncludedSupplychainConsignmentItem-IncludedSupplyChainTradeLineItem-SpecifiedTradeProduct-ScientificName
PieceLiveAnimalscategoryCodeOperations code ID. Refers to the number of the registered captive-breeding or artifical propagation operation (box 12b)12bIncludedSupplychainConsignmentItem-ApplicableCrossBorderRegulatoryProcedure-CategoryCode
PieceLiveAnimalsacquisitionDatetimeDefined in Resolution Conf. 13.6 and is required for pre-Convention specimens (box 12b)12bIncludedSupplychainConsignmentItem-ApplicableCrossBorderRegulatoryProcedure-AcquisitionDateTime
PieceLiveAnimalsannualQuotaQuantitytotal number of specimens exported in the current calendar year and the current annuela quota for the species concerned (box 11a)11aIncludedSupplychainConsignmentItem-ApplicableCrossBorderRegulatoryProcedure-AnnualQuotaQuantity
+

Data model

+

The objects added for Live Animals integration have been specified, accordingly with the existing models. + +

+

+

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/pharma/index.html b/development/Data-Model/pharma/index.html new file mode 100644 index 00000000..fe503170 --- /dev/null +++ b/development/Data-Model/pharma/index.html @@ -0,0 +1,2972 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pharmaceutical Products - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Pharmaceutical Products

+ +

Requirements

+

The requirements for pharmaceutical shipments may differ depending on the parties involved. We have highlighted two cases.

+

image + From Shipper to forwarder:

+
    +
  • Product Temperature Range: the shipper express the temperature range the shipment need to handled. The requirement is expressed in free format.
  • +
  • Packaging Technology: passive or active technology
  • +
  • Packaging Type: packaging type as per chapter 6.3.7 of the TCR
  • +
  • Unit Loading Device: information related to the ULD (exemple: uldTypeCode, serialNumber, ownerCode, ataDesignator)
  • +
+

image + From forwarder to carrier:

+
    +
  • Product Temperature Range: Special handling code (COL, CRT, ERT, FRO)
  • +
  • Packaging Technology: Special handling code (ACT, PIP)
  • +
  • Packaging Type: as per chapter 6.3.7
  • +
  • Unit Loading Device: see ULD data elements from ONE Record data model
  • +
+

Chosen approach

+

Data model covers the pharmaceutical shipments requirements using the ULD, Piece, ServiceRequest and SpecialHandling objects.

+

+ +

The ULD object capture all the information related to the ULD used by the shipper/forwarder

+

The information is captured at Piece level. The Piece object enables to capture all the required information, including goods description, product information, ULD information, handling information, packaging type as per chapter 6.3.7 of the TCR. If accompany certificate are required, they can be digitalized (if acceptable) in PDF format for example and the link to the PDF document can be inserted using the externalReference data property.

+

The SpecialRequest object is used to capture the shipper requirements. Either the special handling code can be inserted (if known), or the requirement can be inserted in full text using the statementText attribute. Requirements may include:

+
    +
  • Active or Passive packaging
  • +
  • Product temperature range
  • +
+

The SpecialHandling object aims to capture all the special handling codes. For pharma product, the use of the below codes have been identified: +- PIL: Pharmaceuticals +- ACT: Active Temperature Controlled System +- PIP: Passive Insulated Packaging +- COL: between +2°C to +8°C +- CRT: between +15°C to +25°C +- ERT: between +2°C to +25°C +- FRO: below -18°C

+

Data model

+

As a result there are no specific part of the data model that were required for the integration of pharmaceutical shipments.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/sli/index.html b/development/Data-Model/sli/index.html new file mode 100644 index 00000000..8bae3682 --- /dev/null +++ b/development/Data-Model/sli/index.html @@ -0,0 +1,2962 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Shipper letter of instriction - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Shipper letter of instriction

+ +

Requirements

+

The Shipper's Letter of Instruction (SLI) is a document in which the shipper gives handling instructions for the freight forwarder. It also allows the freight forwarder to act on the shipper’s behalf.

+

The SLI is part of CSC Recommended Practice 1650 and should refer to the United Nations Layout Key for Trade Documents in its paper form.

+

The requirements expressed in this document are based on the XSLI Cargo-XML message, 8th Edition, they can be summarized as follows:

+

XSLI Header: +- Letter of instruction number / customs reference +- Consignor details, including contact information, tax/customs information +- Consignee details, including contact information, tax/customs information +- Freight forwarder details, including contact information, tax/customs information +- Other parties details +- Transport and booking details, including terms of delivery and transport equipment details +- Special handling information, special service request, reference documents +- Currency details

+

Packaging detail: +- Complete packages details, including weights, volumes, etc.

+

Commodity details: +- Complete commodity details, including dangerous goods specific data elements

+

Chosen approach

+

The SLI details are mainly at Piece level. +- On the Piece: Declared values for customs and for carriage as well as package marks information. +- On the Shipment: Terms of delivery (expected delivery date and location, incoterms), indicators for Weight valuation and Other charges (Prepaid or Collect). +- On the TransportMovement: Mode Qualifier to indicate Pre-Carriage, Main-Carriage or On-Carriage.

+

The overall idea is that the SLI document in itself does not exist in the Data Model but can be recreated using existing objects and their data properties. It is then a matter of mapping the right information, essentially: +- Parties are represented by Company objects +- Packaging and handling details are data properties of Pieces and Shipment objects +- Commodity details are data properties of Item and Product objects +- Transport details are data properties of Transport movement linked to the pieces

+

Data model

+

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/uldtracking/index.html b/development/Data-Model/uldtracking/index.html new file mode 100644 index 00000000..11a60eff --- /dev/null +++ b/development/Data-Model/uldtracking/index.html @@ -0,0 +1,2965 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ULD Tracking - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

ULD Tracking

+ +

Requirements

+

The ULD global tracking business requirements (main operational procedures and minimum data elements to be captured) are based on: +- the existing ULD Control Receipt (UCR) (see Cargo Services Conference Recommended Practice 1654 and Cargo-XML Message XUCR) +- the suggested ULD handover requirements between cargo handling agent (in the warehouse) and ramp handling agent taken consideration of UCR/ XUCR and Cargo iQ FIW/FOW events, and +- the reconciliation requirements for aircraft loading/ unloading of ULDs taken into consideration of CPM/ UWS/ UCM messages

+

For easy understanding, the recommendation looks at ULD tracking in four scenarios with respective data elements required as follows:

+
    +
  • ULD ground transfer: XUCR data elements
  • +
  • ULD handover between cargo warehouse and ramp: XUCR data elements (recommended) or relevant data elements in Cargo iQ FIW/ FOW events (optional)
  • +
  • Aircraft Loading/ Departure: relevant data elements in CPM/ UWS/ UCM
  • +
  • Aircraft Arrival/ Unloading: relevant data elements in CPM/ UWS/ UCM
  • +
+

Chosen approach

+

The ULD tracking requirements can be mainly managed with the usage of proper Events in ONE Record, the chosen approach consists of the following: +o Addition of new data elements to the ULD objects, related to damage and details of the ULD

+

For better transparency we propose to split the ground transfer/handover using 2 events. This allows to properly identify the party responsible for the ULD at a given time: +- ULD Transfer: the transferring party creates a “Transfer” Event associated to the ULDs +- ULD Reception: the receiving party creates a “Received” Event associated to the ULDs +With this approach we recommend that events are created on every ULD to ensure proper tracking of the assets.

+

+ +
    +
  • Aircraft Loading and Unloading are managed through Events associated to the ULDs + +

    +
  • +
+

The Transport movement gives details about the associated flight (flight number, time of departure, etc.). +The loadingPosition field in the Event allows to record the loading position of the ULD in the aircraft (e.g. lower or main deck), it is managed by a EventUld subtype of the Event.

+

Data Model

+

The ULD tracking requirements have highlighted the need for a few additional data properties on the ULD object as well as the need to create a EventUld subtype of Event to record the loading position.

+

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/visualizer/index.html b/development/Data-Model/visualizer/index.html new file mode 100644 index 00000000..6ca6c87f --- /dev/null +++ b/development/Data-Model/visualizer/index.html @@ -0,0 +1,3088 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Data Model Visualizer - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Data Model Visualizer

+ +

Introduction

+

While the Data Model is primarly defined in the ontology in TTL format, there is a demand to have a visual version of the ONE Record Data Model.

+

Our objective is to have an automated tool that allows to transcribe the ontology into a visual version.

+

Data Model Visualizer

+

The tool is based on the open-source SQL Schema Visualizer available here: https://github.com/sqlhabit/sql_schema_visualizer

+

We host the tool on GitHub: https://aloccid-iata.github.io/ontology_visualizer/ (temporary repository)

+

The tool has been customized to fit our needs in terms of visual and features.

+

Data Mdodel Visualizer in details

+

Preparing the ontology

+

The ontology in its TTL format cannot be used directly in the Visualizer, it needs to be transcribed in the format used by the SQL Schema Visualizer.

+

// to be further documented

+

Main technical aspects

+

// to be further documented

+

Additional features

+

Additional features have been added to enhance the user experience and facilitate the understanding of the data model.

+ +

When looking at an object, you can click on the data type of a property if it's another object. The interface will directly zoom on that object to facilitate navigation among objects.

+

Descriptions and comments

+

Descriptions of objects and properties are within the ontology, along with some comments when relevant. These can be also found in the visualizer by hovering over a property pressing shift.

+

hover

+ +

Search is possible within the visualizer. When text is entered, all objects and properties containing the text are displayed. When clicking on a result the relevant oject is displayed. Note that clicking on a property will display the object containing that property.

+

search

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Data-Model/waybill/index.html b/development/Data-Model/waybill/index.html new file mode 100644 index 00000000..478dec67 --- /dev/null +++ b/development/Data-Model/waybill/index.html @@ -0,0 +1,3431 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Air Waybill - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Air Waybill

+ +

Requirements

+

From a paper perspective the Air Waybill requirements are described in Cargo Services Conference Resolutions Manual (CSCRM) in Resolution 600a. Especially all boxes of the paper Waybill are identified with details on how to properly fill in information.

+

From an electronic perspective the Air Waybill relies on (deprecated) Cargo-IMP FWB message and Cargo-XML XFWB message. Discrepancies exist between FWB and XFWB essentially because Cargo-IMP was discontinued in 2014 and context has evolved.

+

+

+ +

Chosen approach

+

Approach needs to be two-fold: +- Firstly we take into account the paper requirements, this leads to a mapping that is presented below. +- Secondly the electronic requirements lead to a mapping that has been done between XFWB and ONE Record in the corresponding section in the Data Orchestration tab [link]

+

Paper Waybill mapping

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BoxAir Waybill requirements1R mappingComment
1AAirline Code NumberWaybill#waybillPrefix
1BSerial NumberWaybill#waybillNumber
1Airport of DepartureWaybill#departureLocation
1CIssuing Carrier's Name and AddressinvolvedParty#PartyFrom Party: use partyDetails to capture the carrier's name and address. Use ParticipantIdentifier to specifiy AIR for Airline
1DReference to Originals-
1EReference to Conditions of Contracts-
2Shipper's Name and AddressWaybill#involvedPartyIn Party: use partyDetails to capture the shipper's name and address. Use partyRole to specifiy SHP for Shipper or FFW for Freight Forwarder
3Shipper's Account Number-
4Consignee's Name and AddressWaybill#involvedPartyIn Party: use partyDetails to capture the consignee's name and address. Use  partyRole to specifiy CNE for Consignee
5Consignee's Account Number-
6Issuing Carrier's Agent Name and CityWaybill#involvedPartyIn Party: use partyDetails to capture the Issuing carrier's IATA Cargo Agent
7Agent's IATA CodeWaybill#involvedPartyIn Party: use partyDetails to capture the iataCargoAgentCode from Company
8Account Number-
9Airport of Departure and Requested RoutingTransportLegs#departureLocationWhere legNumber is '1'
11ATo (by 1st carrier)TransportLegs#arrivalLocationWhere legNumber is '1'
11BBy 1st carrier-
11CTo (by 2nd carrier)TransportLegs#arrivalLocationWhere legNumber is '2'
11DBy 2nd carrier-
11ETo (by 3rd carrier)TransportLegs#arrivalLocationWhere legNumber is '3'
11FBy 3rd carrier-
18Airport of DestinationTransportLegs#arrivalLocationWhere legNumber is 'greater'
19ARequested FlightTransportLegs#transportIdentifierWhere legNumber is '1'
19BRequested DateTransportLegs#departureDateWhere legNumber is '1'
10Accounting InformationWaybill#accountingInformation
12Currency-extract from the currency used in the Waybill
13Charges Codes - For Carrier Use OnlyWaybill#carrierChargeCode
14A/14BWeight/Valuation ChargesWaybill#weightValuationIndicator
15A/15BOther Charges at OriginWaybill#otherChargesIndicator
16Declared Value for CarriageWaybill#declaredValueForCarriage
17Declared Value for CustomsWaybill#declaredValueForCustoms
20InsuranceShipment#insurance
21Handling informationShipment#specialHandlingCodes + textualHandlingInstructionsRetrieve Handling Information captured for each piece of the shipment
21ASpecial Customs Information (SCI)Shipment#customsInformation
22ANumber of pieces and RCPWaybillLineItem#pieceCountforRateManual data capture
22BGross WeightWaybillLineItem#grossWeightForRateManual data capture
22CKg/LbWaybillLineItem#grossWeightForRateUnit of measurement to be specified in unit of Value (see table 1.48 Measureement Unit Code)
22ZService CodeWaybill#serviceCode
22DRate ClassWaybillLineItem#rateClassCode
22ECommodity Item NumberWaybillLineItem#commodityItemNumberForRate
22FChargeable WeightWaybillLineItem#chargeableWeightForRate
22GRate/ChargeWaybillLineItem#rateCharge
22HTotal-Calculated value
22INature and Quantity of GoodsWaybillLineItem#goodsDescriptionForRate + dimensionsForRate
22JTotal Number of PiecesShipment#piecesCount of Pieces linked to Shipment
22KTotal Gross WeightShipment#totalGrossWeight
22LTotal-Calculated value
23Other ChargesWaybill#otherCharges
24APrepaid Weight Charge-Calculated value
25APrepaid Valuation ChargeWaybill#declaredValueForCarriage
26APrepaid TaxWaybill#otherChargesSum of otherCharges where chargePaymentType is 'P' Prepaid Indicator (see code list 1.5) and otherChargeCode are tax codes related (see code list 1.2)
27ADue AgentWaybill#otherChargesSum of otherCharges where chargePaymentType is 'P' Prepaid Indicator (see code list 1.5) and entitlement is 'A' Other Charges due Agent (see code list 1.3)
28ADue CarrierWaybill#otherChargesSum of otherCharges where chargePaymentType is 'P' Prepaid Indicator (see code list 1.5) and entitlement is 'C' Other Charges due Carrier (see code list 1.3)
29AUntitled box-
30ATotal Prepaid-calculated value: Weight Charge (prepaid) + Valuation Charge (prepaid) + Tax (prepaid) + Total Other Charges Due Agent (prepaid) + Total Other Charges Due Carrier (prepaid)
24BCollect Weight Charge-Calculated value
25BCollect Valuation ChargeWaybill#declaredValueForCarriage
26BCollect TaxWaybill#otherChargesSum of otherCharges where chargePaymentType is 'C' Collect Indicator (see code list 1.5) and otherChargeCode are tax codes related (see code list 1.2)
27BDue AgentWaybill#otherChargesSum of otherCharges where chargePaymentType is 'C' Collect Indicator (see code list 1.5) and entitlement is 'A' Other Charges due Agent (see code list 1.3)
28BDue CarrierWaybill#otherChargesSum of otherCharges where chargePaymentType is 'C' Collect Indicator (see code list 1.5) and entitlement is 'C' Other Charges due Carrier (see code list 1.3)
29BUntitled box-
30BTotal Collect-calculated value: Weight Charge (collect) + Valuation Charge (collect) + Tax (collect) + Total Other Charges Due Agent (collect) + Total Other Charges Due Carrier (collect)
31Shipper's Certification BoxWaybill#consignorDeclarationSignature
32AExecuted on (Date)Waybill#carrierDeclarationDate
32BAt (Place)Waybill#carrierDeclarationPlace
32CSignature of Issuing Carrier or its AgentWaybill#carrierDeclarationSignature
33For carriers use only at destination-
33ACurrency Conversion RateWaybill#destinationCurrencyRate + Waybill#destinationCharges#CurrencyUnit
33BCollect Charges in Destination Currency-Calculated value: 30A*33B
33CCharges at DestinationWaybill#destinationCharges
33DTotal Collect Charges-Calculated value: 33B+33C
34AOptional Shipping Information - Reference NumberWaybill#shippingRefNo
34BOptional Shipping Information - Untitled BoxWaybill#shippingInfo
34COptional Shipping Information - Untitled Box-
+

While data can change at its source (e.g. shipment being reweighted), 2 API specific features allow to re-create the equivalent of a paper Waybill using the mapping above with the right data: +- The Audit trail ensures that all changes to data is tracked and properly identified +- One can retrieve data using a specific timestamp (for instance equivalent to RCS event or the Waybill ready event) to have the data that was agreed upon at that time

+

Data model

+

Naturally the Waybill object is at the center of the data model when the Air Waybill is concerned, whether we refer to the paper or electronic waybill.

+

The WaybillLineItem object is also necessary, linked to Waybill object, to properly record the information at Air Waybill level. The line items as used in the Air Waybill cannot always be linked to actual Piece objects as the level of information required does not always reflect the physical goods. This is because we can have discrepancy between actual goods transported and rates as they are defined.

+

Also it is possible that all accurate piece details are available at the the Waybill.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/General/resources/index.html b/development/General/resources/index.html new file mode 100644 index 00000000..bd8b045f --- /dev/null +++ b/development/General/resources/index.html @@ -0,0 +1,2851 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Resources - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/index.html b/development/Orchestration/index.html new file mode 100644 index 00000000..ba978f71 --- /dev/null +++ b/development/Orchestration/index.html @@ -0,0 +1,2941 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Introduction - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Introduction

+ +

image

+

Introduction

+

The Data Orchestration is a work that was intitiated in September 2023, under COTB and DCWG governance. Industry stakeholders (Airline, Freight Forwarders, IT Service Providers, Cargo iQ) have worked to propose a way to use the ONE Record standard to support the operations and business processes.

+

Objectives

+

As a response to the industry for guidance with ONE Record, we figured the Data Orchestration is the answer to make the link between processes and ONE Record standard. It includes: +* Review of the Industry and Cargo iQ Master Operating Plans (MOP) +* Identification of key industry use cases +* Identification of ONE Record workflow that supports the processes and use cases +* Provide tools to check compliance with the standard and illustrate the Data Orchestration

+

How did we operate?

+

The MOP is an overall standard process that defines steps, activities and specific milestones in the transportation supply chain. All stakeholders operate differently thus the MOP should be seen as a general guideline and reference but not an absolute standard. The Data Orchestration decided to use the MOP as a starting point to cover most of the required steps and milestones while transporting general cargo.

+

+ +

+

The mixed approach

+ +

We have decided to use a mixed approach based on the Activities/Process steps analysis and the Milestones analysis. The two approaches have different outcomes that are completing each other.

+

Starting from the activities

+

+ +

+

From the activities to the Data Model

+ +

The Activites, as defined in the MOP, are sequential although there could be some parallel flows or different order depending on the situation. The main objective of the Data Orchestration is to define for each activity what ONE Record actions are required and by whom. This includes: +* Identifying all data (Objects) that need to be created, updated, deleted or shared accordingly +* Identifying all relevant stakeholders: who holds the data, who is accountable for the data, with whom the data shall be shared +* Defining API calls and content

+

Starting from the milestones

+

+ +

+

From the milestones to the Data Model

+ +

A Milestone, from Cargo iQ perspective is:

+
+

A planned checkpoint in a route map indicating the latest time by which an event or events are expected to happen at a given location.

+
+

Milestones are used in the Data Orchestration as the latest time by which we need to ensure that certain mechanisms or data are made avaialble to other stakeholders. In current messaging environment, milestones are converted into: +* Providing status update though (X)FSU messages with dedicated status codes +* Sending Waybill data through (X)FWB and (X)FZB +* Sending booked freight list and manifest through (X)FBL and (X)FFM

+

For the analysis with the Data Orchestration our main objective is to ensure that all those mechanisms and messages are mapped with ONE Record, it ususally relies on: +* Mapping (X)FSU message with a dedicated LogisticsEvent +* Making sure a proper set of data is available and shared accordingly as a replacement of a message

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-01/index.html b/development/Orchestration/orchestration-01/index.html new file mode 100644 index 00000000..0cf7209b --- /dev/null +++ b/development/Orchestration/orchestration-01/index.html @@ -0,0 +1,3325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P01 - Book Shipment - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P01 - Book Shipment

+ +

First Segment of the MOP, related to the interaction between the Shipper and the Forwarder.

+

01. Shipper provides shipment details

+

In this step the Shipper provides initial shipment details to its freight forwarder.

+

As Shipper provides shipment details, it is the equivalent of the SLI. The Shipper or the Forwarder on its behalf, creates Product, Item and Piece objects, including ULD if relevant and any Special cargo subtype for Live Animals or Dangerous Goods to further describe goods to transport. SecurityDeclaration object can be created as well if relevant +Parties are created as well (if not already existing), are required at minimum the Consignee (Shipper) and Consignor details.

+

Are included as well: handling instructions directly in the Piece details, ExternalReference if applicable (for rerefence documents)

+

If Shipper hosts a 1R server he needs to make sure teh Forwarder has proper access to data

+

Values to declare for carriage and customs are not on Piece

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
Shipper or ForwarderShipper or ForwarderPOSTProductMinimum Product details, including HS codes: hsCode, description
Shipper or ForwarderShipper or ForwarderPOSTItemMinimum Item details including link to Product: itemQuantity, ofProduct
Shipper or ForwarderShipper or ForwarderPOSTPieceMinimum Piece details to define the goods. Includes link to Product or Item: contentProducts/containedItems, goodsDescription, slac, specialHandlingCodes, textualHandlingInstructions, declaredValue
Shipper or ForwarderShipper or ForwarderPOSTSecurityDeclarationSecurity details available at this stage
Shipper or ForwarderShipper or ForwarderPOSTULDOptional, if relevant
Shipper or ForwarderShipper or ForwarderPATCHProduct and/or ItemAdd backlinks to relevant objects (to Piece or Item>Product)
+

02. Receive Forwarding Order from shipper & check security status

+

In this step the Forwarder receives data from the Shipper

+

Forwarder creates the Waybill objects (House) and Shipments based on the details provided by the Shipper.

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTWaybillHouse Waybill object: arrivalLocation, departureLocation, involvedParties (Shipper and Forwarder), waybillType (House), waybillNumber, declaredValueForCustoms, declaredValueForCarriage
ForwarderForwarderPOSTShipmentShipments details and link to Waybill object: waybill, insurance, involvedParties, totalGrossWeight, totalDimensions, goodsDescription
ForwarderForwarderPATCHWaybillAdd backlink Waybill>Shipment
+

03. Check Banned and Restricted Commodities

+

Internal process

+

04. Plan routing direct or consolidation

+

Internal process

+

05. Arrange Capacity

+

Distirbution process

+

06. Confirm Capacity

+

Distribution process

+

07. Create Shipment Planning (MAWB) and confirm Service Commitment to Forwarder

+

Distribution process, the main outputs expected are the Booking object created by the Airline and the Waybill object (MAWB) created by the Forwarder

+

Status/Message: RMP and BKD

+

CiQ Milestone: BKD

+

08. Confirm capacity with Customer

+

Internal process

+

09. Create D2D Shipment Planning (HAWB/DAWB) and confim Service Commitment too Shipper

+

Status/Message: RMI

+

CiQ Milestone: CBK

+

The Forwarder updates the Waybill objects (Master and Houses) to link them. TransportMovement objects for Truck movement are created, Loading actions (planned) are created and linked with the respective TransportMovement and Pieces.

+

Flight details are directly retrieved from the Booking.

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPATCHWaybill (Master)Add backlink Waybill (House) > Waybill (Master)
ForwarderForwarderPATCHWaybill (House)Add backlink Waybill (Master) > Waybill (House)
ForwarderForwarderPOSTTransportMovement (Truck Movement)Add backlink Waybill>Shipment
ForwarderForwarderPOSTTransportMeans (Truck)Create TransportMeans or Identify existing one and add link to TransportMovement (Truck): operatedTransportMovement, vehicleType, vehicleModel, vehicleRegistration, transportOrganization
ForwarderForwarderPATCHTransportMovement (Truck Movement)Add backlink TransportMeans > TransportMovement (Truck)
ForwarderForwarderPOSTLoading (Planned)Loading action (planned): servedActivity (TM Truck), loadedPieces, onTransportMeans, loadingType (Loading), executionStatus (Planned), actionEndTime
+

10. Share planning for pickup all involved Service Suppliers

+

The Forwarder manages the data access to relevant stakeholders if using ONE Record to share all pickup data.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-02/index.html b/development/Orchestration/orchestration-02/index.html new file mode 100644 index 00000000..f137cfee --- /dev/null +++ b/development/Orchestration/orchestration-02/index.html @@ -0,0 +1,3093 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P02 - Arrange handover from Shipper - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P02 - Arrange handover from Shipper

+ +

Process where all preparations are made on Shipper's end and on Forwarder's end to handover the shipment to Forwarder.

+

01. Arrange Pick up or Self Delivery of Freight

+

Forwarder validates data of the TransportMovement, a PATCH can be done if necessary.

+

02. Commercial invoice and packing lists and any certificates

+

03. Labelling freight

+

Human action, can be done by the shipper, by the trucker on pickup or by the forwarder on arrival at warehouse. UPID is defined for each piece.

+

04. Associate unique piece level information with forwarding order

+

Piece are udpated with UPID information and any additional details

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
Shipper or ForwarderForwarderPATCHPieceUpdate UPID property on Piece
ShipperForwarderPOSTEvent on PieceCreate Event: eventFor (Piece), eventLocation (if relevant), eventCode or eventName, eventDate, recordingActor
+

05. Pick up freight

+

Loading (actuals) are created and linked with TransportMovement (truck) and Pieces.

+

Events can be created on the Pieces to inform of the loading into the truck

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTLoading (Actual)Loading action (Actual): servedActivity (TM Truck), loadedPieces, onTransportMeans, loadingType (Loading), executionStatus (Actual), actionEndTime
ShipperForwarderPOSTEvent on PieceCreate Event: eventFor (Piece), eventLocation (if relevant), eventCode or eventName, eventDate, recordingActor
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-03/index.html b/development/Orchestration/orchestration-03/index.html new file mode 100644 index 00000000..ecc3e120 --- /dev/null +++ b/development/Orchestration/orchestration-03/index.html @@ -0,0 +1,3349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P03 - Receive freight at forwarder warehouse - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P03 - Receive freight at forwarder warehouse

+ +

Process where forwarders receives freight from Shipper and checks freight data suhc as weight, dimensions etc.

+

01. Check/apply labelling & verify phyisical integrity of packages

+

Event is added on Pieces to indicate Freight received in forwarder warehouse.

+

Check of labelling/physical integrity can be through a Check object or an Event added on Pieces.

+

Milestone: REW

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
Shipper or ForwarderForwarderPOSTEvent on PieceCreate Event: eventFor (Piece), eventLocation (if relevant), eventCode or eventName (Received in forwarder warehouse), eventDate, recordingActor
ShipperForwarderPOSTCheckCreate Check: up to stakeholder to define what and how to check
+

02. Check information to match actual freight and security status to confirm shipment data on-hand

+

Forwarder checks weight, dimensions and security status of the freight. Pieces and Shipment are updated if relevant, along with SecurityDeclaration on Pieces

+

Milestone: SDO

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPATCHShipmentUpdate Shipment properties based on check: weight, dimensions, or others
Shipper or ForwarderForwarderPATCHPiecesUpdate Piece details on behalf fo shipper
Shipper or ForwarderForwarderPATCHSecurityDeclarationUpdate SecurityDeclaration of relevant pieces
+

03. Check accuracy of booking & adust if needed

+

Forwarder checks the accuracy of booking compared to freight details, Booking can be updated (see Distribution process)

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineForwarderPATCHBookingCommunicate booking updates with Airline, refer to Distribution process
+

04. Complete shipment record

+

At this stage shipment record should be accurate and updated already, Forwarder can make a final check and adjust objects if necessary

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
Shipper or ForwarderForwarderPATCHShipment, Piece, etc.Update if necessary
+

05. Transmit/file electronic data to authorities if self-filing

+

Based on Customs requirements, Customs messages can be populated with 1R data as per proposed mapping.

+

Event on Waybill (Master) can be added to indicate a self-filing

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on WaybillCreate Event: eventFor (Waybill), eventName (Ready for Customs processing)
+

Milestone: PHL

+

06. Asssess Electronic data and provide DNL

+

Event on Waybill (Master) can be added by Authorities to indicate the Customs assessment status

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderAuthoritiesPOSTEvent on WaybillCreate Event: eventFor (Waybill), eventName (Relevant Customs assessment status)
+

07. Sort & transfer freight to build or storage locations

+

Internal process but could be used with Storing action in the future

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-04/index.html b/development/Orchestration/orchestration-04/index.html new file mode 100644 index 00000000..2f405612 --- /dev/null +++ b/development/Orchestration/orchestration-04/index.html @@ -0,0 +1,3055 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P04 - Prepare transfer to forwarder - Downstream warehouse or airline - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P04 - Prepare transfer to forwarder - Downstream warehouse or airline

+ +

Process where the forwarder prepares the transfer fo freight to any downstrean warehouse or directly to carrier domain.

+

01. Confirm information to downstream forwarder warehouse

+

Forwarder checks that data is available and shared with relevant stakeholder

+

02. Issue loading list for truck to downstream forwarder warehouse or airline

+

Forwarder creates TransportMovements for truck movement and Loading (planned) actions to link TransportMovement and Pieces

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTTransportMovement (Truck Movement)Create TM (Truck): departureLocation, arrivalLocation, modeCode (3?), transportIdentifier
ForwarderForwarderPOSTLoading (Planned)Loading action (planned): servedActivity (TM Truck), loadedPieces, onTransportMeans, loadingType (Loading), executionStatus (Planned), actionEndTime
+

03. Loaded truck departs forwarder branch facility ot hub

+

Internal process but could be used with Storing action in the future

+

Loading (actuals) are created and linked with TransportMovement (truck) and Pieces.

+

Events can be created on the Pieces to inform of the loading into the truck.

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTLoading (Actual)Loading action (actual): servedActivity (TM Truck), loadedPieces, onTransportMeans, loadingType (Loading), executionStatus (Planned), actionEndTime
Shipper or ForwarderForwarderPOSTEvent on PieceCreate Event: eventFor (Piece), eventLocation (if relevant), eventCode or eventName (Loaded in truck), eventDate, recordingActor
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-05/index.html b/development/Orchestration/orchestration-05/index.html new file mode 100644 index 00000000..4b84711a --- /dev/null +++ b/development/Orchestration/orchestration-05/index.html @@ -0,0 +1,3128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P05 - Prepare export shipments - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P05 - Prepare export shipments

+ +

Process where the Forwarder prepares export shipments

+

01. Create (M)AWB shipment record and consolidation manifest

+

Forwarder creates or updates the MAWB with latest details.

+

Consolidation manifest data should be included in 1R already but a check by the Forwarder can be done, with potential updates of relevant objects.

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPATCHShipment, Waybill, etc.Potential update on the MAWB details if relevant
+

02. Send freight picking instructions to warehouse

+

Forwarder creates TransportMovements for truck movement from warehouse to carrier domain and Loading (planned) actions to link TransportMovement and Pieces/ULDs.

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTTransportMovement (Truck Movement)Create TM (Truck): departureLocation, arrivalLocation, modeCode (3?), transportIdentifier
ForwarderForwarderPOSTLoading (Planned)Loading action (planned): servedActivity (TM Truck), loadedPieces, onTransportMeans, loadingType (Loading), executionStatus (Planned), actionEndTime
+

03. Transmit (H)AWB electronic data to carrier/customs/AVSEC

+

Make sure data is accessible by stakeholders, Events are created on HAWB and MAWB that data is ready to be fetched.

+

eCSD data should be available as well, meaning SecurityDeclaration should be checked/updated. An Event on Piece could be used to mention that eCSD is OK to be retrieved.

+

Milestone: FHL FWB +Message: (X)FHL and (X)FWB

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on Waybill (MAWB and HAWB when relevant)Create Event: eventFor (Waybill), eventName (Waybill data ready), eventDate, recordingActor
Shipper or ForwarderForwarderPOSTEvent on PiecesCreate Event: eventFor (Pieces), eventName (eCSD data OK), eventDate, recordingActor
+

04. Prepare shipment for export

+

Internal process

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-06/index.html b/development/Orchestration/orchestration-06/index.html new file mode 100644 index 00000000..5e078eff --- /dev/null +++ b/development/Orchestration/orchestration-06/index.html @@ -0,0 +1,3040 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P06 - Prepare receipt into carrier domain - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P06 - Prepare receipt into carrier domain

+ +

Process where the Airline and GHA prepare to receive freight from the Forwarder.

+

01. AWB content validation/amendments

+

If relevant, the Airline updates the Booking with latest data of the Shipment and Pieces.

+

Message: (X)FHL and (X)FWB

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirlinePATCHBookingPotential update of Booking data based on latest Waybill, Shipment, Pieces, etc. data
+

02. Channel forwarder information to GHA where applicable

+

Airline makes relevant data accessible to GHA (authorized and delegated access).

+

03. Receive (H)AWB electronic data

+

GHA retrieves or accesses data.

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
Shipper or ForwarderGHAGETWaybill, Shipment, Pieces, etc.-
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-07/index.html b/development/Orchestration/orchestration-07/index.html new file mode 100644 index 00000000..cbb40f6e --- /dev/null +++ b/development/Orchestration/orchestration-07/index.html @@ -0,0 +1,3023 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P07 - Receive shipment at carrier domain - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P07 - Receive shipment at carrier domain

+ +

Process where the Airline receives the shipment at Carrier domain

+

01. Registration of AWB (w/ or w/out docs) / Truck driver to obtain unloading dock

+

TransportMovement of the Truck is updated with accurate drop off location.

+

An event DOC can be added on the Truck TransportMovement to reflect the registration at the dock.

+

Milestone: DOC

+

02. Validate Security/Customs status of truck

+

A Check object to verify Security and Customs status can be created, the results are registered in the CheckTotalResult object.

+

An Event on the Pieces/ULDs or Shipment can also be created to record the check

+

03. Assign unloading slot and position to deliver truck

+

Event is added on the Truck TransportMovement indicating arrival at dock position

+

04. Unload truck

+

Unloading (actuals) are created and linked with TransportMovement (truck) and Pieces.

+

Events are created on the Pieces/ULDs with FOH

+

Message: (X)FSU with FOH status +Milestone: LAT

+

05. Receive transferred shipments (FF & carrier)

+

06. Move shipment to storage location

+

Storage Activity is created with Storing Action (actuals) to link the Pieces/ULD to a storage place.

+

Milestone: STI

+

07. Screen freight as applicable

+

If applicable, create or patch existing SecurityDeclaration linked to Pieces

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-08/index.html b/development/Orchestration/orchestration-08/index.html new file mode 100644 index 00000000..cde31013 --- /dev/null +++ b/development/Orchestration/orchestration-08/index.html @@ -0,0 +1,3166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P08 - Accept shipment as ready for carriage - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P08 - Accept shipment as ready for carriage

+ +

Process where the Airline/GHA checks the freight and accepts as Ready for Carriage

+

01. Verify shipment has cleared security

+

A Check object can be created and linked to Pieces/Shipment for RCS data

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline / GHAPOSTCheckCreate Check object with relevant details (up to GHA / Airline)
+

02. Physical acceptance check

+

If a Check object is used the Airline/GHA updates it accordingly.

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline / GHAPATCHCheckUpdate Check data with results
+

03. Docs acceptance check

+

An Event is added on Shipment/Pieces to register RCS/RCT event. Note: RCS is only applicable for whole shipment.

+

If RCT, access delegation needs to be ensured

+

Message: (X)FSU with RCS / RCT status +Milestone: RCS or RCT

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline / GHAPOSTEvent on Pieces/ShipmentCreate Event: eventFor (Pieces or Shipment), eventLocation (carrier domain tbd), eventcode (RCT or RCS), eventDate, recordingActor
+

04. File EHCP and trigger resolution process (or workflow)

+

Event on Shipment or Piece to record the EHCP (CiQ process)

+

Message: (X)FSU with FOH status +Milestone: LAT

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline / GHAPOSTEvent on Pieces/ShipmentCreate Event: eventFor (Pieces or Shipment), eventLocation (carrier domain tbd), eventcode (EHCP - xxx), eventDate, recordingActor
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-09/index.html b/development/Orchestration/orchestration-09/index.html new file mode 100644 index 00000000..8cd3eb7a --- /dev/null +++ b/development/Orchestration/orchestration-09/index.html @@ -0,0 +1,3464 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P09 - Prepare freight for transport - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P09 - Prepare freight for transport

+ +

Process where the Airline/GHA prepares the freight for it transportation

+

01. Transshipment Cargo received from Process 13

+

1st Airline makes sure that 2nd Airline has proper access (data and/or delegated access) to the shipment record.

+

02. Transshipment Cargo security cleared

+

GHA checks the Security status of the pieces and updates the SecurityDeclaration on the Pieces if relevant.

+

An Event is added on the Pieces if relevant to record the check results

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline / GHAPATCHSecurityDeclarationUpdate accordingly
AirlineAirline / GHAPOSTEvent on PiecesCreate Event: eventFor (Pieces), eventLocation (carrier domain?), eventName (Security Status checked), eventDate, recordingActor
+

03. Plan flight and send booking list to warehouse

+

Most of XFBL data should already be in ONE Record at that stage. Refer to mapping XFBL to 1R for further details.

+

The Airline needs to make sure that GHA has access to all relevant data related to the freight booked list.

+

UnitComposition Activity can be created for conslidations made by GHA. Respective Composing actions (Planned) can be created to link Pieces and ULDs Loading Action (Planned) is created by GHA to link Pieces/ULD and TransportMeans (Aircraft) via the TransportMovement (flight). This is either a direct Post via delegated access or request to create objects on Airline system

+

Message: (X)FBL

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline / GHAPOSTUnitCompositionCreate UnitComposition activity
AirlineAirline / GHAPOSTComposing (Planned)Create Composing: servedActivity (UnitComposition), loadingUnit (ULD or Pallet), composedPieces (Pieces), compositionType (Composition), actionTimeType (Planned)
AirlineAirline / GHAPOSTTransportMovement (Flight)Create TM-Flight if not created before
AirlineAirline / GHAPOSTLoading (planned)Loading action (planned): servedActivity (TM-Flight), loadedPieces (Pieces) and/or loadingUnits (ULD/Pallet), loadingType (loading), actionTimeType (planned)
AirlineAirline / GHAPOSTEvent on TM-FlightCreate Event: eventFor (TM-Flight), eventLocation (not relevant), eventName (Freight booked List available), eventDate, recordingActor
+

04. Move shipment to storage location

+

Storage Activity is created with Storing Action (actuals) to link the Pieces/ULD to a storage place if relevant

+

Milestone: STO

+

API interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline / GHAPOSTStorageCreate Storage activty
AirlineAirline / GHAPOSTStoring (actual)Storing action (actual): servedActivity (Storage), storingtype (STORE_IN). storedObjects (Pieces/ULDs), storagePlaceIdentifier
+

05. Collect freight and unitize as planned

+

UnitComposition Activity is created with Composing Action (Actuals) to link Pieces and ULDs

+

Milestone: MAN / FUM

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline / GHAPOSTComposing (Actual)Create Composing: servedActivity (UnitComposition), loadingUnit (ULD or Pallet), composedPieces (Pieces), compositionType (Composition), actionTimeType (Actual)
+

06. Consolidate information and send final manifest data

+

Loading Action (Planned) is updated if relevant by GHA to link Pieces/ULD and TransportMeans (Aircraft) via the TransportMovement (flight). This is either a direct Post via delegated access or request to create objects on Airline system

+

Milestone: UWS

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline / GHAPATCHLoading (planned)Update loading (planned) if required
+

07. Create aircraft load planning by Load control

+

Loading Actions (Planned) can be updated by Airline if relevant. This is either a Change request (if GHA has the data) or direct Patch.

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline / GHAPATCHLoading (planned)Update loading (planned) if required
+

07. Process PLACI customs status notification

+

Customs assesses the PLACI status based on data shared. As a prerequisite, data needs to be made accessible to Authorities by Airline and/or Forwarder.

+

A dedicated Event on the Waybill can be created to notify Customs that PLACI data can be processed.

+

08. Send PLACI status notification to airline

+

Event is added on Shipment/MAWB by Authorities for PLACI status.

+

API interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderAuthoritiesPOSTEvent on WaybillCreate Event: eventFor (Waybill), eventName and/or eventCode (PLACI status), eventDate, recordingActor
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-10/index.html b/development/Orchestration/orchestration-10/index.html new file mode 100644 index 00000000..498a1fde --- /dev/null +++ b/development/Orchestration/orchestration-10/index.html @@ -0,0 +1,3058 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Orchestration 10 - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Orchestration 10

+ +

Process where the Airline/GHA prepares the freight for it transportation

+

01. Move shipments from warehouse to hold area for ramp transport

+

TransportMovement for in-warehouse movement created with Loading (storage location, actuals) and Unloading (hold area, actuals) actions to link Pieces/ULDs and TransportMovement.

+

Events can be added on Pieces/ULDs to communicate FOW milestone and for pickup

+

Message: (X)FSU with FOW status +Milestone: FOW

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderAirline / GHAPOSTTransportMovement (WH mouvement)Create TM-WH: departureLocation and arrivalLocation to be defined
AirlineAirline / GHAPOSTLoading (Actual)Loading action (actual): servedActivity (TM-WH), loadedUnits and/or loadedPieces (Pieces/ULDs), loadingType (Loading), actionTimeType (Actual), onTransportMeans (if relevant)
AirlineAirline / GHAPOSTUnloading (Actual)Unloading action (actual): servedActivity (TM-WH), loadedUnits and/or loadedPieces (Pieces/ULDs), loadingType (Unloading), actionTimeType (Actual), onTransportMeans (if relevant)
AirlineAirline / GHAPOSTEvent on Pieces/ULDsCreate Event: eventFor (Pieces/ULDs), eventLocation, eventName and/or eventCode (FOW), eventDate, recordingActor
+

02. Move shipments from hold area to parking position

+

TransportMovement from hold area to parking position created with Loading (actuals) and Unloading (actuals) actions to link Pieces/ULDs and TransportMovement

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderAirline / GHAPOSTTransportMovement (Ramp movement)Create TM-Ramp: departureLocation and arrivalLocation to be defined
AirlineAirline / GHAPOSTLoading (Actual)Loading action (actual): servedActivity (TM-Ramp), loadedUnits and/or loadedPieces (Pieces/ULDs), loadingType (Loading), actionTimeType (Actual), onTransportMeans (if relevant)
ForwarderAirline / GHAPOSTUnloading (Actual)Unloading action (actual): servedActivity (TM-Ramp), loadedUnits and/or loadedPieces (Pieces/ULDs), loadingType (Unloading), actionTimeType (Actual), onTransportMeans (if relevant)
+

03. Load Aircraft as per Load Plan

+

Loading Action (Actuals) is created to link Pieces/ULD and TransportMeans (Aircraft) via the TransportMovement (flight) (c.f. 9.5)

+

Milestone: ALS / ALE

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline / GHAPOSTLoading (Actual)Loading action (actual): servedActivity (TM-Flight), loadedPieces (Pieces) and/or loadingUnits (ULD/Pallet), loadingType (loading), actionTimeType (actual)
ForwarderAirline / GHAPOSTEvent on Pieces/ULDsCreate Event: eventFor (Pieces/ULDs), eventLocation, eventName and/or eventCode (Loaded in aircraft), eventDate, recordingActor
+

04. Create Final Load Report to load control (LIR)

+

Creation of the Final Load Report.

+

05. Off blocks

+

MovementTimes created on TransportMovement (Flight) to record the Off blocks. Event can be added on TransportMovement as well.

+

Message: MVT/XTMV +Milestone: OFB

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirlinePOSTEvent on TransportMovement (Truck)Create Event: eventFor (TM-Flight), eventLocation (Airport), eventCode (AO), eventDate, recordingActor
AirlineAirlinePOSTOptional - MovementTime on TransportMovement (TM-Flight)Create MovementTime: movementTimeType (actual), movementMilestone (AO), movementTimestamp
+

06. Depart flight

+

DEP milestone is more or less the combination of Flight Manifest data and Off blocks. Equivalent of XFFM data are shared between GHA and Airline, at this stage Airline makes sure all XFFM data are there (cf. mapping)

+

Message: (X)FFM and MVT/XTMV for Departure (DEP) +Milestone: DEP

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-11/index.html b/development/Orchestration/orchestration-11/index.html new file mode 100644 index 00000000..9452bd33 --- /dev/null +++ b/development/Orchestration/orchestration-11/index.html @@ -0,0 +1,3078 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P11 - Information exchange and flight - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P11 - Information exchange and flight

+ +

Flight, including information exchange in parallel.

+

01. Wheels up

+

MovementTimes created on TransportMovement (Flight) to record the departure wheels up. Event can be added on TransportMovement as well.

+

Message: MVT/XTMV with Wheels off status

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirlinePOSTEvent on TransportMovement (TM-Flight)Create Event: eventFor (TM-Flight), eventLocation (Airport), eventCode (AD), eventDate, recordingActor
AirlineAirlinePOSTOptional - MovementTime on TransportMovement (TM-Flight)Create MovementTime: movementTimeType (actual), movementMilestone (AD), movementTimestamp
+

02. Transmit flight and shipment information to down line stations & authorities

+

At this stage all data required for XFFM/XFWB/XFHL should be there already. Airline needs to make sure all relevant stakeholders have access to data.

+

Message: (X)FWB, (X)FFM, (X)FHL

+

03. Receive flight and shipment information from airline

+

Loading Action (Actuals) is created to link Pieces/ULD and TransportMeans (Aircraft) via the TransportMovement (flight) (c.f. 9.5)

+

Message: UCM

+

04. Wheels down

+

MovementTimes created on TransportMovement (Flight) to record the departure wheels down. Event can be added on TransportMovement as well.

+

Message: MVT/XTMV +Milestone: WDO

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirlinePOSTEvent on TransportMovement (TM-Flight)Create Event: eventFor (TM-Flight), eventLocation (Airport), eventCode (AA), eventDate, recordingActor
AirlineAirlinePOSTOptional - MovementTime on TransportMovement (TM-Flight)Create MovementTime: movementTimeType (actual), movementMilestone (AA), movementTimestamp
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-12/index.html b/development/Orchestration/orchestration-12/index.html new file mode 100644 index 00000000..0d580ab1 --- /dev/null +++ b/development/Orchestration/orchestration-12/index.html @@ -0,0 +1,3202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P12 - Arrive flight, unload and dispatch shipment to warehouse - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P12 - Arrive flight, unload and dispatch shipment to warehouse

+ +

Process where the freight arrives at destination airport and is dispatched to warehouse

+

01. On blocks

+

MovementTimes created on TransportMovement (Flight) to record the on-blocks. Event can be added on TransportMovement as well.

+

Message: MVT/XTMV

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirlinePOSTEvent on TransportMovement (TM-Flight)Create Event: eventFor (TM-Flight), eventLocation (Airport), eventCode (AB), eventDate, recordingActor
AirlineAirlinePOSTOptional - MovementTime on TransportMovement (TM-Flight)Create MovementTime: movementTimeType (actual), movementMilestone (AB), movementTimestamp
+

02. Arrive flight at destination

+

Message: MVT/XTMV with Arrival +Milestone: ARR

+

03. Unload flight

+

Unloading Action (Actual) is created to record the unloading of Pieces/ULDs from the plane via the TransportMovement (flight)

+

Message: AUS/AUE +Milestone: AUS/AUE

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline/GHAPOSTUnloading (Actual)Unloading action (actual): servedActivity (TM-Flight), loadedPieces (Pieces) and/or loadingUnits (ULD/Pallet), loadingType (unloading), actionTimeType (actual)
+

04. Move flight load to appropriate facility

+

TransportMovement from ramp to warehouse is created.

+

Loading Action (Actual) is created to link the Pieces/ULDs and the TransportMovement above.

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline/GHAPOSTTransportMovement (Ramp movement)Create TM-Ramp: departureLocation and arrivalLocation to be defined
AirlineAirline/GHAPOSTLoading (Actual)Loading action (actual): servedActivity (TM-Ramp), loadedUnits and/or loadedPieces (Pieces/ULDs), loadingType (Loading), actionTimeType (Actual), onTransportMeans (if relevant)
+

05. Accept flight load at warehouse

+

Event is added on Pieces/ULDs to indicate FIW milestone

+

Message: XFSU with FIW status +Milestone: FIW

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline/GHAPOSTEvent on Pieces/ULDsCreate Event: eventFor (Pieces/ULDs), eventLocation, eventName and/or eventCode (FIW), eventDate, recordingActor
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-13/index.html b/development/Orchestration/orchestration-13/index.html new file mode 100644 index 00000000..70da37d8 --- /dev/null +++ b/development/Orchestration/orchestration-13/index.html @@ -0,0 +1,3274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P13 - Check in shipment - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P13 - Check in shipment

+ +

Process where the freight and its documents are checked an will be moved to adequate storage location.

+

01. Receive shipments in warehouse

+

Storing activity is created for Pieces in storage location. Location itself will give details on the type of storage for transit, transfer or import.

+

ULDs are broken down if required, Decomposing Action is used to break down ULDs and remove the Pieces

+

Message: (X)FSU with RCF status +Milestone: RCF

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline/GHAPOSTStorageCreate Storage activity
AirlineAirline/GHAPOSTStoring (actual)Storing action (actual): servedActivity (Storage), storingtype (STORE_IN). storedObjects (Pieces/ULDs), storagePlaceIdentifier
AirlineAirline/GHAPOSTUnitCompositionCreate UnitComposition activity
AirlineAirline/GHAPOSTComposing (Planned)Create Composing: servedActivity (UnitComposition), loadingUnit (ULD or Pallet), composedPieces (Pieces), compositionType (Decomposition), actionTimeType (Actual)
ForwarderAirline/GHAPOSTEvent on ShipmentCreate Event: eventFor (Shipment), eventLocation (Airport), eventCode (RCF), eventDate, recordingActor
+

02. Docs received from flight

+

Destination GHA should have access to relevant data from flight

+

Message: (X)FSU with AWR status +Milestone: AWR

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderAirline/GHAPOSTEvent on ShipmentCreate Event: eventFor (Shipment), eventLocation (Airport), eventCode (AWR), eventDate, recordingActor
+

03. Move Transshipment cargo to appropriate location (see process 9)

+

Relevant TransportMovement for change of storage location can be created

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline/GHAPOSTTransportMovement (WH movement)Create TM-WH: departureLocation and arrivalLocation to be defined
+

04. Move shipments to be transferred to other carrier

+

TransportMovement for transfer is created with relevant arrivalLocation (other carrier storage place or else)

+

Message: (X)FSU with TFD status +Milestone: TFD

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline/GHAPOSTTransportMovement (transfer movement)Create TM-Transfer: departureLocation and arrivalLocation to be defined
ForwarderAirline/GHAPOSTEvent on ShipmentCreate Event: eventFor (Shipment), eventLocation (Airport), eventCode (TFD), eventDate, recordingActor
+

05. Move import shipment to storage location

+

TransportMovement times can be updated (departure and arrival) with Events on the pieces to reflect the movement (arrived at storage, etc)

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline/GHAPOSTEvent on TransportMovement (TM-WH)Create Event: eventFor (TM-WH), eventLocation (WH), eventName (Departure from warehouse), eventDate, recordingActor
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-14/index.html b/development/Orchestration/orchestration-14/index.html new file mode 100644 index 00000000..297ef2d7 --- /dev/null +++ b/development/Orchestration/orchestration-14/index.html @@ -0,0 +1,3023 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P14 - Prepare shipment for delivery - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P14 - Prepare shipment for delivery

+ +

Process where the freight is prepared to be handed over to Forwarder.

+

01. Notify Forwarder Freight and Information On Hand at Destination

+

Event is added on Shipment to record the NFD milestone.

+

Message: (X)FSU with NFD status +Milestone: NFD

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline/GHAPOSTEvent on ShipmentCreate Event: eventFor (Shipment), eventCode (NFD), eventDate, recordingActor
+

02. Hand over of Documents (Information) to Forwarder

+

Amend AWB data if required.

+

Message: (X)FSU with AWD status +Milestone: AWR

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline/GHAPOSTEvent on ShipmentCreate Event: eventFor (Shipment), eventCode (AWR), eventDate, recordingActor
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-15/index.html b/development/Orchestration/orchestration-15/index.html new file mode 100644 index 00000000..9b76c96b --- /dev/null +++ b/development/Orchestration/orchestration-15/index.html @@ -0,0 +1,3009 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P15 - Customs clearance - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P15 - Customs clearance

+ +

Customs clearance process

+

01. Handover to consignee's appointed Customs broker

+

External process

+

02. Trigger Customs clearance

+

External process

+

03. Start Customs clearance

+

External process

+

04. Customs Clearance completed

+

Message: (X)FSU with CCD status +Milestone: TOA and CCD

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline/GHAPOSTEvent on ShipmentCreate Event: eventFor (Shipment), eventCode (CCD), eventDate, recordingActor
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-16/index.html b/development/Orchestration/orchestration-16/index.html new file mode 100644 index 00000000..1608c27f --- /dev/null +++ b/development/Orchestration/orchestration-16/index.html @@ -0,0 +1,3234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P16 - Handover freight to forwarder - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P16 - Handover freight to forwarder

+ +

Process where the freight is handed over to the forwarder.

+

01. Arrange truck for deliver

+

TransportMovement for truck movement from carrier domain to forwarder hub is created.

+

Loading actions (Planned) are created to link Pieces to the TransportMovement.

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTTransportMovement (Truck)Create TM-Truck: departureLocation (carrier domain), arrivalLocation (forwarder hub)
ForwarderForwarderPOSTLoading (Planned)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (loading), actionTimeType (planned), onTransportMeans (if relevant at that stage)
+

02. Registration of AWB / truck driver to obtain loading dock

+

External process

+

03. Check customs release status

+

Check or Event can be added at that stage if required

+

04. Assign loading dock and timeslot for trucker

+

TransportMovement of the Truck is updated with accurate drop off location.

+

An event DOC can be added on the Truck TransoprtMovement to reflect the registration at the dock.

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTTransportMovement (Truck)Update arrivalLocation with accurate drop-off location
ForwarderForwarderPOSTEvent on TM-TruckCreate Event: eventFor (TM-Truck), eventCode (DOC), eventDate, recordingActor
+

05. Prepare freight for handover

+

Storage out action (actual) is created to record the movement of the pieces from storage.

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
AirlineAirline/GHAPOSTStorageCreate Storage activty
AirlineAirline/GHAPOSTStoring (actual)Storing action (actual): servedActivity (Storage), storingtype (STORE_OUT). storedObjects (Pieces/ULDs), storagePlaceIdentifier
+

06. Handover freight to forwarder

+

Loading action (actual) is created to link Pieces and TransportMovement (Truck).

+

Event is added on Pieces and/or Shipment to record DLV milestone.

+

Message: (X)FSU with DLV status +Milestone: DLV

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTLoading (Actual)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (loading), actionTimeType (actual), onTransportMeans (if relevant at that stage)
ForwarderForwarderPOSTEvent on Pieces or ShipmentCreate Event: eventFor (Pieces or Shipment), eventCode (DLV), eventDate, recordingActor
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-17/index.html b/development/Orchestration/orchestration-17/index.html new file mode 100644 index 00000000..5f8f9389 --- /dev/null +++ b/development/Orchestration/orchestration-17/index.html @@ -0,0 +1,3126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P17 - Receive shipment at forwarder warehouse - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P17 - Receive shipment at forwarder warehouse

+ +

Freight is received at forwarder hub and prepared or delivery to a branch facility before final delivery

+

01. Unload truck at forwarder hub

+

Unloading action (Actual) to record the unloading of the pieces from the truck

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTunLoading (Actual)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (unloading), actionTimeType (actual), onTransportMeans (if relevant at that stage)
+

02. Deconsolidation

+

03. Check shipment details and physical integrity

+

Check and/or Events can be created on Pieces to record the physical integrity check results

+

Milestone: RIW

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
Shipper or ForwarderForwarderPOSTEvent on PiecesCreate Event: eventFor (Pieces), eventLocation (forwarder hub), eventName (Pieces checked at forwarder hub), evetndAte, recordingActor
+

04. Issue loading list for on carriage or delivery

+

TransportMovement for truck movement from forwarder warehouse to forwarder branch facility.

+

Loading actions (Planned) are created to link Pieces to the TransportMovement.

+

Loading actions (Actuals) are created to link Pieces to the TransportMovement.

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTTransportMovement (Truck)Create TM-Truck: departureLocation (forwarder hub), arrivalLocation (forwarder branch facility)
ForwarderForwarderPOSTLoading (Planned)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (loading), actionTimeType (planned), onTransportMeans (if relevant at that stage)
ForwarderForwarderPOSTLoading (Actual)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (loading), actionTimeType (actual), onTransportMeans (if relevant at that stage)
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-18/index.html b/development/Orchestration/orchestration-18/index.html new file mode 100644 index 00000000..3306fb8e --- /dev/null +++ b/development/Orchestration/orchestration-18/index.html @@ -0,0 +1,3034 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P18 - Movement between hub and branch facility - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P18 - Movement between hub and branch facility

+ +

Movement between forwarder hub and branch facility before final delivery

+

01. Depart truck to forwarder branch facility

+

MovementTimes is added on TransportMovement (Truck) to record the departure from forwarder hub

+

Milestone: DIW

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on TransportMovement (TM-Truck)Create Event: eventFor (TM-Truck), eventLocation (forwarder hub), eventName (Arrival at forwarder hub), eventDate, recordingActor
ForwarderForwarderPOSTOptional - MovementTime on TransportMovement (TM-truck)Create MovementTime: movementTimeType (actual), movementMilestone (AD), movementTimestamp
+

02. Arrive truck at forwarder branch facility

+

MovementTimes is added on TransportMovement (Truck) to record the arrival at forwarder branch facility

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on TransportMovement (TM-Truck)Create Event: eventFor (TM-Truck), eventLocation (forwarder warehouse), eventName (Arrival at forwarder warehouse), eventDate, recordingActor
ForwarderForwarderPOSTOptional - MovementTime on TransportMovement (TM-truck)Create MovementTime: movementTimeType (actual), movementMilestone (AA), movementTimestamp
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-19/index.html b/development/Orchestration/orchestration-19/index.html new file mode 100644 index 00000000..4e7638b9 --- /dev/null +++ b/development/Orchestration/orchestration-19/index.html @@ -0,0 +1,3107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P19 - Receive shipment at forwarder branch facility - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P19 - Receive shipment at forwarder branch facility

+ +

Freight arrives at forwarder branch facility and is prepared for final delivery

+

01. Unload truck at forwarder warehouse

+

Unloading actions (Actuals) are created between Pieces and the TransportMovement to indicate unloading

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTLoading (Actual)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (unloading), actionTimeType (actual), onTransportMeans (if relevant at that stage)
+

02. Check shipment details and physical integrity

+

Check and/or Events can be created on Pieces to record the physical integrity check results

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
Shipper or ForwarderForwarderPOSTEvent on PiecesCreate Event: eventFor (Pieces), eventLocation (forwarder hub), eventName (Pieces checked at forwarder hub), evetndAte, recordingActor
+

03. Issue loading list for on carriage or delivery

+

TransportMovement for truck movement from forwarder branch facility to consignee.

+

Loading actions (Planned) are created to link Pieces to the TransportMovement.

+

Loading actions (Actuals) are created to link Pieces to the TransportMovement.

+

Milestone: RIW

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTTransportMovement (Truck)Create TM-Truck: departureLocation (forwarder hub), arrivalLocation (consignee location)
ForwarderForwarderPOSTLoading (Planned)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (loading), actionTimeType (planned), onTransportMeans (if relevant at that stage)
ForwarderForwarderPOSTLoading (Actual)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (loading), actionTimeType (actual), onTransportMeans (if relevant at that stage)
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-20/index.html b/development/Orchestration/orchestration-20/index.html new file mode 100644 index 00000000..7dffe4f2 --- /dev/null +++ b/development/Orchestration/orchestration-20/index.html @@ -0,0 +1,3109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P20 - Prepare handover to consignee - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P20 - Prepare handover to consignee

+ +

Freight arrives at forwarder branch facility and is prepared for final delivery or picked up by customer directly

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTTransportMovement (Truck)Create TM-Truck: departureLocation (forwarder hub), arrivalLocation (consignee location)
ForwarderForwarderPOSTLoading (Planned)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (loading), actionTimeType (planned), onTransportMeans (if relevant at that stage)
ForwarderForwarderPOSTLoading (Actual)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (loading), actionTimeType (actual), onTransportMeans (if relevant at that stage)
+

01. Contact customer for handover instructions

+

Internal process

+

Milestone: HDP / TPN

+

02. Issue loading list for truck to consignee / load truck

+

TransportMovement for truck movement delivery to consignee is created/updated.

+

Loading actions (Planned) are created to link Pieces to the TransportMovement.

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOST or PATCHTransportMovement (Truck)Create TM-Truck (see steps before) or update based on latest information available
ForwarderForwarderPOSTLoading (Planned)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (loading), actionTimeType (planned), onTransportMeans (if relevant at that stage)
ForwarderForwarderPOSTLoading (Actual)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (loading), actionTimeType (actual), onTransportMeans (if relevant at that stage)
+

03. Pick up freight by customer

+

Event is added on Pieces to indicate that customer has picked up freight

+

Milestone: SPC

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
Shipper or ForwarderForwarderPOSTEvent on PiecesCreate Event: eventFor (Pieces), eventLocation (forwarder branch facility), eventName (Pieces picked up by customer), evetndAte, recordingActor
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-21/index.html b/development/Orchestration/orchestration-21/index.html new file mode 100644 index 00000000..9e086bfd --- /dev/null +++ b/development/Orchestration/orchestration-21/index.html @@ -0,0 +1,2996 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + P21 Deliver, obtain POD and conclude cycle - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

P21 Deliver, obtain POD and conclude cycle

+ +

Final delivery to consignee and proof od delivery

+

01. Deliver to consignee and capture POD

+

Unloading actions (Actuals) are created between Pieces and the TransportMovement to indicate unloading

+

An Event is created on Pieces to capture the delivery

+

Milestone: POD

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTLoading (Actual)Loading action: servedActivity (TM-Truck), loadedPieces (Pieces) and/or loadedUnits (ULDs/Pallets), loadingType (unloading), actionTimeType (actual), onTransportMeans (if relevant at that stage)
Shipper or ForwarderForwarderPOSTEvent on PiecesCreate Event: eventFor (Pieces), eventLocation (Consignee's location), eventName (Pieces delivered to consignee), evetndAte, recordingActor
+

02. Finalize d2d routemap and validate OTP

+

03. Product discrepancy report with resolution

+

04. Include in reporting to shipper/consignee

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-cxml/index.html b/development/Orchestration/orchestration-cxml/index.html new file mode 100644 index 00000000..0ed659b4 --- /dev/null +++ b/development/Orchestration/orchestration-cxml/index.html @@ -0,0 +1,3425 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CargoXML Mapping - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

CargoXML Mapping

+ +

Mapping CXML messages with ONE Record

+

Introduction

+

We dedicate this section to the mapping between CXML messages (as per the last version on CXMl Toolkit Edition 12) and ONE Record standard (as per last version endorsed by COTB - Data Model 3.0.0)

+

Objectives

+

The transition from EDI to Data Sharing is highly dependent on the mapping between messages and ONE Record. Messaging standards (Cargo IMP and then Cargo XML) have been used extensively for the past decades by the industry. However messages in their current form have shown to be limited in terms of scalability with regards to upcoming regulations such as ACI/PLACI regimes.

+

In the mapping between CXML messages and ONE Record, two main aspects need to be considered: +* Mechanism: Some guidelines are usually required to understand how a message can be converted to ONE Record and vice versa. Some use cases and business rules cannot be directly translated as we need to consider a shift of mindset between EDI and Data sharing as well as a transition to Piece level tracking that ONE Record allows. +* Data field mapping: A direct mapping between CXML fields and ONE Record data model is inevitable, it goes with the Mechanism part to properly understand what objects are impacted.

+

Messages selected

+

As CIMP standard has been sunset since 31st December 2024, we focus on CXML messages in their latest version (currently CXML Toolkit Edition 12) +The selected messages for mapping are the following:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessageMessage nameMessage versionComments
XFWBXML Waybill Message5.001st draft available
XFZBXML HouseWaybill Message4.00-
XFHLXML House Manifest Message3.00-
XSDGXML Shippers' Declaration for Dangerous Goods Message6.00-
XFSUXML Status Message6.00Ongoing
XFFMXML Flight Manifest Message4.00-
XFBLXML Freight Booked List Message3.00-
XTMVXML Transport Movement Message2.00?
+

General conversion guidelines

+

Note on data types and patterns

+

Data elements as defined in CIMP have:

+
    +
  • Length recommendations usually based on business rules such as the Waybill number
  • +
  • Limited data types based on business rules or common sense
  • +
+

When CXML was created, most restrictions were inherited from CIMP even though XML format allows to bypass technical limitations of CIMP, especially in number of occurences, field lengths or allowed characters.

+

When first versions of ONE Record data model were created, restrictions coming from business rules were usually adapted in ONE Record using the pattern in the ontology.

+

General guidelines

+
    +
  • 01 - Business rules and local regulatory requirements prevail over data properties technical restrictions (data length, pattern) expressed in the ontology if relevant.
  • +
  • 02 - When converting from ONE Record to CXML/CIMP there is no specific general guideline on the truncation of data properties. In CXML to CIMP conversion, such rules are expressed in IATA CXML Toolkit.
  • +
  • 03 - In ONE Record we try to avoid duplicate data as much as possible, especially totals are usually not in ONE Record data model if all detailed data are already available. This applies for instance for the total or summary values of charges.
  • +
+

XFWB Mapping

+

Proposed mechanism

+

XFWB data fields are mostly a mix of Waybill, WaybillLineItem, Shipment, Pieces and TransportMovement data in ONE Record realm.

+

[Auth, Security in progress]

+

Usage of WaybillLineItem object

+

At first it was proposed to use the Shipment and Piece objects to populate the Waybill line items. However examples have shown that the line items do not necessarily correlate to actual Pieces transported, for instance Dry Ice can be interpreted as a specific line item due to a specific rate while on the operations the package, containing dry ice and transported goods, are equivalent to one Piece.

+

It was decided to introduce the WaybillLineItem object to properly share rate data as required in the Air Waybill. The WaybillLineItem has a n-to-1 relationship with a Waybill object and represents the different line items on the paper waybill with all their specifities based on the type of rating used.

+

It is important to note that the WaybillLineItem has been added only in the context of sharing Air Waybill data. When looking at Operations, digital twins shall be used (Piece, Item, Product, etc.)

+

Usage of OtherCharge object

+

The OtherCharge object is used to record all charges, it refers to <ram:ApplicableLogisticsAllowanceCharge> grouping in XFWB message. Code List 1.2 "Other Charge Code" is used to properly identify the charges associated with the Prepaid/Collect indicator.

+

Totals are not directly recorded in ONE Record as they can be directly calculated based on the existing data (e.g. filtering by type of charge and prepaid/collect indicator).

+

Other specific mapping guidelines

+
    +
  • +

    DensityGroupCode field will be linked to Distribution phase as the feedback received from the industry shows that it's not an operational data but used for the Sales & Booking process part.

    +
  • +
  • +

    Special Service Request and Other Shipping Instructions code fields are not in ONE Record as there is no evidence of an actual referential and standard used for those. Moreover it seems stakeholders use SSR or OSI for the same purposes. Thus we have merged into textualHandlingInstructions property in ONE Record.

    +
  • +
  • +

    In the ApplicableRating grouping, the TypeCode field is set to F (Facial) by default as it is the only value used with CXML.

    +
  • +
  • +

    In the ApplicalbeFreightRateServiceCharge grouping, the AppliedAmount is not directly mapped as it is a total that needs to be derived from either the Rate or the multiplication of Rate and Chargeable weight depending on the type of charge. Refer to CSC Resolution 600a for further explanations.

    +
  • +
+

XFZB Mapping

+

XFHL Mapping

+

XSDG Mapping

+

XFSU Mapping

+

Proposed mechanism

+

XFSU message is mostly used to provide a Shipment Status update, discrepancy details or sometimes to provide complementary Customs information. +In most cases, the Status updates is based on the usage of LogisticsEvents on the Shipment and/or the Pieces. The XFSU data fields are then a mix of Waybill, Shipment, Pieces and LogisticsEvent data in ONE Record realm.

+

In case of full shipment status update, the LogisticsEvents can be added on the Shipment or on all the Pieces. Both scenarios are valid.

+

Specific case of split shipment: +With messaging standard, it is possible to transmit status update on a split shipment without the need to identify properly the pieces impacted. In this case the data transmitted can only be kept at Shipment level, however this pratice is contradictory with the piece level management design principle of ONE Record. +To cope with that there are multiple possibilities to map XFSU with ONE Record, depending on stakeholder's capabilities on the operations side to identify impacted pieces of a shipment. +* If pieces cannot be properly identified, recommendation would be to use LogisticsEvent on the Shipment, using the LogisticsEvent#partialEventIndicator to notify it applies to a split shipment. In this scenario it becomes complicated to provide the right level of information at the "AssociatedStatusConsignment" level as per the XFSU schema. (dig deeper on that aspect). +* If pieces can be properly identified, it is recommended to use LogisticsEvent on the identified Pieces. The LogisticsEvent#partialEventIndicator can be used to notify it applies only to selected pieces and not to the whole shipment but all details at "AssociatedStatusConsignment" level are at Piece level in ONE Record realm.

+

XFFM Mapping

+

XFBL Mapping

+

XTMV Mapping

+

(To be discussed)

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-mop/index.html b/development/Orchestration/orchestration-mop/index.html new file mode 100644 index 00000000..eb3f4614 --- /dev/null +++ b/development/Orchestration/orchestration-mop/index.html @@ -0,0 +1,3046 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Introduction - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Introduction

+ +

Purpose

+

This section will focus on providing guidelines on how to use ONE Record from a Data Model point of view based on standardized processes.

+

Master Operating Plan (MOP)

+

What is the MOP ?

+

The Master Operating Plan (MOP) describes the key processes and sub-processes involved in transporting air cargo from shipper to consignee in a systematic and harmonized manner. It provides the air cargo supply chain with the first, industry-endorsed, standard description of the end-to-end process for transporting cargo by air.

+

It is maintained by Cargo iQ and then proposed to the industry for a wider usage and adoption.

+

For further details you can refer to IATA's website here:

+ +

Version of the MOP used for the Orchestration

+

The current version of the MOP endorsed by COTB is v1.2 (see link above). However in 2023 Cargo iQ initiated an update of the MOP. This update includes a swimlane view of the processes to properly identify stakeholders involved and the review of all steps. This is the version tha was used, in collaboration with Cargo iQ, for the Orchestration.

+

The sequence of the steps may slightly differ from the MOP v1.2 and few additions/removals/adjustemnts were made. However those changes don't have a major impact on the overall logistics supply chain.

+

MOP structure

+

x

+

Based on messaging and associated milestones

+

MOP is still heavily relying on messaging standard (CIMP mainly) and most milestones are directly linked to messages such as (X)FWB or (X)FSU the Status update dedicated message.

+

Since ONE Record is about Data Sharing and not messaging, the mapping with the MOP is not about validating a message but making sure the information initially provided in that message is also fully available in ONE Record.

+

For instance (X)FWB is used to provide Air Waybil data, in ONE Record these data elements are not in one single object but spread among multiple objects (see dedicated CXML Mapping section for further details). Our objective is to make sure that when the (X)FWB needs to be sent from a process perspective, all data is available.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-mvt01/index.html b/development/Orchestration/orchestration-mvt01/index.html new file mode 100644 index 00000000..b15ac3c3 --- /dev/null +++ b/development/Orchestration/orchestration-mvt01/index.html @@ -0,0 +1,3041 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Movement from Shipper to Forwarder - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Movement from Shipper to Forwarder

+ +

This part of the process represents the movement from the Shipper's premises to the Forwarder's warehouse.

+

01. Departure from Shipper

+

Event is added on the Truck TransportMovement indicating departure from shipper's location

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on TransportMovement (Truck)Create Event: eventFor (TM-Truck), eventLocation (shipper's location), eventName (Departure from Shipper's location), eventDate, recordingActor
ForwarderForwarderPOSTOptional - MovementTime on TransportMovement (Truck)Create MovementTime: movementTimeType (actual), movementMilestone (AO), movementTimestamp
+

02. Arrival of freight at forwarder warehouse

+

Event is added on the Truck TransportMovement indicating arrival at forwarder warehouse.

+

Unloading (actuals) are created and linked with TransportMovement (truck) and Pieces.

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on TransportMovement (Truck)Create Event: eventFor (TM-Truck), eventLocation (forwarder warehouse), eventName (Arrival at forwarder warehouse), eventDate, recordingActor
ForwarderForwarderPOSTOptional - MovementTime on TransportMovement (Truck)Create MovementTime: movementTimeType (actual), movementMilestone (AB), movementTimestamp
ForwarderForwarderPOSTLoading (Actual)Loading action (Actual): servedActivity (TM Truck), loadedPieces, onTransportMeans, loadingType (Unloading), executionStatus (Actual), actionEndTime
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-mvt02/index.html b/development/Orchestration/orchestration-mvt02/index.html new file mode 100644 index 00000000..87608cb1 --- /dev/null +++ b/development/Orchestration/orchestration-mvt02/index.html @@ -0,0 +1,3041 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Movement within Fowarder warehouses - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Movement within Fowarder warehouses

+ +

This part of the process represents the movement from the Forwarder's warehouse to one of its hub.

+

01. Departure of truck from forwarder

+

Event is added on the Truck TransportMovement indicating departure from forwarder's warehouse.

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on TransportMovement (Truck)Create Event: eventFor (TM-Truck), eventLocation (forwarder warehouse), eventName (Departure from forwarder warehouse), eventDate, recordingActor
ForwarderForwarderPOSTOptional - MovementTime on TransportMovement (Truck)Create MovementTime: movementTimeType (actual), movementMilestone (AO), movementTimestamp
+

02. Arrival of truck at forwarder hub

+

Event is added on the Truck TransportMovement indicating arrival at forwarder hub.

+

Unloading (actuals) are created and linked with TransportMovement (truck) and Pieces.

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on TransportMovement (Truck)Create Event: eventFor (TM-Truck), eventLocation (forwarder hub), eventName (Arrival at forwarder hub), eventDate, recordingActor
ForwarderForwarderPOSTOptional - MovementTime on TransportMovement (Truck)Create MovementTime: movementTimeType (actual), movementMilestone (AA), movementTimestamp
ForwarderForwarderPOSTLoading (Actual)Unloading action (actual): servedActivity (TM Truck), loadedPieces, onTransportMeans, loadingType (Unloading), executionStatus (Planned), actionEndTime
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-mvt03/index.html b/development/Orchestration/orchestration-mvt03/index.html new file mode 100644 index 00000000..afa2968f --- /dev/null +++ b/development/Orchestration/orchestration-mvt03/index.html @@ -0,0 +1,3036 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Movement from Forwarder hub to Carrier domain - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Movement from Forwarder hub to Carrier domain

+ +

This part of the process represents the movement from the Forwarder's warehouse to Carrier domain.

+

01. Depart truck from forwarder to carrier domain

+

Loading (actuals) are created and linked with TransportMovement (truck) and Pieces.

+

Events can be created on the Pieces to inform of the loading into the truck.

+

Event is added on the Truck TransportMovement indicating departure from warehouse.

+

Milestone: DEW

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTLoading (Actual)Loading action (actual): servedActivity (TM Truck), loadedPieces, onTransportMeans, loadingType (Loading), executionStatus (Planned), actionEndTime
Shipper or ForwarderForwarderPOSTEvent on PieceCreate Event: eventFor (Piece), eventLocation (if relevant), eventCode or eventName (Loaded in truck), eventDate, recordingActor
Shipper or ForwarderForwarderPOSTEvent on TransportMovement (Truck)Create Event: eventFor (TM-Truck), eventLocation (forwarder warehouse), eventName (Departure from forwarder warehouse), eventDate, recordingActor
+

02. Arrival of truck at carrier domain

+

Event is added on the Truck TransportMovement indicating arrival at carrier domain.

+

API Interaction

+ + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on TransportMovement (Truck)Create Event: eventFor (TM-Truck), eventLocation (carrier domain tbd), eventName (Arrival at carrier domain), eventDate, recordingActor
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-mvt04/index.html b/development/Orchestration/orchestration-mvt04/index.html new file mode 100644 index 00000000..0d6dc806 --- /dev/null +++ b/development/Orchestration/orchestration-mvt04/index.html @@ -0,0 +1,3033 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Movement from destination carrier domain to forwarder warehouse - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Movement from destination carrier domain to forwarder warehouse

+ +

This part of the process represents the movement from the destination carrier domain to Forwarder's forwarder hub at destination

+

01. Depart freight for forwarder warehouse

+

MovementTimes is added on TransportMovement (Truck) to record the departure from carrier domain

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on TransportMovement (TM-Truck)Create Event: eventFor (TM-Truck), eventLocation (WH), eventName (Departure from warehouse), eventDate, recordingActor
ForwarderForwarderPOSTOptional - MovementTime on TransportMovement (TM-truck)Create MovementTime: movementTimeType (actual), movementMilestone (AD), movementTimestamp
+

02. Arrive truck at forwarder warehouse

+

MovementTimes is added on TransportMovement (Truck) to record the arrival at forwarder warehouse

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on TransportMovement (TM-Truck)Create Event: eventFor (TM-Truck), eventLocation (forwarder hub), eventName (Arrival at forwarder hub), eventDate, recordingActor
ForwarderForwarderPOSTOptional - MovementTime on TransportMovement (TM-truck)Create MovementTime: movementTimeType (actual), movementMilestone (AA), movementTimestamp
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/Orchestration/orchestration-mvt05/index.html b/development/Orchestration/orchestration-mvt05/index.html new file mode 100644 index 00000000..1c82cc4d --- /dev/null +++ b/development/Orchestration/orchestration-mvt05/index.html @@ -0,0 +1,3033 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Movement from forwarder branch facility to consignee location - ONE Record Specification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + +

Movement from forwarder branch facility to consignee location

+ +

This part of the process represents the movement from the forwarder branch facility to consignee's premises

+

01. Depart truck from forwarder branch facility to consignee

+

MovementTimes is added on TransportMovement (Truck) to record the arrival at consignee's location

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on TransportMovement (TM-Truck)Create Event: eventFor (TM-Truck), eventLocation (forwarder branch facility), eventName (departure from forwarder branch facility), eventDate, recordingActor
ForwarderForwarderPOSTOptional - MovementTime on TransportMovement (TM-truck)Create MovementTime: movementTimeType (actual), movementMilestone (AD), movementTimestamp
+

02. Arrive truck at consignee

+

Unloading actions (Actuals) are created between Pieces and the TransportMovement to indicate unloading

+

API Interaction

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1R ServerStakeholderAPI CallsLogiticsObjectDetails
ForwarderForwarderPOSTEvent on TransportMovement (TM-Truck)Create Event: eventFor (TM-Truck), eventLocation (consignee location), eventName (Arrival at consignee location), eventDate, recordingActor
ForwarderForwarderPOSTOptional - MovementTime on TransportMovement (TM-truck)Create MovementTime: movementTimeType (actual), movementMilestone (AA), movementTimestamp
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/development/assets/images/favicon.png b/development/assets/images/favicon.png new file mode 100644 index 00000000..1cf13b9f Binary files /dev/null and b/development/assets/images/favicon.png differ diff --git a/development/assets/javascripts/bundle.fe8b6f2b.min.js b/development/assets/javascripts/bundle.fe8b6f2b.min.js new file mode 100644 index 00000000..cf778d42 --- /dev/null +++ b/development/assets/javascripts/bundle.fe8b6f2b.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Fi=Object.create;var gr=Object.defineProperty;var ji=Object.getOwnPropertyDescriptor;var Wi=Object.getOwnPropertyNames,Dt=Object.getOwnPropertySymbols,Ui=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty,no=Object.prototype.propertyIsEnumerable;var oo=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))xr.call(t,r)&&oo(e,r,t[r]);if(Dt)for(var r of Dt(t))no.call(t,r)&&oo(e,r,t[r]);return e};var io=(e,t)=>{var r={};for(var o in e)xr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Dt)for(var o of Dt(e))t.indexOf(o)<0&&no.call(e,o)&&(r[o]=e[o]);return r};var yr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Di=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Wi(t))!xr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=ji(t,n))||o.enumerable});return e};var Vt=(e,t,r)=>(r=e!=null?Fi(Ui(e)):{},Di(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var ao=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var co=yr((Er,so)=>{(function(e,t){typeof Er=="object"&&typeof so!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(H){return!!(H&&H!==document&&H.nodeName!=="HTML"&&H.nodeName!=="BODY"&&"classList"in H&&"contains"in H.classList)}function p(H){var mt=H.type,ze=H.tagName;return!!(ze==="INPUT"&&a[mt]&&!H.readOnly||ze==="TEXTAREA"&&!H.readOnly||H.isContentEditable)}function c(H){H.classList.contains("focus-visible")||(H.classList.add("focus-visible"),H.setAttribute("data-focus-visible-added",""))}function l(H){H.hasAttribute("data-focus-visible-added")&&(H.classList.remove("focus-visible"),H.removeAttribute("data-focus-visible-added"))}function f(H){H.metaKey||H.altKey||H.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(H){o=!1}function h(H){s(H.target)&&(o||p(H.target))&&c(H.target)}function w(H){s(H.target)&&(H.target.classList.contains("focus-visible")||H.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(H.target))}function A(H){document.visibilityState==="hidden"&&(n&&(o=!0),te())}function te(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function ie(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(H){H.target.nodeName&&H.target.nodeName.toLowerCase()==="html"||(o=!1,ie())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",A,!0),te(),r.addEventListener("focus",h,!0),r.addEventListener("blur",w,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var Yr=yr((Rt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Rt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Rt=="object"?Rt.ClipboardJS=r():t.ClipboardJS=r()})(Rt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ii}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(_){return!1}}var h=function(_){var M=f()(_);return u("cut"),M},w=h;function A(V){var _=document.documentElement.getAttribute("dir")==="rtl",M=document.createElement("textarea");M.style.fontSize="12pt",M.style.border="0",M.style.padding="0",M.style.margin="0",M.style.position="absolute",M.style[_?"right":"left"]="-9999px";var j=window.pageYOffset||document.documentElement.scrollTop;return M.style.top="".concat(j,"px"),M.setAttribute("readonly",""),M.value=V,M}var te=function(_,M){var j=A(_);M.container.appendChild(j);var D=f()(j);return u("copy"),j.remove(),D},ie=function(_){var M=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},j="";return typeof _=="string"?j=te(_,M):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?j=te(_.value,M):(j=f()(_),u("copy")),j},J=ie;function H(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(M){return typeof M}:H=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},H(V)}var mt=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},M=_.action,j=M===void 0?"copy":M,D=_.container,Y=_.target,ke=_.text;if(j!=="copy"&&j!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&H(Y)==="object"&&Y.nodeType===1){if(j==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(j==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(ke)return J(ke,{container:D});if(Y)return j==="cut"?w(Y):J(Y,{container:D})},ze=mt;function Ie(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(M){return typeof M}:Ie=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},Ie(V)}function _i(V,_){if(!(V instanceof _))throw new TypeError("Cannot call a class as a function")}function ro(V,_){for(var M=0;M<_.length;M++){var j=_[M];j.enumerable=j.enumerable||!1,j.configurable=!0,"value"in j&&(j.writable=!0),Object.defineProperty(V,j.key,j)}}function Ai(V,_,M){return _&&ro(V.prototype,_),M&&ro(V,M),V}function Ci(V,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");V.prototype=Object.create(_&&_.prototype,{constructor:{value:V,writable:!0,configurable:!0}}),_&&br(V,_)}function br(V,_){return br=Object.setPrototypeOf||function(j,D){return j.__proto__=D,j},br(V,_)}function Hi(V){var _=Pi();return function(){var j=Wt(V),D;if(_){var Y=Wt(this).constructor;D=Reflect.construct(j,arguments,Y)}else D=j.apply(this,arguments);return ki(this,D)}}function ki(V,_){return _&&(Ie(_)==="object"||typeof _=="function")?_:$i(V)}function $i(V){if(V===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return V}function Pi(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(V){return!1}}function Wt(V){return Wt=Object.setPrototypeOf?Object.getPrototypeOf:function(M){return M.__proto__||Object.getPrototypeOf(M)},Wt(V)}function vr(V,_){var M="data-clipboard-".concat(V);if(_.hasAttribute(M))return _.getAttribute(M)}var Ri=function(V){Ci(M,V);var _=Hi(M);function M(j,D){var Y;return _i(this,M),Y=_.call(this),Y.resolveOptions(D),Y.listenClick(j),Y}return Ai(M,[{key:"resolveOptions",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Ie(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function(ke){return Y.onClick(ke)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,ke=this.action(Y)||"copy",Ut=ze({action:ke,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Ut?"success":"error",{action:ke,text:Ut,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return w(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,ke=!!document.queryCommandSupported;return Y.forEach(function(Ut){ke=ke&&!!document.queryCommandSupported(Ut)}),ke}}]),M}(s()),Ii=Ri},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,h,w){var A=c.apply(this,arguments);return l.addEventListener(u,A,w),{destroy:function(){l.removeEventListener(u,A,w)}}}function p(l,f,u,h,w){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(A){return s(A,f,u,h,w)}))}function c(l,f,u,h){return function(w){w.delegateTarget=a(w.target,f),w.delegateTarget&&h.call(l,w)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,h,w){if(!u&&!h&&!w)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(w))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,h,w);if(a.nodeList(u))return l(u,h,w);if(a.string(u))return f(u,h,w);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,h,w){return u.addEventListener(h,w),{destroy:function(){u.removeEventListener(h,w)}}}function l(u,h,w){return Array.prototype.forEach.call(u,function(A){A.addEventListener(h,w)}),{destroy:function(){Array.prototype.forEach.call(u,function(A){A.removeEventListener(h,w)})}}}function f(u,h,w){return s(document.body,u,h,w)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var ts=/["'&<>]/;ei.exports=rs;function rs(e){var t=""+e,r=ts.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||s(u,h)})})}function s(u,h){try{p(o[u](h))}catch(w){f(i[0][3],w)}}function p(u){u.value instanceof nt?Promise.resolve(u.value.v).then(c,l):f(i[0][2],u)}function c(u){s("next",u)}function l(u){s("throw",u)}function f(u,h){u(h),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof de=="function"?de(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function k(e){return typeof e=="function"}function ft(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ft(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Fe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=de(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(A){t={error:A}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(A){i=A instanceof zt?A.errors:[A]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=de(f),h=u.next();!h.done;h=u.next()){var w=h.value;try{fo(w)}catch(A){i=i!=null?i:[],A instanceof zt?i=q(q([],N(i)),N(A.errors)):i.push(A)}}}catch(A){o={error:A}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)fo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Fe.EMPTY;function qt(e){return e instanceof Fe||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function fo(e){k(e)?e():e.unsubscribe()}var $e={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var ut={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Fe(function(){o.currentObservers=null,qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Eo(r,o)},t}(F);var Eo=function(e){re(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){re(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var Lt={now:function(){return(Lt.delegate||Date).now()},delegate:void 0};var _t=function(e){re(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Lt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(vt);var So=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(gt);var Hr=new So(To);var Oo=function(e){re(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=bt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(bt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(vt);var Mo=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(gt);var me=new Mo(Oo);var O=new F(function(e){return e.complete()});function Yt(e){return e&&k(e.schedule)}function kr(e){return e[e.length-1]}function Xe(e){return k(kr(e))?e.pop():void 0}function He(e){return Yt(kr(e))?e.pop():void 0}function Bt(e,t){return typeof kr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return k(e==null?void 0:e.then)}function Jt(e){return k(e[ht])}function Xt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Gi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Gi();function tr(e){return k(e==null?void 0:e[er])}function rr(e){return lo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return k(e==null?void 0:e.getReader)}function W(e){if(e instanceof F)return e;if(e!=null){if(Jt(e))return Ji(e);if(xt(e))return Xi(e);if(Gt(e))return Zi(e);if(Xt(e))return Lo(e);if(tr(e))return ea(e);if(or(e))return ta(e)}throw Zt(e)}function Ji(e){return new F(function(t){var r=e[ht]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Xi(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?Be(t):zo(function(){return new ir}))}}function Fr(e){return e<=0?function(){return O}:y(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,h=0,w=!1,A=!1,te=function(){f==null||f.unsubscribe(),f=void 0},ie=function(){te(),l=u=void 0,w=A=!1},J=function(){var H=l;ie(),H==null||H.unsubscribe()};return y(function(H,mt){h++,!A&&!w&&te();var ze=u=u!=null?u:r();mt.add(function(){h--,h===0&&!A&&!w&&(f=Wr(J,p))}),ze.subscribe(mt),!l&&h>0&&(l=new at({next:function(Ie){return ze.next(Ie)},error:function(Ie){A=!0,te(),f=Wr(ie,n,Ie),ze.error(Ie)},complete:function(){w=!0,te(),f=Wr(ie,a),ze.complete()}}),W(H).subscribe(l))})(c)}}function Wr(e,t){for(var r=[],o=2;oe.next(document)),e}function $(e,t=document){return Array.from(t.querySelectorAll(e))}function P(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Re(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var xa=S(d(document.body,"focusin"),d(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Re()||document.body),G(1));function et(e){return xa.pipe(m(t=>e.contains(t)),K())}function kt(e,t){return C(()=>S(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Me(+!r*t)):le,Q(e.matches(":hover"))))}function Bo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Bo(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Bo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function wt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),S(d(t,"load"),d(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),L(()=>document.head.removeChild(t)),Te(1))))}var Go=new g,ya=C(()=>typeof ResizeObserver=="undefined"?wt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Go.next(t)))),v(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),G(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return ya.pipe(E(r=>r.observe(t)),v(r=>Go.pipe(b(o=>o.target===t),L(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function Tt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Jo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ue(e){return{x:e.offsetLeft,y:e.offsetTop}}function Xo(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function Zo(e){return S(d(window,"load"),d(window,"resize")).pipe(Le(0,me),m(()=>Ue(e)),Q(Ue(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function De(e){return S(d(e,"scroll"),d(window,"scroll"),d(window,"resize")).pipe(Le(0,me),m(()=>pr(e)),Q(pr(e)))}var en=new g,Ea=C(()=>I(new IntersectionObserver(e=>{for(let t of e)en.next(t)},{threshold:0}))).pipe(v(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),G(1));function tt(e){return Ea.pipe(E(t=>t.observe(e)),v(t=>en.pipe(b(({target:r})=>r===e),L(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function tn(e,t=16){return De(e).pipe(m(({y:r})=>{let o=ce(e),n=Tt(e);return r>=n.height-o.height-t}),K())}var lr={drawer:P("[data-md-toggle=drawer]"),search:P("[data-md-toggle=search]")};function rn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function Ve(e){let t=lr[e];return d(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function wa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ta(){return S(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function on(){let e=d(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:rn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!wa(o,r)}return!0}),pe());return Ta().pipe(v(t=>t?O:e))}function xe(){return new URL(location.href)}function pt(e,t=!1){if(B("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function nn(){return new g}function an(){return location.hash.slice(1)}function sn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Sa(e){return S(d(window,"hashchange"),e).pipe(m(an),Q(an()),b(t=>t.length>0),G(1))}function cn(e){return Sa(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function $t(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function pn(){let e=matchMedia("print");return S(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():O))}function zr(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function Ne(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),G(1))}function ln(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),G(1))}function mn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),G(1))}function fn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function un(){return S(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(fn),Q(fn()))}function dn(){return{width:innerWidth,height:innerHeight}}function hn(){return d(window,"resize",{passive:!0}).pipe(m(dn),Q(dn()))}function bn(){return z([un(),hn()]).pipe(m(([e,t])=>({offset:e,size:t})),G(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(Z("size")),n=z([o,r]).pipe(m(()=>Ue(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function Oa(e){return d(e,"message",t=>t.data)}function Ma(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function vn(e,t=new Worker(e)){let r=Oa(t),o=Ma(t),n=new g;n.subscribe(o);let i=o.pipe(X(),ne(!0));return n.pipe(X(),Pe(r.pipe(U(i))),pe())}var La=P("#__config"),St=JSON.parse(La.textContent);St.base=`${new URL(St.base,xe())}`;function ye(){return St}function B(e){return St.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?St.translations[e].replace("#",t.toString()):St.translations[e]}function Se(e,t=document){return P(`[data-md-component=${e}]`,t)}function ae(e,t=document){return $(`[data-md-component=${e}]`,t)}function _a(e){let t=P(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>P(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function gn(e){if(!B("announce.dismiss")||!e.childElementCount)return O;if(!e.hidden){let t=P(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),_a(e).pipe(E(r=>t.next(r)),L(()=>t.complete()),m(r=>R({ref:e},r)))})}function Aa(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function xn(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Aa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))}function Pt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function yn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function En(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function wn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,c)," "],[]).slice(0,-1),i=ye(),a=new URL(e.location,i.base);B("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=ye();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)}),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Tn(e){let t=e[0].score,r=[...e],o=ye(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreqr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function Sn(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Qr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function On(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ca(e){var o;let t=ye(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Mn(e,t){var o;let r=ye();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Ca)))}var Ha=0;function ka(e){let t=z([et(e),kt(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Jo(e)).pipe(oe(De),ct(1),m(()=>Xo(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function $a(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ha++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(X(),ne(!1)).subscribe(a);let s=a.pipe(Ht(c=>Me(+!c*250,Hr)),K(),v(c=>c?r:O),E(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>kt(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),ee(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),h=u.width/2;if(l.role==="tooltip")return{x:h,y:8+u.height};if(u.y>=f.height/2){let{height:w}=ce(l);return{x:h,y:-16-w}}else return{x:h,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),ee(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(P(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),be(me),ee(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ka(e).pipe(E(c=>i.next(c)),L(()=>i.complete()),m(c=>R({ref:e},c)))})}function lt(e,{viewport$:t},r=document.body){return $a(e,{content$:new F(o=>{let n=e.title,i=yn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Pa(e,t){let r=C(()=>z([Zo(e),De(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function Ln(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(U(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),S(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Le(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(ct(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(U(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),d(n,"mousedown").pipe(U(a),ee(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Re())==null||c.blur()}}),r.pipe(U(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Pa(e,t).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function Ra(e){return e.tagName==="CODE"?$(".c, .c1, .cm",e):[e]}function Ia(e){let t=[];for(let r of Ra(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function _n(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Ia(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,En(p,i)),s.replaceWith(a.get(p)))}return a.size===0?O:C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=[];for(let[l,f]of a)c.push([P(".md-typeset",f),P(`:scope > li:nth-child(${l})`,e)]);return o.pipe(U(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?_n(f,u):_n(u,f)}),S(...[...a].map(([,l])=>Ln(l,t,{target$:r}))).pipe(L(()=>s.complete()),pe())})}function An(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return An(t)}}function Cn(e,t){return C(()=>{let r=An(e);return typeof r!="undefined"?fr(r,e,t):O})}var Hn=Vt(Yr());var Fa=0;function kn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return kn(t)}}function ja(e){return ge(e).pipe(m(({width:t})=>({scrollable:Tt(e).width>t})),Z("scrollable"))}function $n(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(Fr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Hn.default.isSupported()&&(e.closest(".copy")||B("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Fa++}`;let l=wn(c.id);c.insertBefore(l,e),B("content.tooltips")&&a.push(lt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=kn(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||B("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(U(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:O)))}}return $(":scope > span[id]",e).length&&e.classList.add("md-code__content"),ja(e).pipe(E(c=>n.next(c)),L(()=>n.complete()),m(c=>R({ref:e},c)),Pe(...a))});return B("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function Wa(e,{target$:t,print$:r}){let o=!0;return S(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),E(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Pn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Wa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}var Rn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Br,Da=0;function Va(){return typeof mermaid=="undefined"||mermaid instanceof Element?wt("https://unpkg.com/mermaid@10/dist/mermaid.min.js"):I(void 0)}function In(e){return e.classList.remove("mermaid"),Br||(Br=Va().pipe(E(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Rn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),G(1))),Br.subscribe(()=>ao(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Da++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Br.pipe(m(()=>({ref:e})))}var Fn=x("table");function jn(e){return e.replaceWith(Fn),Fn.replaceWith(On(e)),I({ref:e})}function Na(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>d(r,"change").pipe(m(()=>P(`label[for="${r.id}"]`))))).pipe(Q(P(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Wn(e,{viewport$:t,target$:r}){let o=P(".tabbed-labels",e),n=$(":scope > input",e),i=Qr("prev");e.append(i);let a=Qr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(X(),ne(!0));z([s,ge(e),tt(e)]).pipe(U(p),Le(1,me)).subscribe({next([{active:c},l]){let f=Ue(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=pr(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([De(o),ge(o)]).pipe(U(p)).subscribe(([c,l])=>{let f=Tt(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),S(d(i,"click").pipe(m(()=>-1)),d(a,"click").pipe(m(()=>1))).pipe(U(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(U(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=P(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(U(p),b(f=>!(f.metaKey||f.ctrlKey)),E(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return B("content.tabs.link")&&s.pipe(Ce(1),ee(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let w of $("[data-tabs]"))for(let A of $(":scope > input",w)){let te=P(`label[for="${A.id}"]`);if(te!==c&&te.innerText.trim()===f){te.setAttribute("data-md-switching",""),A.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),s.pipe(U(p)).subscribe(()=>{for(let c of $("audio, video",e))c.pause()}),Na(n).pipe(E(c=>s.next(c)),L(()=>s.complete()),m(c=>R({ref:e},c)))}).pipe(Qe(se))}function Un(e,{viewport$:t,target$:r,print$:o}){return S(...$(".annotate:not(.highlight)",e).map(n=>Cn(n,{target$:r,print$:o})),...$("pre:not(.mermaid) > code",e).map(n=>$n(n,{target$:r,print$:o})),...$("pre.mermaid",e).map(n=>In(n)),...$("table:not([class])",e).map(n=>jn(n)),...$("details",e).map(n=>Pn(n,{target$:r,print$:o})),...$("[data-tabs]",e).map(n=>Wn(n,{viewport$:t,target$:r})),...$("[title]",e).filter(()=>B("content.tooltips")).map(n=>lt(n,{viewport$:t})))}function za(e,{alert$:t}){return t.pipe(v(r=>S(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function Dn(e,t){let r=P(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),za(e,t).pipe(E(n=>o.next(n)),L(()=>o.complete()),m(n=>R({ref:e},n)))})}var qa=0;function Qa(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?De(o):I({x:0,y:0}),i=S(et(t),kt(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ue(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Vn(e){let t=e.title;if(!t.length)return O;let r=`__tooltip_${qa++}`,o=Pt(r,"inline"),n=P(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),S(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Le(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(ct(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Qa(o,e).pipe(E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))}).pipe(Qe(se))}function Ka({viewport$:e}){if(!B("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Ye(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=Ve("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Nn(e,t){return C(()=>z([ge(e),Ka(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),G(1))}function zn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(X(),ne(!0));o.pipe(Z("active"),We(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue($("[title]",e)).pipe(b(()=>B("content.tooltips")),oe(a=>Vn(a)));return r.subscribe(o),t.pipe(U(n),m(a=>R({ref:e},a)),Pe(i.pipe(U(n))))})}function Ya(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),Z("active"))}function qn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?O:Ya(o,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))})}function Qn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),Z("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Ba(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(oe(o=>d(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),G(1))}function Kn(e){let t=$("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=$t("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),ee(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(be(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Ba(t).pipe(U(n.pipe(Ce(1))),st(),E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))})}function Yn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(E(o=>r.next({value:o})),L(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Gr=Vt(Yr());function Ga(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Bn({alert$:e}){Gr.default.isSupported()&&new F(t=>{new Gr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ga(P(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(E(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function Gn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function Ja(e,t){let r=new Map;for(let o of $("url",e)){let n=P("loc",o),i=[Gn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of $("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(Gn(new URL(s),t))}}return r}function ur(e){return mn(new URL("sitemap.xml",e)).pipe(m(t=>Ja(t,new URL(e))),ve(()=>I(new Map)))}function Xa(e,t){if(!(e.target instanceof Element))return O;let r=e.target.closest("a");if(r===null)return O;if(r.target||e.metaKey||e.ctrlKey)return O;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):O}function Jn(e){let t=new Map;for(let r of $(":scope > *",e.head))t.set(r.outerHTML,r);return t}function Xn(e){for(let t of $("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function Za(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...B("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=Jn(document);for(let[o,n]of Jn(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return je($("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),O}),X(),ne(document))}function Zn({location$:e,viewport$:t,progress$:r}){let o=ye();if(location.protocol==="file:")return O;let n=ur(o.base);I(document).subscribe(Xn);let i=d(document.body,"click").pipe(We(n),v(([p,c])=>Xa(p,c)),pe()),a=d(window,"popstate").pipe(m(xe),pe());i.pipe(ee(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),S(i,a).subscribe(e);let s=e.pipe(Z("pathname"),v(p=>ln(p,{progress$:r}).pipe(ve(()=>(pt(p,!0),O)))),v(Xn),v(Za),pe());return S(s.pipe(ee(e,(p,c)=>c)),s.pipe(v(()=>e),Z("pathname"),v(()=>e),Z("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),E(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",sn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(Z("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ri=Vt(ti());function oi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ri.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function It(e){return e.type===1}function dr(e){return e.type===3}function ni(e,t){let r=vn(e);return S(I(location.protocol!=="file:"),Ve("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:B("search.suggest")}}})),r}function ii({document$:e}){let t=ye(),r=Ne(new URL("../versions.json",t.base)).pipe(ve(()=>O)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>d(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),ee(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?O:(i.preventDefault(),I(p))}}return O}),v(i=>ur(new URL(i)).pipe(m(a=>{let p=xe().href.replace(t.base,i);return a.has(p.split("#")[0])?new URL(p):new URL(i)})))))).subscribe(n=>pt(n,!0)),z([r,o]).subscribe(([n,i])=>{P(".md-header__topic").appendChild(Mn(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function ns(e,{worker$:t}){let{searchParams:r}=xe();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),Ve("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=xe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=S(t.pipe(Ae(It)),d(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),G(1))}function ai(e,{worker$:t}){let r=new g,o=r.pipe(X(),ne(!0));z([t.pipe(Ae(It)),r],(i,a)=>a).pipe(Z("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(Z("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),d(e.form,"reset").pipe(U(o)).subscribe(()=>e.focus());let n=P("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),ns(e,{worker$:t}).pipe(E(i=>r.next(i)),L(()=>r.complete()),m(i=>R({ref:e},i)),G(1))}function si(e,{worker$:t,query$:r}){let o=new g,n=tn(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=P(":scope > :first-child",e),s=P(":scope > :last-child",e);Ve("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ee(r),Ur(t.pipe(Ae(It)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(E(()=>s.innerHTML=""),v(({items:l})=>S(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Ye(4),Vr(n),v(([f])=>f)))),m(Tn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(oe(l=>{let f=fe("details",l);return typeof f=="undefined"?O:d(f,"toggle").pipe(U(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(E(l=>o.next(l)),L(()=>o.complete()),m(l=>R({ref:e},l)))}function is(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=xe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function ci(e,t){let r=new g,o=r.pipe(X(),ne(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(U(o)).subscribe(n=>n.preventDefault()),is(e,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))}function pi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=S(d(n,"keydown"),d(n,"focus")).pipe(be(se),m(()=>n.value),K());return o.pipe(We(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(E(s=>o.next(s)),L(()=>o.complete()),m(()=>({ref:e})))}function li(e,{index$:t,keyboard$:r}){let o=ye();try{let n=ni(o.search,t),i=Se("search-query",e),a=Se("search-result",e);d(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Re();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of $(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...$(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=ai(i,{worker$:n});return S(s,si(a,{worker$:n,query$:s})).pipe(Pe(...ae("search-share",e).map(p=>ci(p,{query$:s})),...ae("search-suggest",e).map(p=>pi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ke}}function mi(e,{index$:t,location$:r}){return z([t,r.pipe(Q(xe()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>oi(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function as(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Jr(e,o){var n=o,{header$:t}=n,r=io(n,["header$"]);let i=P(".md-sidebar__scrollwrap",e),{y:a}=Ue(i);return C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=s.pipe(Le(0,me));return c.pipe(ee(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of $(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2})}}}),ue($("label[tabindex]",e)).pipe(oe(l=>d(l,"click").pipe(be(se),m(()=>l),U(p)))).subscribe(l=>{let f=P(`[id="${l.htmlFor}"]`);P(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),as(e,r).pipe(E(l=>s.next(l)),L(()=>s.complete()),m(l=>R({ref:e},l)))})}function fi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Ct(Ne(`${r}/releases/latest`).pipe(ve(()=>O),m(o=>({version:o.tag_name})),Be({})),Ne(r).pipe(ve(()=>O),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Be({}))).pipe(m(([o,n])=>R(R({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ne(r).pipe(m(o=>({repositories:o.public_repos})),Be({}))}}function ui(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ne(r).pipe(ve(()=>O),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Be({}))}function di(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return fi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ui(r,o)}return O}var ss;function cs(e){return ss||(ss=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return O}return di(e.href).pipe(E(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>O),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),G(1)))}function hi(e){let t=P(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(Sn(o)),t.classList.add("md-source__repository--active")}),cs(e).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ps(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),Z("hidden"))}function bi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(B("navigation.tabs.sticky")?I({hidden:!1}):ps(e,t)).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ls(e,{viewport$:t,header$:r}){let o=new Map,n=$(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(Z("height"),m(({height:s})=>{let p=Se("main"),c=P(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(Z("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),We(i),v(([p,c])=>t.pipe(jr(([l,f],{offset:{y:u},size:h})=>{let w=u+h.height>=Math.floor(s.height);for(;f.length;){let[,A]=f[0];if(A-c=u&&!w)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Ye(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(X(),ne(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),B("toc.follow")){let s=S(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),We(o.pipe(be(se))),ee(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2,behavior:c})}}})}return B("navigation.tracking")&&t.pipe(U(a),Z("offset"),_e(250),Ce(1),U(n.pipe(Ce(1))),st({delay:250}),ee(i)).subscribe(([,{prev:s}])=>{let p=xe(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),ls(e,{viewport$:t,header$:r}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function ms(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Ye(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),U(o.pipe(Ce(1))),ne(!0),st({delay:250}),m(a=>({hidden:a})))}function gi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(U(a),Z("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),d(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),ms(e,{viewport$:t,main$:o,target$:n}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))}function xi({document$:e,viewport$:t}){e.pipe(v(()=>$(".md-ellipsis")),oe(r=>tt(r).pipe(U(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,B("content.tooltips")?lt(n,{viewport$:t}).pipe(U(e.pipe(Ce(1))),L(()=>n.removeAttribute("title"))):O})).subscribe(),B("content.tooltips")&&e.pipe(v(()=>$(".md-status")),oe(r=>lt(r,{viewport$:t}))).subscribe()}function yi({document$:e,tablet$:t}){e.pipe(v(()=>$(".md-toggle--indeterminate")),E(r=>{r.indeterminate=!0,r.checked=!1}),oe(r=>d(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ee(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function fs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ei({document$:e}){e.pipe(v(()=>$("[data-md-scrollfix]")),E(t=>t.removeAttribute("data-md-scrollfix")),b(fs),oe(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function wi({viewport$:e,tablet$:t}){z([Ve("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),ee(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function us(){return location.protocol==="file:"?wt(`${new URL("search/search_index.js",Xr.base)}`).pipe(m(()=>__index),G(1)):Ne(new URL("search/search_index.json",Xr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Yo(),jt=nn(),Ot=cn(jt),Zr=on(),Oe=bn(),hr=$t("(min-width: 960px)"),Si=$t("(min-width: 1220px)"),Oi=pn(),Xr=ye(),Mi=document.forms.namedItem("search")?us():Ke,eo=new g;Bn({alert$:eo});var to=new g;B("navigation.instant")&&Zn({location$:jt,viewport$:Oe,progress$:to}).subscribe(ot);var Ti;((Ti=Xr.version)==null?void 0:Ti.provider)==="mike"&&ii({document$:ot});S(jt,Ot).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});Zr.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&&pt(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&&pt(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});xi({viewport$:Oe,document$:ot});yi({document$:ot,tablet$:hr});Ei({document$:ot});wi({viewport$:Oe,tablet$:hr});var rt=Nn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),v(e=>Qn(e,{viewport$:Oe,header$:rt})),G(1)),ds=S(...ae("consent").map(e=>xn(e,{target$:Ot})),...ae("dialog").map(e=>Dn(e,{alert$:eo})),...ae("header").map(e=>zn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("palette").map(e=>Kn(e)),...ae("progress").map(e=>Yn(e,{progress$:to})),...ae("search").map(e=>li(e,{index$:Mi,keyboard$:Zr})),...ae("source").map(e=>hi(e))),hs=C(()=>S(...ae("announce").map(e=>gn(e)),...ae("content").map(e=>Un(e,{viewport$:Oe,target$:Ot,print$:Oi})),...ae("content").map(e=>B("search.highlight")?mi(e,{index$:Mi,location$:jt}):O),...ae("header-title").map(e=>qn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Si,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>bi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>vi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})),...ae("top").map(e=>gi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})))),Li=ot.pipe(v(()=>hs),Pe(ds),G(1));Li.subscribe();window.document$=ot;window.location$=jt;window.target$=Ot;window.keyboard$=Zr;window.viewport$=Oe;window.tablet$=hr;window.screen$=Si;window.print$=Oi;window.alert$=eo;window.progress$=to;window.component$=Li;})(); +//# sourceMappingURL=bundle.fe8b6f2b.min.js.map + diff --git a/development/assets/javascripts/bundle.fe8b6f2b.min.js.map b/development/assets/javascripts/bundle.fe8b6f2b.min.js.map new file mode 100644 index 00000000..82635852 --- /dev/null +++ b/development/assets/javascripts/bundle.fe8b6f2b.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an