class RFAIEventConsumer(EventConsumer): def __init__(self, net_id, ws_provider, ipfs_url, ipfs_port): self._ipfs_util = IPFSUtil(ipfs_url, ipfs_port) self._blockchain_util = BlockChainUtil("WS_PROVIDER", ws_provider) self._net_id = net_id def on_event(self, event): pass def _get_rfai_contract(self): base_contract_path = os.path.abspath( os.path.join(os.path.dirname(__file__), '..', '..', 'node_modules', 'singularitynet-rfai-contracts')) rfai_contract = self._blockchain_util.get_contract_instance( base_contract_path, "RFAI", self._net_id) return rfai_contract def _get_rfai_metadata_from_ipfs(self, ipfs_hash): return self._ipfs_util.read_file_from_ipfs(ipfs_hash) def _get_event_data(self, event): return eval(event['data']['json_str']) def _get_metadata_hash(self, metadata_uri): return metadata_uri.decode("utf-8") def _get_rfai_service_request_by_id(self, request_id): rfai_contract = self._get_rfai_contract() result = self._blockchain_util.call_contract_function( rfai_contract, "getServiceRequestById", request_id) return result
class OrganizationEventConsumer(EventConsumer): _connection = Repository(NETWORK_ID, NETWORKS=NETWORKS) _organization_repository = OrganizationRepository(_connection) _service_repository = ServiceRepository(_connection) def __init__(self, ws_provider, ipfs_url, ipfs_port): self._ipfs_util = IPFSUtil(ipfs_url, ipfs_port) self._blockchain_util = BlockChainUtil("WS_PROVIDER", ws_provider) self._s3_util = S3Util(S3_BUCKET_ACCESS_KEY, S3_BUCKET_SECRET_KEY) def on_event(self, event): pass def _push_asset_to_s3_using_hash(self, hash, org_id, service_id): io_bytes = self._ipfs_util.read_bytesio_from_ipfs( hash.lstrip("ipfs://")) filename = hash.split("/")[1] if service_id: s3_filename = ASSETS_PREFIX + "/" + org_id + "/" + service_id + "/" + filename else: s3_filename = ASSETS_PREFIX + "/" + org_id + "/" + filename new_url = self._s3_util.push_io_bytes_to_s3(s3_filename, ASSETS_BUCKET_NAME, io_bytes) return new_url def _get_new_assets_url(self, org_id, new_ipfs_data): new_assets_hash = new_ipfs_data.get('assets', {}) existing_assets_hash = {} existing_assets_url = {} existing_organization = self._organization_repository.get_organization( org_id) if existing_organization: existing_assets_hash = json.loads( existing_organization["assets_hash"]) existing_assets_url = json.loads( existing_organization["org_assets_url"]) new_assets_url_mapping = self._comapre_assets_and_push_to_s3( existing_assets_hash, new_assets_hash, existing_assets_url, org_id, "") return new_assets_url_mapping def _get_org_id_from_event(self, event): event_org_data = eval(event['data']['json_str']) org_id_bytes = event_org_data['orgId'] org_id = Web3.toText(org_id_bytes).rstrip("\x00") return org_id def _get_registry_contract(self): net_id = NETWORK_ID base_contract_path = os.path.abspath( os.path.join(os.path.dirname(__file__), '..', '..', 'node_modules', 'singularitynet-platform-contracts')) registry_contract = self._blockchain_util.get_contract_instance( base_contract_path, "REGISTRY", net_id) return registry_contract def _get_org_details_from_blockchain(self, event): logger.info(f"processing org event {event}") registry_contract = self._get_registry_contract() org_id = self._get_org_id_from_event(event) blockchain_org_data = registry_contract.functions.getOrganizationById( org_id.encode('utf-8')).call() org_metadata_uri = Web3.toText( blockchain_org_data[2]).rstrip("\x00").lstrip("ipfs://") ipfs_org_metadata = self._ipfs_util.read_file_from_ipfs( org_metadata_uri) return org_id, blockchain_org_data, ipfs_org_metadata, org_metadata_uri