def get(method, path, params, body): assert isinstance(method, str) assert isinstance(path, str) assert isinstance(params, dict) split_path = path.split("/") split_path.pop(0) try: if method == "POST": if split_path[0] == "register": return RegisterUserRequest(params=params) elif split_path[0] == "track": return UploadTrackRequest(params=params, body=body) elif split_path[0] == "infected": return UploadPersonalDataRequest(params=params) else: raise ValueError("Invalid path") elif method == "PATCH": if split_path[0] == "userstatus": return UpdateUserStatusRequest(params=params) else: raise ValueError("Invalid path") elif method == "GET": if split_path[0] == "userstatus": return GetUserStatusRequest(params=params) else: raise ValueError("Invalid path") else: raise ValueError("Invalid path") except Exception as ex: logger.error("EXCEPTION PARSING REQUEST: {} {}".format( type(ex), ex)) return ErrorResponse(str(ex))
def process_contacts(contact_group): for contact in contact_group: try: if contact[1] > contact[3]: Database.update_risk_level(contact[2], min(int(contact[3] + contact[1] * contact[5]), 4)) else: Database.update_risk_level(contact[0], min(int(contact[1] + contact[3] * contact[5]), 4)) except Exception as ex: logger.error("EXCEPTION DATABASE: {} {}".format(type(ex), ex)) return ErrorResponse("Database error")
def _process_get_user_status_request(self, request): assert isinstance(request, GetUserStatusRequest) logger.debug("PROCESSING UPDATE USER STATUS REQUEST...") user_id = request.user_id risk_level = None try: risk_level = Database.get_users_risk_level(user_id) except Exception as ex: logger.error("EXCEPTION DATABASE: {} {}".format(type(ex), ex)) return ErrorResponse("Database error") return CustomResponse(success=True, message="", status=risk_level)
def process_contact(user_id1, user_id2, relevance_factor): logger.info("Processing contact between {} and {} with relevance_factor {}".format(user_id1, user_id2, relevance_factor)) risk_level1 = Database.get_users_risk_level(user_id1) risk_level2 = Database.get_users_risk_level(user_id2) try: Database.update_risk_level(user_id2, min(int(risk_level2 + risk_level1 * relevance_factor), 4)) except Exception as ex: logger.error("EXCEPTION DATABASE: {} {}".format(type(ex), ex)) return ErrorResponse("Database error")
def _process_update_user_status_request(self, request): assert isinstance(request, UpdateUserStatusRequest) logger.debug("PROCESSING UPDATE USER STATUS REQUEST...") user_id = request.user_id new_user_status = request.new_user_status try: Database.update_risk_level(user_id, new_user_status) except Exception as ex: logger.error("EXCEPTION DATABASE: {} {}".format(type(ex), ex)) return ErrorResponse("Database error") return SuccessResponse("Status update succeeded")
def process_chains(): logger.info("Processing chains") try: risk_group = Database.get_users_by_risk_level(5) for risk_id in risk_group: contact_group = Database.get_contacts_after_timestamp(risk_id[0], datetime.now() - timedelta(hours=1)) ChainIterator.process_contacts(contact_group) except Exception as ex: logger.error("EXCEPTION DATABASE: {} {}".format(type(ex), ex)) return ErrorResponse("Database error")
def _process_upload_personal_data_request(self, request): assert isinstance(request, UploadPersonalDataRequest) logger.debug("PROCESSING UPLOAD USER DATA REQUEST...") user_id = request.user_id firstname = request.firstname lastname = request.lastname phonenumber = request.phonenumber try: Database.insert_infected(user_id, firstname, lastname, phonenumber) except Exception as ex: logger.error("EXCEPTION DATABASE: {} {}".format(type(ex), ex)) return ErrorResponse("Database error") return SuccessResponse("Upload succeeded")
def iterate_geo_data(): logger.info("Iterating geo data") risk_group = Database.get_users_by_risk_level(5) try: for risk_id in risk_group: geo_data = Database.get_geo_data_after_timestamp(risk_id, datetime.now() - timedelta(hours=1)) contact_subjects = Database.get_users_below_risk_level(4) for subject in contact_subjects: geo_data_subject = Database.get_geo_data_after_timestamp(subject[0], datetime.now() - timedelta(hours=1)) GeoProcessor.identify_contacts(risk_id, geo_data, geo_data_subject) except Exception as ex: logger.error("EXCEPTION DATABASE: {} {}".format(type(ex), ex)) return ErrorResponse("Database error")
def _process_upload_track_request(self, request): assert isinstance(request, UploadTrackRequest) logger.debug("PROCESSING UPLOAD TRACK REQUEST...") contacts = request.contacts positions = request.positions user_id = request.user_id try: for contact in contacts: Database.report_contact(contact[0], contact[1], contact[2], contact[3]) for position in positions: Database.insert_geo_data(user_id, position[0], position[1], position[2]) except Exception as ex: logger.error("EXCEPTION DATABASE: {} {}".format(type(ex), ex)) return ErrorResponse("Database error") return SuccessResponse("Upload succeeded")
def _process_register_user_request(self, request): assert request.request_type is RequestType.REGISTER_USER logger.debug("PROCESSING REGISTER USER REQUEST...") try: user_id = Database.insert_user() except Exception as ex: logger.error("EXCEPTION DATABASE: {} {}".format(type(ex), ex)) return ErrorResponse("Database error") # create json web token payload = { "userId": user_id, "time": int(time.time()), "app": "corona_tracker" } params = config("auth") secret = params["jwtsecret"] encoded = jwt.encode(payload=payload, key=secret, algorithm="HS256").decode("utf-8") return CustomResponse(success=True, message="", userId=user_id, jwt=encoded)