예제 #1
0
    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")
예제 #3
0
    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")
예제 #5
0
    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")
예제 #7
0
    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")
예제 #9
0
    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")
예제 #10
0
 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)