def get_cr(cr_id="", surrogate_id="", slr_id="", subject_id="", consent_pair_id="", account_id="", cursor=None): """ Get Consent Record entry :param account_id: :param slr_id: :return: dict """ try: cr_id = str(cr_id) except Exception: raise TypeError("cr_id MUST be str, not " + str(type(cr_id))) try: surrogate_id = str(surrogate_id) except Exception: raise TypeError("surrogate_id MUST be str, not " + str(type(surrogate_id))) try: slr_id = str(slr_id) except Exception: raise TypeError("slr_id MUST be str, not " + str(type(slr_id))) try: subject_id = str(subject_id) except Exception: raise TypeError("subject_id MUST be str, not " + str(type(subject_id))) try: consent_pair_id = str(consent_pair_id) except Exception: raise TypeError("consent_pair_id MUST be str, not " + str(type(consent_pair_id))) try: account_id = str(account_id) except Exception: raise TypeError("account_id MUST be str, not " + str(type(account_id))) if cursor is None: # Get DB cursor try: cursor = get_db_cursor() except Exception as exp: logger.error('Could not get database cursor: ' + repr(exp)) raise try: db_entry_object = ConsentRecord(consent_id=cr_id, surrogate_id=surrogate_id, service_link_record_id=slr_id, subject_id=subject_id, consent_pair_id=consent_pair_id, accounts_id=account_id) except Exception as exp: error_title = "Failed to create ConsentRecord object" logger.error(error_title + ": " + repr(exp)) raise else: logger.debug("ConsentRecord object created: " + db_entry_object.log_entry) # Get slr from DB try: cursor = db_entry_object.from_db(cursor=cursor) except Exception as exp: error_title = "Failed to fetch ConsentRecord from DB" logger.error(error_title + ": " + repr(exp)) raise else: logger.info("ConsentRecord fetched") logger.debug("ConsentRecord fetched from db: " + db_entry_object.log_entry) return db_entry_object.to_api_dict, str(db_entry_object.accounts_id)
def store_csr(account_id=None, record_id=None, cr_id=None, surrogate_id=None, consent_status=None, iat=None, prev_record_id=None, csr_signed=None, endpoint="store_csr()"): # Parameter Check if account_id is None: raise AttributeError("Provide account_id as parameter") if record_id is None: raise AttributeError("Provide record_id as parameter") if cr_id is None: raise AttributeError("Provide cr_id as parameter") if surrogate_id is None: raise AttributeError("Provide surrogate_id as parameter") if consent_status is None: raise AttributeError("Provide consent_status as parameter") if iat is None: raise AttributeError("Provide iat as parameter") if prev_record_id is None: raise AttributeError("Provide prev_record_id as parameter") if csr_signed is None: raise AttributeError("Provide csr_signed as parameter") # Parameter type check try: account_id = str(account_id) except Exception: raise TypeError("account_id MUST be str, not " + str(type(account_id))) try: record_id = str(record_id) except Exception: raise TypeError("record_id MUST be str, not " + str(type(record_id))) try: cr_id = str(cr_id) except Exception: raise TypeError("cr_id MUST be str, not " + str(type(cr_id))) try: surrogate_id = str(surrogate_id) except Exception: raise TypeError("surrogate_id MUST be str, not " + str(type(surrogate_id))) try: consent_status = str(consent_status) except Exception: raise TypeError("consent_status MUST be str, not " + str(type(consent_status))) try: iat = int(iat) except Exception: raise TypeError("iat MUST be int, not " + str(type(iat))) try: prev_record_id = str(prev_record_id) except Exception: raise TypeError("prev_record_id MUST be str, not " + str(type(prev_record_id))) if not isinstance(csr_signed, dict): raise TypeError("csr_signed MUST be dict, not " + str(type(csr_signed))) ###### # Base information #### # Get DB cursor try: cursor = get_db_cursor() except Exception as exp: logger.error('Could not get database cursor: ' + repr(exp)) raise ApiError(code=500, title="Failed to get database cursor", detail=repr(exp), source=endpoint) ########### # Entries # ########### # Existing Consent Record ### # Init Consent Record Object try: logger.info("Create ConsentRecord object") cr_entry = ConsentRecord(consent_id=cr_id, accounts_id=account_id, surrogate_id=surrogate_id) except Exception as exp: error_title = "Failed to create Consent Record object" error_detail = str(exp.message) logger.error(error_title + ": " + repr(exp)) raise RuntimeError(error_title + " - " + error_detail) else: logger.debug("cr_entry: " + cr_entry.log_entry) # Get Consent Record from DB try: logger.info("Get Consent Record from DB") cursor = cr_entry.from_db(cursor=cursor) except IndexError as exp: error_title = "Consent Record not found" error_detail = str(exp.message) logger.error(error_title + ": " + repr(exp)) raise IndexError(error_title + " - " + error_detail) except Exception as exp: error_title = "Failed to fetch Consent Record" error_detail = str(exp.message) logger.error(error_title + ": " + repr(exp)) raise RuntimeError(error_title + " - " + error_detail) else: logger.debug("cr_entry: " + cr_entry.log_entry) # Get primary key of Consent Record database entry try: logger.info("Get primary key of Consent Record database entry") cr_entry_primary_key = cr_entry.id except Exception as exp: error_title = "Failed to fetch Consent Record primary key" error_detail = repr(exp) logger.error(error_title + ": " + repr(exp)) raise KeyError(error_title + " - " + error_detail) else: logger.debug("cr_entry_primary_key: " + str(cr_entry_primary_key)) # CSR try: logger.info("Create ConsentStatusRecord object") csr_entry = ConsentStatusRecord( consent_status_record_id=record_id, status=consent_status, consent_status_record=csr_signed, consent_record_id=cr_id, issued_at=iat, prev_record_id=prev_record_id, consent_records_id=int(cr_entry_primary_key), accounts_id=int(account_id)) except Exception as exp: error_title = "Failed to create Consent Status Record object" error_detail = repr(exp) logger.error(error_title + ": " + repr(exp)) raise RuntimeError(error_title + " - " + error_detail) else: logger.info("csr_entry: " + csr_entry.log_entry) ########### # Store # ########### # CSR # Get database table name for Consent Status Record try: logger.info("Get Consent Status Record table name") csr_table_name = csr_entry.table_name except Exception as exp: error_title = "Could not get table name of Consent Status Record database table" error_detail = repr(exp) logger.error(error_title + ": " + repr(exp)) raise RuntimeError(error_title + " - " + error_detail) else: logger.info("Got Consent Status Record table name: " + str(csr_table_name)) # Store CSR try: logger.info("Store ConsentStatusRecord") try: cursor = csr_entry.to_db(cursor=cursor) except Exception as exp: error_title = "Failed to store Consent Status Record of Sink Service" error_detail = repr(exp) logger.error(error_title + ": " + repr(exp)) raise RuntimeError(error_title + " - " + error_detail) else: logger.debug("csr_entry: " + csr_entry.log_entry) # Commit db.connection.commit() except Exception as exp: logger.error('Consent Status Record Commit failed: ' + repr(exp)) db.connection.rollback() logger.error('--> rollback') error_title = "Could not write to database" error_detail = repr(exp) logger.error(error_title + ": " + error_detail) raise else: logger.info("Consent Status Record commited") return csr_entry
def get_last_cr_status(consent_id=None, account_id="", endpoint="get_last_cr_status()"): if consent_id is None: raise AttributeError("Provide consent_id as parameter") if account_id is None: raise AttributeError("Provide account_id as parameter") # Get DB cursor try: logger.info("Getting database cursor") cursor = get_db_cursor() except Exception as exp: logger.error('Could not get database cursor: ' + repr(exp)) raise # Init Consent Record Object try: logger.info("Create ConsentRecord object") cr_entry = ConsentRecord(consent_id=consent_id) logger.info(cr_entry.log_entry) except Exception as exp: error_title = "Failed to create Consent Record object" logger.error(error_title + ": " + repr(exp)) raise else: logger.debug("ConsentRecord object: " + cr_entry.log_entry) # Get Consent Record from DB try: logger.info("Getting Consent Record from DB") cursor = cr_entry.from_db(cursor=cursor) except IndexError as exp: error_title = "Consent Record not found from DB with given ID" logger.error(error_title + ": " + repr(exp)) raise except Exception as exp: error_title = "Failed to fetch Consent Record from DB" logger.error(error_title + ": " + repr(exp)) raise else: logger.debug("cr_entry: " + cr_entry.log_entry) # Create Consent Status Record object try: logger.info("Creating Consent Status Record object") csr_entry = ConsentStatusRecord() except Exception as exp: error_title = "Failed to create Consent Status Record object" logger.error(error_title + ": " + repr(exp)) raise else: logger.debug("Consent Status Record object: " + csr_entry.log_entry) # Get Consent Status Record ID try: logger.info("Getting ID of last Consent Status Record") cursor, csr_id = get_last_csr_id(cursor=cursor, consent_id=consent_id, account_id=account_id, table_name=csr_entry.table_name) except IndexError as exp: error_title = "Consent Status Record not found from DB with given Consent Record ID" logger.error(error_title + ": " + repr(exp)) raise except Exception as exp: error_title = "Failed to get last Consent Status Record ID from database" logger.error(error_title + ": " + repr(exp)) raise else: logger.debug("Consent Status Record ID: " + str(csr_id)) # Append IDs to Consent Status Record Object try: logger.info("Appending IDs to Consent Status Record object") csr_entry.consent_status_record_id = csr_id csr_entry.accounts_id = account_id except Exception as exp: error_title = "Failed to append IDs to Consent Status Record object" logger.error(error_title + ": " + repr(exp)) raise else: logger.info("Appended IDs to Consent Status Record object: " + csr_entry.log_entry) # Get Consent Status Record from DB try: logger.info("Getting Consent Status Record from DB") cursor = csr_entry.from_db(cursor=cursor) except IndexError as exp: error_title = "Consent Status Record not found from DB with given ID" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=404, title=error_title, detail=repr(exp), source=endpoint) except Exception as exp: error_title = "Failed to fetch Consent Status Record from DB" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) else: logger.debug("Consent Status Record object: " + csr_entry.log_entry) return csr_entry.to_api_dict
def get_auth_token_data(sink_cr_object=None, endpoint="get_auth_token_data()"): if sink_cr_object is None: raise AttributeError("Provide sink_cr_object as parameter") # Get DB cursor try: cursor = get_db_cursor() except Exception as exp: logger.error('Could not get database cursor: ' + repr(exp)) raise # Get Sink's CR from DB try: logger.info("Get Sink's CR from DB") cursor = sink_cr_object.from_db(cursor=cursor) except Exception as exp: error_title = "Failed to fetch Sink's CR from DB" logger.error(error_title + ": " + repr(exp)) raise else: logger.debug("sink_cr_object: " + sink_cr_object.log_entry) # Get required id's from Sink's CR try: logger.info("Get required id's from Sink's CR") sink_slr_primary_key = str(sink_cr_object.service_link_records_id) except Exception as exp: error_title = "Failed to get id's from Sink's CR" logger.error(error_title + ": " + repr(exp)) raise else: logger.debug("sink_slr_primary_key: " + sink_slr_primary_key) # Init Source's Consent Record Object try: logger.info("Init Source's Consent Record Object") source_cr_entry = ConsentRecord( consent_pair_id=sink_cr_object.consent_id, accounts_id=sink_cr_object.accounts_id, role="Source") except Exception as exp: error_title = "Failed to create Source's Consent Record object" logger.error(error_title + ": " + repr(exp)) raise else: logger.debug("source_cr_entry: " + source_cr_entry.log_entry) # Get Source's Consent Record from DB try: logger.info("Get Source's Consent Record from DB") cursor = source_cr_entry.from_db(cursor=cursor) except Exception as exp: error_title = "Failed to fetch Source's CR from DB" logger.error(error_title + ": " + repr(exp)) raise else: logger.debug("source_cr_entry: " + source_cr_entry.log_entry) # Init Sink's Service Link Record Object try: logger.info("Init Sink's Service Link Record Object") sink_slr_entry = ServiceLinkRecord( id=sink_slr_primary_key, service_link_record_id=sink_cr_object.service_link_record_id) except Exception as exp: error_title = "Failed to create Source's Service Link Record object" logger.error(error_title + ": " + repr(exp)) raise else: logger.debug("sink_slr_entry: " + sink_slr_entry.log_entry) # Get Source's Consent Record from DB try: logger.info("Get Source's Consent Record from DB") cursor = sink_slr_entry.from_db(cursor=cursor) except Exception as exp: error_title = "Failed to fetch Sink's SLR from DB" logger.error(error_title + ": " + repr(exp)) raise else: logger.debug("sink_slr_entry: " + sink_slr_entry.log_entry) return source_cr_entry, sink_slr_entry
def get_auth_token_data(sink_cr_object=None, endpoint="get_auth_token_data()"): if sink_cr_object is None: raise AttributeError("Provide sink_cr_object as parameter") # Get DB cursor try: cursor = get_db_cursor() except Exception as exp: logger.error('Could not get database cursor: ' + repr(exp)) raise ApiError(code=500, title="Failed to get database cursor", detail=repr(exp), source=endpoint) # Get Sink's CR from DB try: cursor = sink_cr_object.from_db(cursor=cursor) except Exception as exp: error_title = "Failed to fetch Sink's CR from DB" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=404, title=error_title, detail=repr(exp), source=endpoint) finally: logger.debug("sink_cr_object: " + sink_cr_object.log_entry) # Get required id's from Sink's CR try: sink_rs_id = str(sink_cr_object.resource_set_id) sink_slr_primary_key = str(sink_cr_object.service_link_records_id) except Exception as exp: error_title = "Failed to get id's from Sink's CR" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) finally: logger.debug("sink_rs_id: " + sink_rs_id) # Init Source's Consent Record Object try: source_cr_entry = ConsentRecord(resource_set_id=sink_rs_id, role="Source") except Exception as exp: error_title = "Failed to create Source's Consent Record object" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) finally: logger.debug("source_cr_entry: " + source_cr_entry.log_entry) # Get Source's Consent Record from DB source_cr = {} try: cursor = source_cr_entry.from_db(cursor=cursor) source_cr = source_cr_entry.consent_record except Exception as exp: error_title = "Failed to fetch Source's CR from DB" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) finally: logger.debug("source_cr_entry: " + source_cr_entry.log_entry) logger.debug("source_cr: " + json.dumps(source_cr)) # Init Sink's Service Link Record Object try: sink_slr_entry = ServiceLinkRecord(id=sink_slr_primary_key) except Exception as exp: error_title = "Failed to create Source's Service Link Record object" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) finally: logger.debug("source_cr_entry: " + source_cr_entry.log_entry) # Get Source's Consent Record from DB sink_slr = {} try: cursor = sink_slr_entry.from_db(cursor=cursor) sink_slr = sink_slr_entry.service_link_record except Exception as exp: error_title = "Failed to fetch Sink's SLR from DB" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) finally: logger.debug("sink_slr_entry: " + sink_slr_entry.log_entry) logger.debug("sink_slr: " + json.dumps(sink_slr)) return source_cr, json.loads(sink_slr)
def add_csr(cr_id=None, csr_payload=None, endpoint="add_csr()"): if cr_id is None: raise AttributeError("Provide cr_id as parameter") if csr_payload is None: raise AttributeError("Provide csr_payload as parameter") ###### # Base information #### # Get DB cursor try: cursor = get_db_cursor() except Exception as exp: logger.error('Could not get database cursor: ' + repr(exp)) raise ApiError(code=500, title="Failed to get database cursor", detail=repr(exp), source=endpoint) # IDs from CSR payload try: logger.info("Fetching IDs from CSR payload") csr_surrogate_id = csr_payload['surrogate_id'] csr_cr_id = csr_payload['cr_id'] csr_prev_record_id = csr_payload['prev_record_id'] csr_record_id = csr_payload['record_id'] csr_consent_status = csr_payload['consent_status'] csr_issued = csr_payload['iat'] except Exception as exp: error_title = "Could not fetch IDs from CSR payload" logger.error(error_title) raise ApiError(code=400, title=error_title, detail=repr(exp), source=endpoint) else: logger.info("Fetched IDs from CSR payload") # Verify that cr_id and csr_cr_id are the same if cr_id != csr_cr_id: error_title = "cr_id from URI and cr_id from payload are not identical" logger.error(error_title + " | cr_id from URI: " + str(cr_id) + ", cr_id from payload: " + str(csr_cr_id)) raise ApiError(code=400, title=error_title, source=endpoint) else: logger.info("Identical IDs: cr_id from URI: " + str(cr_id) + ", cr_id from payload: " + str(csr_cr_id)) ###### # Account ID #### try: logger.info("Get Account ID by CSR_ID") account_id = get_account_id_by_cr(cr_id=cr_id, endpoint=endpoint) except Exception as exp: logger.error("Could not Account ID by CSR_ID: " + repr(exp)) raise else: logger.info("account_id: " + str(account_id)) ###### # Sign #### # Sign CSR try: logger.info("Sign CSR") csr_signed = sign_csr(account_id=account_id, payload=csr_payload, endpoint=endpoint) except Exception as exp: logger.error("Could not sign Source's CSR: " + repr(exp)) raise else: logger.info("Source CR signed") ########### # Entries # ########### # Existing Consent Record ### # Init Consent Record Object try: logger.info("Create ConsentRecord object") cr_entry = ConsentRecord(consent_id=cr_id) except Exception as exp: error_title = "Failed to create Consent Record object" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) else: logger.debug("sink_cr_entry: " + cr_entry.log_entry) # Get Consent Record from DB try: logger.info("Get Consent Record from DB") cursor = cr_entry.from_db(cursor=cursor) except IndexError as exp: error_title = "Consent Record not found from DB with given ID" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=404, title=error_title, detail=repr(exp), source=endpoint) except Exception as exp: error_title = "Failed to fetch Consent Record from DB" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) else: logger.debug("cr_entry: " + cr_entry.log_entry) # Get primary key of Consent Record database entry try: logger.info("Get primary key of Consent Record database entry") cr_entry_primary_key = cr_entry.id except Exception as exp: error_title = "Failed to get primary key of Consent Record database entry" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) else: logger.debug("cr_entry_primary_key: " + str(cr_entry_primary_key)) # CSR try: logger.info("Create ConsentStatusRecord object") csr_entry = ConsentStatusRecord( consent_status_record_id=csr_record_id, status=csr_consent_status, consent_status_record=csr_signed, consent_record_id=cr_id, issued_at=int(csr_issued), prev_record_id=csr_prev_record_id, consent_records_id=int(cr_entry_primary_key) ) except Exception as exp: error_title = "Failed to create Source's Consent Status Record object" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) else: logger.info("csr_entry: " + csr_entry.log_entry) ########### # Store # ########### # CSR # Get database table name for Consent Status Record try: logger.info("Get Consent Status Record table name") csr_table_name = csr_entry.table_name except Exception as exp: error_title = "Failed to get Consent Status Record table name" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) else: logger.info("Got Consent Status Record table name: " + str(csr_table_name)) # Store CSR try: logger.info("Store ConsentStatusRecord") try: cursor = csr_entry.to_db(cursor=cursor) except Exception as exp: error_title = "Failed to store Consent Status Record" logger.error(error_title + ": " + repr(exp)) raise ApiError(code=500, title=error_title, detail=repr(exp), source=endpoint) else: logger.debug("csr_entry: " + csr_entry.log_entry) # Commit db.connection.commit() except Exception as exp: logger.error('Consent Status Record Commit failed: ' + repr(exp)) db.connection.rollback() logger.error('--> rollback') raise else: logger.info("Consent Status Record commited") return csr_entry