"""Interface for the ows-product microservice.""" from oto import response from owsrequest import request as requests import sentry_sdk from ows_product_physical.constant import error from ows_product_physical.constant import service_name def is_user_entered_upc_available( user_entered_upc, vendor_id, subaccount_id): """Check if upc is available, based on display_upc flag.""" return is_display_upc_available( user_entered_upc, vendor_id, subaccount_id) def is_display_upc_available(display_upc, vendor_id, subaccount_id): """Check if display_upc is available. Args: display_upc (str): display_upc to check availability of. vendor_id (string|int): the vendor_id for this product. subaccount_id (string|int): the subaccount_id for this product. Returns: boolean: true if display_upc is available and false if it is not available """ if subaccount_id: account_type = 'subaccount' account_id = subaccount_id else: account_type = 'vendor' account_id = vendor_id display_upc_usage_response = requests.head( service_name.OWS_PRODUCT, ('/{account_type}/{account_id}/display_upc/{display_upc}/' 'available?context_type=physical').format( account_type=account_type, account_id=account_id, display_upc=display_upc)) return display_upc_usage_response.status_code == 200 def is_upc_available(upc): """Check if upc is available. Args: upc (int): upc to check availability of. Returns: boolean: true if upc is available and false if it is not available """ upc_usage_response = requests.head( service_name.OWS_PRODUCT, '/upc/{upc}'.format(upc=upc)) return upc_usage_response.status_code != 200 def check_product_ownership(product_id, account_type, account_id): """Check ownership of a product. Args: product_id: containing a unique identifier of a product id. account_type (str): account type (either “subaccount” or “vendor”). account_id (str): account id. Cannot be empty. Returns: response.Response: result of checking the ownership. """ try: product_ownership_response = requests.head( service_name.OWS_PRODUCT, '/{account_type}/{account_id}/product/{product_id}'.format( account_type=account_type, account_id=int(account_id), product_id=product_id)) except Exception as exception: sentry_sdk.capture_exception(exception) return response.create_error_response( code=error.INTERNAL_ERROR, message='connection error', status=500) return response.Response( message=product_ownership_response.status_code == 200) def generate_placeholder_upc(): """Generate a placeholder upc value. Returns: response.Response: placeholder upc value """ upc_response = requests.post(service_name.OWS_PRODUCT, '/upc/placeholder') if upc_response.status_code != 200: return response.create_error_response( code=error.INTERNAL_ERROR, message='error generating placeholder upc', status=500) placeholder_upc = upc_response.json().get('placeholder_upc') return response.Response(message=placeholder_upc) def get_product(product_id): """Get product. Args: product_id (int): id of product Returns: response.Response: json data or errors """ try: product_response = requests.get( service_name.OWS_PRODUCT, '/product/{}'.format(product_id)) except Exception as exception: sentry_sdk.capture_exception(exception) return response.create_error_response( code=error.INTERNAL_ERROR, message='error fetching product', status=500 ) if product_response.status_code != 200: return response.create_error_response( code=error.INTERNAL_ERROR, message='error fetching product', status=500 ) return response.Response(message=product_response.json()) def get_provisioned_upc(mark_used=False): """Retrieve a provisioned UPC. Args: mark_used (boolean): Tells ows-product to mark upc as used in DB Returns: response.Response: json containing upc or errors """ try: product_response = requests.post( service_name.OWS_PRODUCT, '/upc/provision', json={'mark_used': mark_used} ) except Exception as exception: sentry_sdk.capture_exception(exception) return response.create_error_response( code=error.INTERNAL_ERROR, message='Error fetching upc', status=500 ) if product_response.status_code != 200: return response.create_error_response( code=error.INTERNAL_ERROR, message='Error fetching upc', status=500 ) upc = product_response.json().get('upc') return response.Response(message=upc)