Skip to content

Commit 3545860

Browse files
committed
Add optional sortOrder field to all save-request APIs
Allows API clients to specify a sortOrder on each record in the payload, ensuring records are processed and IDs generated in the desired sequence. If sortOrder is not provided, records are processed in their original order.
1 parent 77cfd47 commit 3545860

12 files changed

Lines changed: 575 additions & 222 deletions

File tree

app/api/v1.1/covid-19/save-request.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,26 @@
117117
$userAttributes = JsonUtility::jsonToSetString(json_encode($userAttributes), 'user_attributes');
118118
$usersService->saveUserAttributes($userAttributes, $user['user_id']);
119119

120+
// Collect all items from the streaming parser into an array
121+
// so we can sort by sortOrder if provided
122+
$dataItems = [];
123+
foreach ($input as $key => $item) {
124+
$dataItems[$key] = $item;
125+
}
126+
127+
// Sort by sortOrder if any items have it
128+
$hasSortOrder = array_filter($dataItems, fn($item) => isset($item['sortOrder']));
129+
if ($hasSortOrder !== []) {
130+
uasort($dataItems, function ($a, $b) {
131+
$sortA = $a['sortOrder'] ?? PHP_INT_MAX;
132+
$sortB = $b['sortOrder'] ?? PHP_INT_MAX;
133+
return $sortA <=> $sortB;
134+
});
135+
}
136+
120137
$responseData = [];
121138
$dataCounter = 0;
122-
foreach ($input as $rootKey => $data) {
139+
foreach ($dataItems as $rootKey => $data) {
123140
$dataCounter++;
124141

125142

@@ -622,7 +639,7 @@
622639
}
623640
}
624641

