request_messenger.py (5896B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\plex\client\message_bus\request_messenger.py 2 import logging 3 from six.moves import http_client as httplib 4 from eveProto.generated.eve_public.plex.vault.api.requests_pb2 import BalanceRequest, BalanceResponse 5 from eveProto.generated.eve_public.plex.vault.transaction.api.requests_pb2 import GetAllLoggedForUserRequest, GetAllLoggedForUserResponse, GetLogRequest, GetLogResponse, GetStatisticsRequest, GetStatisticsResponse 6 from plex.client.api.errors import ServiceUnavailableError, GenericNotFoundError, GenericInternalServerError, GenericError 7 from plex.client.model.transaction_statistics import TransactionStatistics 8 from plex.common.const import LOGGER_NAME 9 from plex.client.model.transaction_identifier import TransactionIdentifier 10 from plex.client.model.transaction_attributes import TransactionAttributes 11 from plex.client.model.invoice_identifier import InvoiceIdentifier 12 from plex.client.model.invoice_attributes import InvoiceAttributes 13 from publicGateway.gateway import PublicGateway 14 from stackless_response_router.exceptions import TimeoutException, UnpackException 15 logger = logging.getLogger(LOGGER_NAME) 16 17 class PublicPlexRequestMessenger(object): 18 19 def __init__(self, public_gateway): 20 self.public_gateway = public_gateway 21 22 def get_all_logged_request(self): 23 request = GetAllLoggedForUserRequest() 24 info_log = 'Request: Get All PLEX Transaction Logs: {request}\n'.format(request=request) 25 status_code, payload = self._send_request(request, response_class=GetAllLoggedForUserResponse, info_log=info_log) 26 if status_code == httplib.OK: 27 info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload) 28 transaction_identifiers = [ TransactionIdentifier.from_proto(x) for x in payload.transactions ] 29 info_log += 'Returning: {count} transactions\n'.format(count=len(transaction_identifiers)) 30 logger.info(info_log) 31 return transaction_identifiers 32 self._raise_error_and_log(info_log, status_code) 33 34 def get_log_request(self, transaction_id): 35 request = GetLogRequest(identifier=TransactionIdentifier.to_proto(transaction_id)) 36 info_log = 'Request: Get Transaction Log: {request}\n'.format(request=request) 37 status_code, payload = self._send_request(request, response_class=GetLogResponse, info_log=info_log) 38 if status_code == httplib.OK: 39 info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload) 40 transaction_attributes = TransactionAttributes.from_proto(payload.transaction) 41 invoice_identifier = None 42 invoice_attributes = None 43 if payload.HasField('invoice_entry'): 44 invoice_identifier = InvoiceIdentifier.from_proto(payload.invoice_entry.id) 45 invoice_attributes = InvoiceAttributes.from_proto(payload.invoice_entry.attributes) 46 info_log += 'Returning: transaction {t_data}, invoice id {i_id}, data {i_data}\n'.format(t_data=transaction_attributes, i_id=invoice_identifier, i_data=invoice_attributes) 47 logger.info(info_log) 48 return (transaction_attributes, invoice_identifier, invoice_attributes) 49 self._raise_error_and_log(info_log, status_code) 50 51 def get_balance_request(self): 52 request = BalanceRequest() 53 info_log = 'Request: Get PLEX balance: {request}\n'.format(request=request) 54 status_code, payload = self._send_request(request, response_class=BalanceResponse, info_log=info_log) 55 if status_code == httplib.OK: 56 info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload) 57 balance_in_cents = payload.balance.total_in_cents 58 info_log += 'Returning: {balance_in_cents} (PLEX cents)\n'.format(balance_in_cents=balance_in_cents) 59 logger.info(info_log) 60 return payload.balance.total_in_cents 61 self._raise_error_and_log(info_log, status_code) 62 63 def get_statistics_request(self): 64 request = GetStatisticsRequest() 65 info_log = 'Request: Get PLEX transaction statistics\n' 66 status_code, payload = self._send_request(request, response_class=GetStatisticsResponse, info_log=info_log) 67 if status_code == httplib.OK: 68 info_log += 'SUCCESS, payload: {payload}\n'.format(payload=payload) 69 statistics = TransactionStatistics.from_proto(payload) 70 info_log += 'Returning: {stats}\n'.format(stats=statistics) 71 logger.info(info_log) 72 return statistics 73 self._raise_error_and_log(info_log, status_code) 74 75 def _send_request(self, request, response_class, info_log, timeout_seconds = 10, max_attempts = 1): 76 try: 77 response_primitive, response = self.public_gateway.send_blocking_user_request_and_receive_response(request_payload=request, expected_response_class=response_class, timeout_seconds=timeout_seconds, max_attempts=max_attempts, retry_delay_in_seconds=1) 78 except (TimeoutException, UnpackException) as exc: 79 error_info = 'ERROR: %s' % exc.__class__.__name__ 80 info_log += error_info 81 logger.info(info_log) 82 request_cls = request.__class__.__name__ 83 raise ServiceUnavailableError('%s, Failed to receive response from %s: %s' % (error_info, request_cls, exc)) 84 85 return (response_primitive.status_code, response) 86 87 @staticmethod 88 def _raise_error_and_log(info_text, status_code): 89 info_text += 'ERROR: %s(%s)\n' % (httplib.responses[status_code], status_code) 90 logger.info(info_text) 91 if status_code == httplib.NOT_FOUND: 92 raise GenericNotFoundError(info_text) 93 if status_code == httplib.INTERNAL_SERVER_ERROR: 94 raise GenericInternalServerError(info_text) 95 raise GenericError(info_text)