def validate(request_body: dict) -> Optional[str]: """ Returns an error message if the /api/assessments post request is not valid. Else, returns None. :param request_body: The request body as a dict object { "dateAssessed": 1551447833, - required "diagnosis": "patient is fine", "medicationPrescribed": "tylenol", "healthcareWorkerId": 2, "specialInvestigations": "bcccccccccddeeeff", "treatment": "b", "readingId": "asdasd82314278226313803", - required "followupNeeded": True, - required "followupInstructions": "pls help, give lots of tylenol" - required if followupNeeded = True } :return: An error message if request body in invalid in some way. None otherwise. """ error_message = None # Check if required keys are present required_keys = [ "readingId", "followupNeeded", "dateAssessed", "healthcareWorkerId", ] error_message = required_keys_present(request_body, required_keys) if error_message is not None: return error_message # If patient has followupNeeded set to True, make sure followupInstructions is filled in if request_body.get("followupNeeded") == True: error_message = required_keys_present(request_body, ["followupInstructions"]) if error_message is not None: return error_message # Check that certain fields are of type string error_message = values_correct_type(request_body, ["readingId"], str) if error_message is not None: return error_message # Check that certain fields are of type int error_message = values_correct_type(request_body, ["dateAssessed"], int) if error_message is not None: return error_message return error_message
def validate_timestamp(request_body: dict) -> Optional[str]: """Returns error message if timestamp body is invalid, otherwise returns None :param request_body: { "from": "1546702448" -- required "to": "1547212259" -- required } """ error_message = None required_keys = ["from", "to"] error_message = required_keys_present(request_body, required_keys) if error_message is not None: return error_message list_of_values = [request_body.get("from"), request_body.get("to")] for value in list_of_values: error_message = values_correct_type(request_body, value, str) if error_message is not None: return error_message return error_message
def validate_time_frame_readings(request_body: dict) -> Optional[str]: """ Returns error message if the api/stats-timeframed-readings post request is not valid, otherwise returns None. :param request_body: Request as a dict object { "timeframe:{ -required "from": "1546702448" "to": "1547212259" } } """ error_message = None # Check for required keys required_keys = ["timeframe"] error_message = required_keys_present(request_body, required_keys) if error_message is not None: return error_message # Check that the json is valid error_message = validate_timestamp(request_body.get("timeframe")) if error_message is not None: return error_message
def validate(request_body: dict) -> Optional[str]: """ Returns an error message if the /api/facilities post request is not valid. Else, returns None. :param request_body: The request body as a dict object { "healthFacilityName": "H12", - required "healthFacilityPhoneNumber": "444-444-4444", "about": "Biggest hospital", "facilityType": "HOSPITAL" } :return: An error message if request body in invalid in some way. None otherwise. """ error_message = None # Check if required keys are present required_keys = ["healthFacilityName"] error_message = required_keys_present(request_body, required_keys) if error_message is not None: return error_message # Check that certain fields are of type string error_message = values_correct_type(request_body, ["healthFacilityName"], str) if error_message is not None: return error_message return error_message
def validate(request_body: dict) -> Optional[str]: """ Returns an error message if the /api/associations post request is not valid. Else, returns None. :param request_body: The request body as a dict object { "patientId": 47, - required "healthFacilityName": "H0000", "userId": 1, } :return: An error message if request body in invalid in some way. None otherwise. """ error_message = None # Check if required keys are present required_keys = ["patientId"] error_message = required_keys_present(request_body, required_keys) if error_message is not None: return error_message return error_message
def validate(request_body: dict) -> Optional[str]: """ Returns an error message if the /api/patients post request is not valid. Else, returns None. :param request_body: The request body as a dict object { "patientId": "123456", - required "patientName": "testName", - required "isPregnant": True, - required "patientSex": "FEMALE", - required "householdNumber": "20", "dob": "1990-05-30", "isExactDob: false "zone": "15", "villageNumber": "50", "gestationalTimestamp": 1587068710, - required if isPregnant = True "gestationalAgeUnit": "GESTATIONAL_AGE_UNITS_WEEKS", - required isPregnant = True "drugHistory": "too much tylenol", "medicalHistory": "not enough advil" } :return: An error message if request body in invalid in some way. None otherwise. """ error_message = None # Check if required keys are present required_keys = [ "patientId", "patientName", "patientSex", "isPregnant", "dob", "isExactDob", ] error_message = required_keys_present(request_body, required_keys) if error_message is not None: return error_message # Check that certain fields are of type bool error_message = values_correct_type(request_body, ["isPregnant"], bool) if error_message is not None: return error_message # If patient is pregnant, check if certain pregnancy related fields are present if request_body.get("isPregnant") == True: error_message = required_keys_present( request_body, ["gestationalTimestamp", "gestationalAgeUnit"]) if error_message is not None: return error_message # Check if gestational age is less than or equal to 43 weeks/10 months if "gestationalTimestamp" in request_body: error_message = check_gestational_age_under_limit( int(request_body.get("gestationalTimestamp"))) if error_message is not None: return error_message # Check that certain fields are of type string error_message = values_correct_type(request_body, ["patientName"], str) if error_message is not None: return error_message # Check that certain fields are of type int error_message = values_correct_type(request_body, ["patientId"], int) if error_message is not None: return error_message # Check that patientId is not over the 14 digit limit. if len(str(request_body.get("patientId"))) > 14: return "patientId is too long. Max is 14 digits." # Make sure the dob is in YYYY-mm-dd format if not is_correct_date_format(request_body.get("dob")): return "dob is not in the required YYYY-MM-DD format." return error_message
def validate(request_body: dict) -> Optional[str]: """ Returns an error code and message if the /api/readings post request is not valid. Else, returns None. :param request_body: The request body as a dict object { "readingId": "asdasd82314278226313803", - required "patientId": "123456", - required "bpSystolic" : 150, - required "bpDiastolic" : 150, - required "heartRateBPM" : 35, - required "isFlaggedForFollowup" : True, "symptoms": ["Headache,Blurred vision,Bleeding,sleepy"], - required "dateTimeTaken": 868545, "userId": 1, "followup": { "dateAssessed": 1551447833, "healthcareWorkerId": 2, "diagnosis": "patient is fine", "medicationPrescribed": "tylenol", "specialInvestigations": "bcccccccccddeeeff", "treatment": "b", "readingId": "test3", "followupNeeded": "TRUE", "followupInstructions": "pls help, give lots of tylenol" } } :return: An error message if request body in invalid in some way. None otherwise. """ error_message = None # Check if required keys are present required_keys = [ "readingId", "patientId", "bpSystolic", "bpDiastolic", "heartRateBPM", "symptoms", ] error_message = required_keys_present(request_body, required_keys) if error_message is not None: return error_message # Check that certain fields are of type string error_message = values_correct_type(request_body, ["readingId"], str) if error_message is not None: return error_message # Check that certain fields are of type int error_message = values_correct_type( request_body, [ "patientId", "bpSystolic", "bpDiastolic", "heartRateBPM", "userId", ], int, ) if error_message is not None: return error_message # Check that certain fields are an array error_message = values_correct_type(request_body, ["symptoms"], list) if error_message is not None: return error_message # Check if the nested assessment (followup) object is valid if "followup" in request_body: error_message = validate_assessment(request_body.get("followup")) if error_message is not None: return error_message return error_message
def validate(request_body: dict) -> Optional[str]: """ Returns an error message if the /api/referrals post request is not valid. Else, returns None. :param request_body: The request body as a dict object { "referralId":"e9b1d6b0-a098-4c0a-ab47-bda85a1890c7", "patient":{ "gestationalTimestamp":two_weeks_ago, "gestationalAgeUnit":"GESTATIONAL_AGE_UNITS_MONTHS", "patientId":"2", "patientName":"A", "dob":"2000-01-01", "patientSex":"FEMALE", "isPregnant":True, "drugHistory":"", "medicalHistory":"", "lastEdited":1596688734, "base":1596688734, "readings":[ { "readingId":"0af5db8f-60b2-4c66-92d2-82aa08d31fd0", "patientId":"2", "dateTimeTaken":1596938834, "bpSystolic":55, "bpDiastolic":65, "heartRateBPM":75, "dateRecheckVitalsNeeded":1596939723, "isFlaggedForFollowup":False, "symptoms":[ "Blurred vision" ], "referral":{ "dateReferred":1596938834, "comment":"here is a comment", "patientId":"2", "referralHealthFacilityName":"H0000", "readingId":"0af5db8f-60b2-4c66-92d2-82aa08d31fd0", "isAssessed":False }, "urineTests":{ "urineTestLeuc":"-", "urineTestNit":"+", "urineTestPro":"++", "urineTestBlood":"++", "urineTestGlu":"-" }, "retestOfPreviousReadingIds":"" } ] } } :return: An error message if request body in invalid in some way. None otherwise. """ error_message = None # Check if required keys are present required_keys = ["referralId"] error_message = required_keys_present(request_body, required_keys) if error_message is not None: return error_message # Check that nested `patient` JSON is valid error_message = validate_patient(request_body.get("patient")) if error_message is not None: return error_message # Check that each element in the nested `readings` array is valid list_of_readings = request_body.get("patient").get("readings") for reading_body in list_of_readings: # Validate the reading itself error_message = validate_reading(reading_body) if error_message is not None: return error_message referral_body = reading_body.get("referral") # Check if required keys are present error_message = required_keys_present( referral_body, [ "dateReferred", "readingId", "isAssessed", "patientId", "referralHealthFacilityName", ], ) if error_message is not None: return error_message # Check that certain fields are of type int error_message = values_correct_type(request_body, ["dateReferred"], int) if error_message is not None: return error_message # Check that certain fields are of type string error_message = values_correct_type(request_body, ["readingId"], str) if error_message is not None: return error_message return error_message