Pending Approval
Pending Approval Mapping CF
CREATE TABLE IF NOT EXISTS pending_approval_mapping (catchment_id varchar,last_updated timeuuid,health_id varchar,PRIMARY KEY (catchment_id, last_updated))WITH CLUSTERING ORDER BY (last_updated ASC);
CREATE INDEX idx_pending_approval_mapping_health_id on pending_approval_mapping(health_id);
Search All Pending Approvals by Catchment
health_ids and last_updated timeuuids are selected from pending_approval_mapping CF for a given catchment and gte timeuuid. The results are ordered by last_updates asc.
For each health_id, patient CF is queried for given_name and surname.
Sample JSON response:
{
"hid": "5958385569250672641",
"given_name": "Sony",
"sur_name": "Bazzardo",
"last_updated": "b385af50-a225-11e4-97c2-5fcb9978cb86"
}
Search by HID
Pending approvals for a particular patient is stored in the patient CF. When pending approval for a particular patient (by HID) is queried, the result is served from patient CF.
The field is 'pending_approvals.' The pending approvals are stored as a JSON string. Class PendingApproval is used to serialize/deserialize the JSON. Updates are grouped by fields.
The pending approvals are ordered by field name (lexicographically), then timeuuid in desc order. For each update the timeuuid is captured. See 'field_details' in the JSON below.
TODO: Spike user defined types in Cassandra
Sample JSON response:
{
"field_name": "gender",
"current_value": "M",
"field_details": {
"9b450750-b28e-11e4-a7a6-5fcb9978cb86": {
"value": "O",
"facility_id": "10000059",
"created_at": "2015-02-12T08:10:28.805Z"
},
"98bc87b0-b28e-11e4-a7a6-5fcb9978cb86": {
"value": "F",
"facility_id": "10000059",
"created_at": "2015-02-12T08:10:24.555Z"
}}
Update Fields Marked for Approval
When a particular patient field that is marked for approval is updated, patient CF and pending_approval_mapping CF are updated.
patient CF - new field details added to the pending_approvals JSON.
pending_approval_mapping CF -
Search by health_id (secondary index) and delete the records.
Create new records for each possible catchment (see explanation below). last_updated is set as the latest timeuuid of the pending_approvals in patient CF.
Possible catchments - If catchment is 10203040, the possible catchments are 1020, 102030, 10203040. Catchments should have always division and district.
All queries run in a batch.
Approve Request
The field(s) is updated in patient CF.
When a field that is pending for approval is approved, all the updates for that field are removed from the pending_approvals in patient CF.
If there is no other pending_approvals in the patient CF, all pending_approval_mapping CF records for that health_id is deleted.
Else, pending_approval_mapping CF is updated as mentioned above.
All queries run in a batch.
Reject Request
The field(s) is NOT updated in patient CF.
When a field that is pending for approval is rejected, only that particular updates for that field is removed from the pending_approvals in patient CF.
If there is no other pending_approvals in the patient CF, all pending_approval_mapping CF records for that health_id is deleted.
Else, pending_approval_mapping CF is updated as mentioned above.
All queries run in a batch.