Skip to content

Instantly share code, notes, and snippets.

@carlosbelisario
Created April 20, 2018 21:20
Show Gist options
  • Save carlosbelisario/735391b0a41f25c1a6dd851bde01055e to your computer and use it in GitHub Desktop.
Save carlosbelisario/735391b0a41f25c1a6dd851bde01055e to your computer and use it in GitHub Desktop.
primer objeto serio hecho en python XD
import json
import requests
import time
class RenovationValidatorConsumer:
END_POINT = "/services/renovator/validate?api_version=v1.0&region=mexico"
REQUIRED_PARAMETERS = ['platform', 'user', 'payment_method', 'purchase', 'origin', 'employed_id', 'action']
def __init__(self, config, logger):
self.config = config
self.logger = logger
self.headers = {'Content-type': 'text/json; charset=utf-8'}
self.connection_wait = float(config.get('consume', 'connectionWait'))
self.response_wait = float(config.get('consume', 'responseWait'))
self.sleep_on_failure = float(config.get('consume', 'sleepOnFailure'))
def message_params_validation(self, params):
return sorted(params) == sorted(self.REQUIRED_PARAMETERS)
def doAction(self, body):
self.logger.info(body)
message = json.loads(body)
while True:
keys = message.keys()
if (self.message_params_validation(keys)) is False:
self.logger.error("PARAMETER ERROR IN MESSAGE: \""
+ ', '.join(keys)
+ '\" REQUIRED: \"' + ', '.join(self.REQUIRED_PARAMETERS) + '\"'
)
self.logger.info("message discarded for invalid parameter")
print 'discard'
break
try:
server_response = self.call_api(message)
response = server_response.json()
if server_response.status_code != 200:
if self.is_not_disposable_response(response):
raise Exception("api_validation_invalid_response")
string_error = "discarded message for api response code: " + str(response['errors'][0]['code'])
self.logger.info(string_error)
except Exception as e:
self.logger.error("ERROR PROCESSING MESSAGE: " \
+ e.message + " Waiting to RETRY: " \
+ str(self.sleep_on_failure) + " secs"
)
self.logger.error(e)
print 'not process'
time.sleep(self.sleep_on_failure)
print 'process'
break
def call_api(self, message):
uri = self.config.get('consume', 'api_url') + self.END_POINT
params = self.build_params(message)
return requests.post(uri, data=params, timeout=(self.connection_wait, self.response_wait))
def build_params(self, message):
params = {}
for key in message:
if isinstance((message[key]), dict):
value = json.dumps(message[key])
else:
value = message[key]
params[key] = value
return params
def is_not_disposable_response(self, response):
return isinstance(response, dict) is False \
or 'errors' in response is not True \
or str(response['errors'][0]['message']).__contains__('timeout')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment