def create_cart():
    try:
        response = requests.post(config.endpoints.carts)
    except Exception:
        raise exceptions.StorageServerError()
    if response.status_code == 201:
        return response.json()['cart_id']
    else:
        raise exceptions.StorageServerError()
def cancel_cart(cart_id):
    try:
        response = requests.delete(config.endpoints.cart + cart_id)
    except Exception:
        raise exceptions.StorageServerError()
    if response.status_code == 404:
        raise exceptions.CartNotFoundException
    elif response.status_code == 200:
        return response.json()
    else:
        raise exceptions.StorageServerError()
def add_item_to_cart(cart_id, item_id):
    try:
        response = requests.post(config.endpoints.cart + cart_id + '/items/' + item_id)
    except Exception:
        raise exceptions.StorageServerError()
    if response.status_code == 404:
        raise exceptions.CartOrItemNotFoundException(response.json['message'])
    elif response.status_code == 200:
        return response.json()
    else:
        raise exceptions.StorageServerError()
 def checkout(self):
     to_charge = self.apply_discount()
     try:
         response = requests.put(config.endpoints.cart + self._cart_id, json={'status': 'Checked out',
                                                                                   'payment_method': self._payment_method,
                                                                                   'total_amount': to_charge,
                                                                                   'username': self._cart_db['username']})
     except Exception:
         raise exceptions.StorageServerError()
     # Esto también podría ejecutarse en un thread separado ya que ya se le cobró al cliente...
     if response.status_code == 200:
         email_service.send_email("You sold!", "A new " + self._payment_method + " transaction was made.")
         return response.json()
     else:
         # Haría rollback del cobro con la pasarela
         raise exceptions.StorageServerError()
def create_item(**params):
    try:
        response = requests.post(config.endpoints.items, json=params)
    except Exception:
        raise exceptions.StorageServerError
    if response.status_code == 400:
        raise exceptions.ItemAlreadyExists
    elif response.status_code == 201:
        email_service.send_email("New Item created", "A new Item has been created")
        return response.json()['item_id']
    raise exceptions.StorageServerError()
def update_item(item_id, token, **params):
    if user_service.valid_admin(token):
        previous_item = get_item(item_id)
        try:
            response = requests.put(config.endpoints.item + item_id, json=params)
        except Exception:
            raise exceptions.StorageServerError
        if response.status_code == 404:
            raise exceptions.ItemNotFoundException()
        elif response.status_code == 400:
            raise exceptions.BadRequest(response.text)
        elif response.status_code == 200:
            item_updated = response.json()
            if item_updated['price'] != previous_item['price']:
                email_service.send_email("New Price!", "The new price for " + item_updated['name'] + " is " +
                                                str(item_updated['price']))
            return item_updated
        else:
            raise exceptions.StorageServerError()
    else:
        raise exceptions.NotAnAdmin()