class EventListener(object): _connection = Repository(NETWORKS=NETWORKS) _event_repository = EventRepository(_connection) def __init__(self, repository=None): self.event_consumer_map = EventListener.initiate_event_subscription() def subscribe(self, event_names, event_consumer): for event in event_names: if event.get_name() in self.event_consumer_map: self.event_consumer_map[event] = event_consumer else: self.event_consumer_map[event] = [event_consumer] self.persist_event_subscription(event_names, event_consumer) @classmethod def initiate_event_subscription(cls): return EVENT_SUBSCRIPTIONS def _tranform_event_to_push(self, event): event['row_created'] = str(event['row_created']) event['row_updated'] = str(event['row_updated']) event['processed'] = 0 push_event = {"data": event, "name": event["event"]} return push_event def _get_listener_handler(self, listener): if listener["type"] == "webhook": return WebHookHandler(listener["url"]) elif listener["type"] == "lambda_arn": return LambdaArnHandler(listener["url"]) def _publish_events(self, events): error_map = {} success_list = [] for event in events: listeners = [] if event['event'] in self.event_consumer_map: listeners = self.event_consumer_map[event['event']] for listener in listeners: push_event = self._tranform_event_to_push(event) logger.debug(f"pushing events {push_event} to listener {listener['url']}") try: listener_handler = self._get_listener_handler(listener) listener_handler.push_event(push_event) except Exception as e: logger.exception( f"Error while processing event with error {str(e)} for event {event} listener {listener['url']}") error_map[event["row_id"]] = {"error_code": 500, "error_message": f"for listener {listener['url']} got error {str(e)}"} success_list.append(event["row_id"]) return error_map, success_list
def test_produce_mpe_events_from_blockchain(self, mock_get_current_block_no, mock_last_block_number, mock_get_contract_instance): mpe_event_producer = MPEEventProducer(infura_endpoint, Repository(NETWORKS)) event_repository = EventRepository(Repository(NETWORKS)) deposit_fund_Event_object = Mock() deposit_fund_Event_object.createFilter = Mock( return_value=Mock(get_all_entries=Mock(return_value=[AttributeDict( {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}), 'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18, 'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'), 'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C', 'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'), 'blockNumber': 6286405})]))) mock_last_block_number.return_value = 50 mock_get_current_block_no.return_value = 50 # Testing contract events mock_get_contract_instance.return_value = Mock( events=Mock(DepositFunds=deposit_fund_Event_object, abi=[{"type": "event", "name": "DepositFunds"}])) blockchain_events = mpe_event_producer.produce_event(3) assert blockchain_events == [AttributeDict( {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}), 'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18, 'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'), 'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C', 'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'), 'blockNumber': 6286405})] # Testing Airdrop events airdrop_event_producer = AirdropEventProducer(infura_endpoint, Repository(NETWORKS)) blockchain_events = airdrop_event_producer.produce_event(3) assert blockchain_events == [AttributeDict( {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}), 'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18, 'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'), 'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C', 'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'), 'blockNumber': 6286405})] # Testing Occam Airdrop events occam_airdrop_event_producer = OccamAirdropEventProducer(infura_endpoint, Repository(NETWORKS)) blockchain_events = occam_airdrop_event_producer.produce_event(3) assert blockchain_events == [AttributeDict( {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}), 'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18, 'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'), 'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C', 'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'), 'blockNumber': 6286405})]
def test_produce_registry_events_from_blockchain( self, mock_get_current_block_no, mock_last_block_number, mock_get_contract_instance): registry_event_producer = RegistryEventProducer( "wss://ropsten.infura.io/ws", Repository(NETWORKS)) org_created_event_object = Mock() event_repository = EventRepository(Repository(NETWORKS)) org_created_event_object.createFilter = Mock(return_value=Mock( get_all_entries=Mock(return_value=[ AttributeDict({ 'args': AttributeDict({ 'orgId': b'snet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' }), 'event': 'OrganizationCreated', 'logIndex': 1, 'transactionIndex': 15, 'transactionHash': HexBytes( '0x7934a42442792f6d5a171df218b66161021c885085187719c991ec58d7459821' ), 'address': '0x663422c6999Ff94933DBCb388623952CF2407F6f', 'blockHash': HexBytes( '0x1da77d63b7d57e0a667ffb9f6d23be92f3ffb5f4b27b39b86c5d75bb167d6779' ), 'blockNumber': 6243627 }) ]))) mock_get_contract_instance.return_value = Mock( events=Mock(organizationCreated=org_created_event_object, abi=[{ "type": "event", "name": "organizationCreated" }])) mock_last_block_number.return_value = 50 mock_get_current_block_no.return_value = 50 blockchain_events = registry_event_producer.produce_event(3) assert blockchain_events == [ AttributeDict({ 'args': AttributeDict({ 'orgId': b'snet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' }), 'event': 'OrganizationCreated', 'logIndex': 1, 'transactionIndex': 15, 'transactionHash': HexBytes( '0x7934a42442792f6d5a171df218b66161021c885085187719c991ec58d7459821' ), 'address': '0x663422c6999Ff94933DBCb388623952CF2407F6f', 'blockHash': HexBytes( '0x1da77d63b7d57e0a667ffb9f6d23be92f3ffb5f4b27b39b86c5d75bb167d6779' ), 'blockNumber': 6243627 }) ]
def __init__(self, ws_provider, repository=None, ): self._blockchain_util = BlockChainUtil("WS_PROVIDER", ws_provider) self._event_repository = EventRepository(repository)