625-
if ($noOfFailedRecords > 0 && $noOfFailedRecords == iterator_count($input)) {
642+
if ($noOfFailedRecords > 0 && $noOfFailedRecords == $dataCounter) {
626643
$payloadStatus = 'failed';
627644
} elseif ($noOfFailedRecords > 0) {
628645
$payloadStatus = 'partial';
@@ -661,7 +678,7 @@
661678

662679

663680
$payload = JsonUtility::encodeUtf8Json($payload);
664-
$general->addApiTracking($transactionId, $user['user_id'], iterator_count($input), 'save-request', 'covid19', $_SERVER['REQUEST_URI'], $origJson, $payload, 'json', null, null, $authToken);
681+
$general->addApiTracking($transactionId, $user['user_id'], $dataCounter, 'save-request', 'covid19', $_SERVER['REQUEST_URI'], $origJson, $payload, 'json', null, null, $authToken);
665682

666683
$general->updateResultSyncDateTime('covid19', null, $updatedLabs);
667684

app/api/v1.1/eid/save-request.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,26 @@
121121
$userAttributes = JsonUtility::jsonToSetString(json_encode($userAttributes), 'user_attributes');
122122
$usersService->saveUserAttributes($userAttributes, $user['user_id']);
123123

124+
// Collect all items from the streaming parser into an array
125+
// so we can sort by sortOrder if provided
126+
$dataItems = [];
127+
foreach ($input as $key => $item) {
128+
$dataItems[$key] = $item;
129+
}
130+
131+
// Sort by sortOrder if any items have it
132+
$hasSortOrder = array_filter($dataItems, fn($item) => isset($item['sortOrder']));
133+
if ($hasSortOrder !== []) {
134+
uasort($dataItems, function ($a, $b) {
135+
$sortA = $a['sortOrder'] ?? PHP_INT_MAX;
136+
$sortB = $b['sortOrder'] ?? PHP_INT_MAX;
137+
return $sortA <=> $sortB;
138+
});
139+
}
140+
124141
$responseData = [];
125142
$dataCounter = 0;
126-
foreach ($input as $rootKey => $data) {
143+
foreach ($dataItems as $rootKey => $data) {
127144
$dataCounter++;
128145

129146
$mandatoryFields = [

app/api/v1.1/generic-tests/save-request.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,26 @@
107107
}
108108
$userAttributes = JsonUtility::jsonToSetString(json_encode($userAttributes), 'user_attributes');
109109
$usersService->saveUserAttributes($userAttributes, $user['user_id']);
110-
if (isset($input) && !empty($input)) {
110+
// Collect all items from the streaming parser into an array
111+
// so we can sort by sortOrder if provided
112+
$dataItems = [];
113+
foreach ($input as $key => $item) {
114+
$dataItems[$key] = $item;
115+
}
116+
117+
// Sort by sortOrder if any items have it
118+
$hasSortOrder = array_filter($dataItems, fn($item) => isset($item['sortOrder']));
119+
if ($hasSortOrder !== []) {
120+
uasort($dataItems, function ($a, $b) {
121+
$sortA = $a['sortOrder'] ?? PHP_INT_MAX;
122+
$sortB = $b['sortOrder'] ?? PHP_INT_MAX;
123+
return $sortA <=> $sortB;
124+
});
125+
}
126+
127+
if ($dataItems !== []) {
111128
$dataCounter = 0;
112-
foreach ($input as $rootKey => $data) {
129+
foreach ($dataItems as $rootKey => $data) {
113130
$dataCounter++;
114131
$mandatoryFields = [
115132
'sampleCollectionDate',

app/api/v1.1/tb/save-request.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,26 @@
122122
$userAttributes = JsonUtility::jsonToSetString(json_encode($userAttributes), 'user_attributes');
123123
$usersService->saveUserAttributes($userAttributes, $user['user_id']);
124124

125+
// Collect all items from the streaming parser into an array
126+
// so we can sort by sortOrder if provided
127+
$dataItems = [];
128+
foreach ($input as $key => $item) {
129+
$dataItems[$key] = $item;
130+
}
131+
132+
// Sort by sortOrder if any items have it
133+
$hasSortOrder = array_filter($dataItems, fn($item) => isset($item['sortOrder']));
134+
if ($hasSortOrder !== []) {
135+
uasort($dataItems, function ($a, $b) {
136+
$sortA = $a['sortOrder'] ?? PHP_INT_MAX;
137+
$sortB = $b['sortOrder'] ?? PHP_INT_MAX;
138+
return $sortA <=> $sortB;
139+
});
140+
}
141+
125142
$responseData = [];
126143
$dataCounter = 0;
127-
foreach ($input as $rootKey => $data) {
144+
foreach ($dataItems as $rootKey => $data) {
128145
$dataCounter++;
129146

130147
$mandatoryFields = [

app/api/v1.1/vl/save-request.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,25 @@
110110
$userAttributes = JsonUtility::jsonToSetString(json_encode($userAttributes), 'user_attributes');
111111
$usersService->saveUserAttributes($userAttributes, $user['user_id']);
112112

113+
// Collect all items from the streaming parser into an array
114+
// so we can sort by sortOrder if provided
115+
$dataItems = [];
116+
foreach ($input as $key => $item) {
117+
$dataItems[$key] = $item;
118+
}
119+
120+
// Sort by sortOrder if any items have it
121+
$hasSortOrder = array_filter($dataItems, fn($item) => isset($item['sortOrder']));
122+
if ($hasSortOrder !== []) {
123+
uasort($dataItems, function ($a, $b) {
124+
$sortA = $a['sortOrder'] ?? PHP_INT_MAX;
125+
$sortB = $b['sortOrder'] ?? PHP_INT_MAX;
126+
return $sortA <=> $sortB;
127+
});
128+
}
129+
113130
$dataCounter = 0;
114-
foreach ($input as $rootKey => $data) {
131+
foreach ($dataItems as $rootKey => $data) {
115132
$dataCounter++;
116133

117134
$mandatoryFields = [

0 commit comments

Comments
 (0)