"""UPC Provisioner model.""" from flask import g from oto import response from sentry_sdk import capture_exception from vector_utils.aws_utils import sqs from product import config from product.connectors import mysql SET_UPC_TO_USED = """ update upcs set status = 'used' where upc = :upc and status = 'claimed' """ class UPCProvisioner: """UPC Provisioner class.""" def __init__(self): """Set the queue name this upc provisioner uses.""" self._queue_name = config.SQS_QUEUE_NAME @property def queue_name(self): """The queue name this UPC Provisioner will be using.""" return self._queue_name def retrieve_upc(): """Retrieves and deletes upc off the sqs queue.""" upc_provisioner = UPCProvisioner() try: upc_message = _retrieve_upc_from_sqs(upc_provisioner.queue_name) if len(upc_message) == 0: return response.create_not_found_response() _delete_message_from_sqs(upc_provisioner.queue_name, upc_message) except Exception as exception: capture_exception(exception) return response.create_fatal_response(message="Unable to retrieve UPC") return response.Response(message={"upc": upc_message[0]["Body"]}) def _retrieve_upc_from_sqs(queue_name): """Access sqs queue to retrieve a UPC.""" messages = sqs.get_messages_from_sqs(queue_name) return messages def _delete_message_from_sqs(queue_name, upc_message): """Deletes the relevant message off this upc provisioner's queue.""" receipt_handle = [] receipt_handle.append(upc_message[0]["ReceiptHandle"]) sqs.delete_messages_from_sqs(queue_name, receipt_handle) def set_claimed_upc_to_used(upc): """ Updates upc status in upcs table to 'used'. Args: upc (int): UPC value Returns: int: number of rows updated """ with mysql.db_session() as session: result = session.execute(SET_UPC_TO_USED, {"upc": upc}) return result.rowcount def log_upc_status_info(): """Log info on UPC status.""" g.ows.log.info("Could not set claimed UPC as used")