The general reasons behind the need for message ordering are:
There are several possibilities to realize this:
Option A):
intrinsic ordering only:
Sender Responsibility: The sender is responsible for ensuring the desired order of calls to the Connect APIs. If api calls are to be scheduled / batched, it is suggested that the sender maintain a queue of outgoing calls / messages so that message sequence is persistent in the event of system failure.
Receiver Responsibility: The receiver is responsible for monitoring the availableMessages queue and process retrieval calls to the Connect APIs in the order specified.
Pro:
Con:
Option B):
ordering via local sequence number:
Sender Responsibility: The sender has to add a receiver specific sequence to each and every message.
Receiver Responsibility: The sequence number would be part of each message itself . The receiver has to check that the sequence number is correct (no number missing) and only process the messages if that is ok. Otherwise go back to the central system and claim the missing message.
Pro:
Con:
Option C):
central sequence number provided by SMC:
option C1: one sequence per receiving registry
option C2: one number per sending / receiving registry combination
Sender Responsibility:
The sender is responsible for ensuring the desired order of calls to the Connect APIs. If api calls are to be scheduled / batched, it is suggested that the sender maintain a queue of outgoing calls / messages so that message sequence is persistent in the event of system failure. Make sure the next message is sent only when the status of the previous one has been marked OK by SMC.
Central system:
Central system provides the sequence number as part of the meta block as answer in each connect message (messages to another Registry).
Option: not add it to the message_response (and others)?
Receiver Responsibility:
The sequence number would be part of the meta block. The receiver has to check that the sequence number is correct (no numbers missing) and only process the messages if that is ok. Otherwise go back to the central system and claim the missing message.
Pro:
Con:
How to collect all messages at keep the sequence:
Options:
to allow external registries to access those messages there are several options:
A)
"the current suggested situation":
To keep the ordering (aside from timestamp) the above suggested sequence per receiving registry should be introduced.
The registries has to separate collecting from processing in order to keep the sequence of processing right.
B)
"meta-queue":
This would allow a registry to collect and process messages in the right order without storing them locally and sort them there
C)
"All-in-One Queue":
This would allow a registry to call just one endpoint to collect all messages.
Limitations:
Option C) doesn't work for all applications/tooling, like defining custom API connectors in the 365 PowerPlatform. In those cases the same static structure for all call responses on a specific endpoint is not only IBP but also required.
As on WMDA side (propably) all messages are stored in one queue/store anyhow (check with Mark) options A-C) will only effect the exposure of the messages to the registries and not the internal workings on WMDA side.
So implementing the options next to each other might give the registries the choice to pick there prefered solution and might still be fine for WMDA?!?
Recommendation:
implement B and C
As a consequence of implementing B) all individual endpoint will have an optional parameter "sequenceNumber" that will function as a filter so that you only get the message with that sequence from the endpoint, without that parameter the endpoints will function as is.
Message | NEW | XXXX | NNNN |
---|---|---|---|
Patient block (see 6 - Administration) | Y | DRB3/4/5 | DRB3/4/5 |
Donor block (see 6 - Administration) | Y | DRB3/4/5 | DRB3/4/5 |
Typing response | Y | DRB3/4/5 | DRB3/4/5 |
Sample response | Y | DRB3/4/5 | DRB3/4/5 |
As previously indicated in Section 2.1, the OpenAPI specification forms an integral component of our updated documentation set. Henceforth, we will refer to this API documentation as "Swagger." You can access it via the following publicly available URL: https://apispecs.wmda.info/
At this address one can find both Search & Match API specifications and Connect API specifications:
Since the communication is now split to communication with WMDA's Search & Match and messaging with other registries, each API request in this semantics document may be represented in two styles:
Wherever suitable, we included EMDIS names of the messages in parentheses, e.g. 5.1 - Extended Typing Request (TYP_REQ).
In many cases, the current implementation of EMDIS messages will require a conversion of the flat EMDIS message structure into the nested (multi-level) structure of the API messages. All the fields in API have better names: e.g., REQ_DATE becomes requestDate.
EMDIS rules from the EMDIS Semantics are modified accordingly to the new reality and are added to each message, where applicable.
The table below shows recommended sets of API endpoints to be implemented depending on your use of services:
Service in use API endpoint \ | Comment | Recommended for Patient & Search | Recommended for Patient & Search, download Registry | Mandatory for Connect | Mandatory for Connect, Download Registry | Comment |
---|---|---|---|---|---|---|
SEARCH & MATCH | ||||||
PATIENTS | ||||||
/patients [POST] | Create a patient | yes | no | yes (PR) | no | |
/patients [PUT] | Update an existing patient | no | no | yes (PR) | no | |
/patients [GET] | Retrieved patients list | no | no | no | no | Search and Match Service Graphical User Interface (GUI) content, optional for participating organisations |
/patients/{wmdaId} [GET] | Retrieve | no | no | no | no | Search and Match Service GUI content, optional for participating organisations |
/patients/status [PUT] | yes | no | no | no | ||
/patients/user [PUT] | no | no | no | no | Search and Match Service GUI content, optional for participating organisations | |
SEARCH | ||||||
/searches [POST] | yes | no | yes (PR) | no | for recommendations see semantics | |
/searches/patientSearches/{wmdaId} [GET] | yes | no | yes (PR) | no | ||
/searches/refreshAllPatientSearches [POST] | no | no | no | no | Search and Match Service GUI content, optional for participating organisations | |
/searches/{searchId} [GET] | no | no | no | no | highly recommended | |
/searches/refreshAllPatientSearches [POST] | no | no | no | no | ||
/searches/searchResults/donors [POST] | yes | no | yes (PR) | no | at least one of those is mandatory, | |
/searches/searchResults/cbus [POST] | ||||||
/searches/{searchId}/searchResults/adcu [GET] | ||||||
/searches/{searchId}/searchResults/registries [GET] | no | no | no | no | Search and Match Service GUI content, optional for participating organisations | |
/searches/{searchId}/searchResults/cbbs [GET] | no | no | no | no | Search and Match Service GUI content, optional for participating organisations | |
/searches/selected/donors [POST] | no | no | no | no | Search and Match Service GUI content, optional for participating organisations | |
/searches/selected/cbus [POST] | no | no | no | no | Search and Match Service GUI content, optional for participating organisations | |
/searches/donors/{searchResultsId} [GET] | no | no | no | no | Search and Match Service GUI content, optional for participating organisations | |
/searches/cbus/{searchResultsId} [GET] | no | no | no | no | Search and Match Service GUI content, optional for participating organisations | |
DASHBOARD | ||||||
for all | no | no | no | no | Search and Match Service GUI content, optional for participating organisations | |
CONNECT API | ||||||
ATTACHMENT | ||||||
/api/v1/attachmentTicket [POST] | no | no | Optional for participating organisations | |||
/api/v1/attachmentDownloadURL [POST] | no | no | Optional for participating organisations | |||
/api/v1/attachmentDownloadedNotification [POST] | no | no | Optional for participating organisations | |||
RETRIEVE | ||||||
/api/v1/availableMessages [POST] | yes | yes | ||||
ADMIN | ||||||
/api/v1/alertRetrieve [GET] | no | no | recommended | |||
/api/v1/alertUpdateRetrieve [GET] | no | no | recommended | |||
PATIENT | ||||||
/api/v1/updateRegisteredPatient [POST] | yes (PR) | yes (PR) | ||||
/api/v1/updateRegisteredPatientRetrieve [GET] | yes (DR) | yes (DR) | ||||
PING | ||||||
/api/v1/pingRequest [POST] | no | no | Optional for participating organisations | |||
/api/v1/pingRetrieve [POST] | no | no | Optional for participating organisations | |||
TEXT MESSAGE | ||||||
/api/v1/textMessageRequest [POST] | no | no | Optional for participating organisations | |||
/api/v1/TextMessageRetrieve [GET] | no | no | Optional for participating organisations | |||
REQUEST | ||||||
/api/v1/genericRequestRequest [POST] | no | no | ||||
/api/v1/genericRequestRetrieve [GET] | no | no | ||||
/api/v1/extendedTypingRequestRequest [POST] | yes (PR) | yes (PR) | ||||
/api/v1/extendedTypingRequestRetrieve [POST] | no | no | recommended for DCs with incompletely typed donors | |||
/api/v1/extendedTypingResponseRequest [POST] | no | no | recommended for DCs with incompletely typed donors | |||
/api/v1/extendedTypingResponseRetrieve [POST] | yes (PR) | yes (PR) | ||||
/api/v1/sampleRequestRequest [POST] | yes (PR) | yes (PR) | ||||
/api/v1/sampleRequestRetrieve [POST] | yes (DR, CBB) | yes (DR, CBB) | ||||
/api/v1/sampleInfoRequest [POST] | yes (DR, CBB) | yes (DR, CBB) | ||||
/api/v1/sampleInfoRetrieve [POST] | yes (PR) | yes (PR) | ||||
/api/v1/sampleArrivalRequest [POST] | yes (DR, CBB) | yes (DR, CBB) | ||||
/api/v1/sampleArrivalRetrieve [POST] | yes (PR) | yes (PR) | ||||
/api/v1/sampleResponseRequest [POST] | yes (PR) | yes (PR) | ||||
/api/v1/sampleResponseRetrieve [POST] | yes (DR, CBB) | yes (DR, CBB) | ||||
/api/v1/infectiousDiseaseMarkerRequest [POST] | yes (PR) | yes (PR) | ||||
/api/v1/infectiousDiseaseMarkerRequestRetrieve [POST] | yes (DR) | yes (DR) | ||||
/api/v1/infectiousDiseaseMarkerResultRequest [POST] | yes (DR) | yes (DR) | ||||
/api/v1/infectiousDiseaseMarkerResultRetrieve [POST] | yes (PR) | yes (PR) | ||||
/api/v1/reservationRequestRequest [POST] | yes (PR) | yes (PR) | ||||
/api/v1/reservationRequestRetrieve [POST] | yes (DR) | yes (DR) | ||||
/api/v1/reservationResponseRequest [POST] | yes (DR) | yes (DR) | ||||
/api/v1/reservationResponseRetrieve [POST] | yes (PR) | yes (PR) | ||||
/api/v1/reservationReleaseRequest [POST] | yes (PR) | yes (PR) | ||||
/api/v1/reservationReleaseRetrieve [POST] | yes (DR) | yes (DR) | ||||
/api/v1/requestCancellationRequest [POST] | yes (PR) | yes (PR) | ||||
/api/v1/requestCancellationRetrieve [POST] | yes (DR) | yes (DR) | ||||
/api/v1/requestRejectedRequest [POST] | yes (DR) | yes (DR) | ||||
/api/v1/requestRejectedRetrieve [POST] | yes (PR) | yes (PR) | ||||
/api/v1/resultReminderRequest [POST] | no | no | recommended | |||
/api/v1/resultReminderRetrieve [POST] | no | no | recommended | |||
GENERAL | ||||||
/api/v1/messageResponse [POST] | yes | yes | ||||
/api/v1/messageResponseRetrieve [POST] | yes | yes | ||||
/api/v1/messageAcknowledgementRequest [POST] | all replaced by the messageResponse | |||||
/api/v1/messageAcknowledgementRetrieve [POST] | ||||||
/api/v1/warningRequest [POST] | ||||||
/api/v1/warningRetrieve [POST] | ||||||
/api/v1/messageDenialRequest [POST] | ||||||
/api/v1/messageDenialRetrieve [POST] | ||||||
CBU | ||||||
/api/v1/cordBloodUnitReportRequestRequest | on hold | no | no | should be generalised to CBU and ADCUs, etc... | ||
/api/v1/cordBloodUnitReportRequestRetrieve | on hold | yes (CBB) | yes (CBB) | |||
/api/v1/cordBloodUnitReportResponseRequest | on hold | no | no | |||
/api/v1/cordBloodUnitReportResponseRetrieve | on hold | yes (CBB) | yes (CBB) | |||