diff --git a/app.py b/app.py index 75b5cd2..d651b95 100644 --- a/app.py +++ b/app.py @@ -1,7 +1,12 @@ import os -from flask import Flask, request, json, abort +from flask import Flask, request, json, abort, jsonify from flask_cors import CORS +class InsufficientInventoryError(Exception): + def __init__(self, message, product_id=None): + super().__init__(message) + self.product_id = product_id + import sentry_sdk from sentry_sdk.integrations.flask import FlaskIntegration @@ -30,21 +35,37 @@ def unhandled_exception(): obj['keyDoesntExist'] Inventory = { - 'wrench': 1, - 'nails': 1, - 'hammer': 1 + 'wrench': 10, + 'nails': 100, + 'hammer': 5, + '1': 20, # Snake Plant + '2': 15, # Monstera + '3': 10, # ZZ Plant + '4': 2, # Botana Voice + '5': 8 # Ficus } -def process_order(cart): +def process_order(cart_items, cart_quantities): global Inventory - tempInventory = Inventory - for item in cart: - if Inventory[item['id']] <= 0: - raise Exception("Not enough inventory for " + item['id']) - else: - tempInventory[item['id']] -= 1 - print 'Success: ' + item['id'] + ' was purchased, remaining stock is ' + str(tempInventory[item['id']]) - Inventory = tempInventory + tempInventory = Inventory.copy() + for item_in_cart in cart_items: + product_id = str(item_in_cart['id']) + if product_id not in tempInventory: + raise ValueError(f"Product ID '{product_id}' not found.") + + requested_quantity = cart_quantities.get(product_id) + if not isinstance(requested_quantity, int) or requested_quantity <= 0: + raise ValueError(f"Invalid quantity for product ID '{product_id}'.") + + available_stock = tempInventory[product_id] + if available_stock < requested_quantity: + raise InsufficientInventoryError( + f"Not enough inventory for product ID '{product_id}'.", product_id=product_id) + + tempInventory[product_id] -= requested_quantity + print(f"Success: {product_id} was purchased, quantity: {requested_quantity}, remaining stock: {tempInventory[product_id]}") + + Inventory = tempInventory @app.before_request def sentry_event_context(): @@ -65,11 +86,25 @@ def sentry_event_context(): @app.route('/checkout', methods=['POST']) def checkout(): - - order = json.loads(request.data) - print "Processing order for: " + order["email"] - cart = order["cart"] - - process_order(cart) - - return 'Success' + try: + order_data = json.loads(request.data) + print("Processing order for: " + order_data.get("email", "unknown")) + + cart = order_data.get("cart", {}) + cart_items = cart.get("items", []) + cart_quantities = cart.get("quantities", {}) + + process_order(cart_items, cart_quantities) + return jsonify({"message": "Order successful"}), 200 + except InsufficientInventoryError as e: + return jsonify({ + "error": "InsufficientInventory", + "message": str(e), + "product_id": e.product_id + }), 409 # Use 409 Conflict + except ValueError as e: + return jsonify({"error": "BadRequest", "message": str(e)}), 400 # Use 400 Bad Request + except Exception as e: + # Fallback for unexpected errors + sentry_sdk.capture_exception(e) + return jsonify({"error": "InternalServerError", "message": "An unexpected error occurred."}), 500