From 152e2c1baa145fbd9ee10ea6a57016b1960f278a Mon Sep 17 00:00:00 2001 From: Matthew Tran Date: Wed, 12 Mar 2025 15:17:14 -0700 Subject: [PATCH 1/2] Error Handling added --- backend/routers/v1/inventory.py | 139 ++++++++++++++++++++++++++++++-- 1 file changed, 131 insertions(+), 8 deletions(-) diff --git a/backend/routers/v1/inventory.py b/backend/routers/v1/inventory.py index e4a643f..cf33a5a 100644 --- a/backend/routers/v1/inventory.py +++ b/backend/routers/v1/inventory.py @@ -9,7 +9,7 @@ All routes are prefixed with /api/v1/inventory """ -from fastapi import APIRouter +from fastapi import APIRouter, HTTPException from models.snack import ( Snack, SnackCreateSchema, @@ -28,22 +28,145 @@ @router.get("/", response_model=InventoryResponse) async def get_inventory_route(): - snacks = get_inventory() - return { "snacks": snacks } + try: + snacks = get_inventory() + if not snacks: + raise HTTPException(status_code=404, details= { + "error": { + "code": "SNACKS_NOT_FOUND", + "message": "No snacks found in the inventory" + } + }) + return { "snacks": snacks } + except Exception as e: + raise HTTPException(status_code=500, detail= + { + "error": { + "code": "INTERNAL_SERVER_ERROR", + "message": "An internal error occured", + } + } + ) + @router.get("/snacks/{sku}", response_model=Snack) async def get_snack_route(sku: str): - snack = get_snack(sku) - return snack + #check duplicate entry (i dont think this even needs to be here LOL) + try: + #check input validation (UPDATE THIS WHEN WE HAVE VALIDATION) + if not sku: + raise HTTPException(status_code=400, details={ + "error": { + "code": "INVALID_SKU", + "message": "SKU does not exist" + } + }) + snack = get_snack(sku) + #check if snack exists + if not snack: + raise HTTPException(status_code=404, details= { + "error": { + "code": "SNACK_NOT_FOUND", + "message": "Snack with SKU {sku} not found" + } + }) + return snack + #check for internal server error + except Exception as e: + raise HTTPException(status_code=500, detail= + { + "error": { + "code": "INTERNAL_SERVER_ERROR", + "message": "An internal error occured", + } + }) @router.post("/snacks", response_model=Snack) async def create_snack_route(snack: SnackCreateSchema): - return create_snack(snack) + #check input validation (UPDATE THIS WHEN WE HAVE VALIDATION) + #check duplicate entry (no method yet) + try: + snack = create_snack(snack) + #check if snack exists + if not snack: + raise HTTPException(status_code=400, details= { + "error": { + "code": "SNACK_NOT_CREATED", + "message": "Snack could not be created" + } + }) + return snack + #check for internal server error + except Exception as e: + raise HTTPException(status_code=500, detail= + { + "error": { + "code": "INTERNAL_SERVER_ERROR", + "message": "An internal error occured", + } + }) @router.put("/snacks/{sku}", response_model=Snack) async def update_snack_route(sku: str, updates: SnackUpdateSchema): - return update_snack(sku, updates) + #check duplicate entry (no method yet) + try: + #check input validation (UPDATE THIS WHEN WE HAVE VALIDATION) + if not sku: + raise HTTPException(status_code=400, details={ + "error": { + "code": "INVALID_SKU", + "message": "SKU does not exist" + } + }) + + updated = update_snack(sku, updates) + #check if snack exists + if not updated: + raise HTTPException(status_code=404, details= { + "error": { + "code": "SNACK_NOT_FOUND", + "message": "Snack with SKU {sku} not found" + } + }) + return updated + #check for internal server error + except Exception as e: + raise HTTPException(status_code=500, detail= + { + "error": { + "code": "INTERNAL_SERVER_ERROR", + "message": "An internal error occured", + } + }) @router.delete("/snacks/{sku}", response_model=Snack) async def delete_snack_route(sku: str): - return delete_snack(sku) \ No newline at end of file + #check duplicate entry (no method yet) + try: + #check input validation (UPDATE THIS WHEN WE HAVE VALIDATION) + if not sku: + raise HTTPException(status_code=400, details={ + "error": { + "code": "INVALID_SKU", + "message": "SKU does not exist" + } + }) + snack = delete_snack(sku) + #check if snack exists + if not snack: + raise HTTPException(status_code=404, details= { + "error": { + "code": "SNACK_NOT_FOUND", + "message": "Snack with SKU {sku} not found" + } + }) + return snack + #check for internal server error + except Exception as e: + raise HTTPException(status_code=500, detail= + { + "error": { + "code": "INTERNAL_SERVER_ERROR", + "message": "An internal error occured", + } + }) \ No newline at end of file From 408048ede58c53be5d5c79e2363920029641ae0d Mon Sep 17 00:00:00 2001 From: Matthew Tran Date: Wed, 12 Mar 2025 17:16:33 -0700 Subject: [PATCH 2/2] reduced redundant code --- backend/routers/v1/inventory.py | 121 ++++++++++---------------------- 1 file changed, 37 insertions(+), 84 deletions(-) diff --git a/backend/routers/v1/inventory.py b/backend/routers/v1/inventory.py index cf33a5a..c853820 100644 --- a/backend/routers/v1/inventory.py +++ b/backend/routers/v1/inventory.py @@ -24,6 +24,30 @@ update_snack ) +def raise_internal_error(): + raise HTTPException(status_code=500, detail= + { + "error": { + "code": "INTERNAL_SERVER_ERROR", + "message": "An internal error occured", + } + }) +def raise_not_found_error(): + raise HTTPException(status_code=404, detail= + { + "error": { + "code": "NOT_FOUND", + "message": "Resource not found", + } + }) +def raise_bad_request_error(): + raise HTTPException(status_code=400, detail= + { + "error": { + "code": "INVALID INPUT", + "message": "The Response Model or SKU is invalid", + } + }) router = APIRouter() @router.get("/", response_model=InventoryResponse) @@ -31,22 +55,10 @@ async def get_inventory_route(): try: snacks = get_inventory() if not snacks: - raise HTTPException(status_code=404, details= { - "error": { - "code": "SNACKS_NOT_FOUND", - "message": "No snacks found in the inventory" - } - }) + raise_not_found_error() return { "snacks": snacks } except Exception as e: - raise HTTPException(status_code=500, detail= - { - "error": { - "code": "INTERNAL_SERVER_ERROR", - "message": "An internal error occured", - } - } - ) + raise_internal_error() @router.get("/snacks/{sku}", response_model=Snack) @@ -55,31 +67,15 @@ async def get_snack_route(sku: str): try: #check input validation (UPDATE THIS WHEN WE HAVE VALIDATION) if not sku: - raise HTTPException(status_code=400, details={ - "error": { - "code": "INVALID_SKU", - "message": "SKU does not exist" - } - }) + raise_bad_request_error() snack = get_snack(sku) #check if snack exists if not snack: - raise HTTPException(status_code=404, details= { - "error": { - "code": "SNACK_NOT_FOUND", - "message": "Snack with SKU {sku} not found" - } - }) + raise_not_found_error() return snack #check for internal server error except Exception as e: - raise HTTPException(status_code=500, detail= - { - "error": { - "code": "INTERNAL_SERVER_ERROR", - "message": "An internal error occured", - } - }) + raise_internal_error() @router.post("/snacks", response_model=Snack) async def create_snack_route(snack: SnackCreateSchema): @@ -89,22 +85,11 @@ async def create_snack_route(snack: SnackCreateSchema): snack = create_snack(snack) #check if snack exists if not snack: - raise HTTPException(status_code=400, details= { - "error": { - "code": "SNACK_NOT_CREATED", - "message": "Snack could not be created" - } - }) + raise_bad_request_error() return snack #check for internal server error except Exception as e: - raise HTTPException(status_code=500, detail= - { - "error": { - "code": "INTERNAL_SERVER_ERROR", - "message": "An internal error occured", - } - }) + raise_internal_error() @router.put("/snacks/{sku}", response_model=Snack) async def update_snack_route(sku: str, updates: SnackUpdateSchema): @@ -112,32 +97,16 @@ async def update_snack_route(sku: str, updates: SnackUpdateSchema): try: #check input validation (UPDATE THIS WHEN WE HAVE VALIDATION) if not sku: - raise HTTPException(status_code=400, details={ - "error": { - "code": "INVALID_SKU", - "message": "SKU does not exist" - } - }) + raise_bad_request_error() updated = update_snack(sku, updates) #check if snack exists if not updated: - raise HTTPException(status_code=404, details= { - "error": { - "code": "SNACK_NOT_FOUND", - "message": "Snack with SKU {sku} not found" - } - }) + raise_not_found_error() return updated #check for internal server error except Exception as e: - raise HTTPException(status_code=500, detail= - { - "error": { - "code": "INTERNAL_SERVER_ERROR", - "message": "An internal error occured", - } - }) + raise_internal_error() @router.delete("/snacks/{sku}", response_model=Snack) async def delete_snack_route(sku: str): @@ -145,28 +114,12 @@ async def delete_snack_route(sku: str): try: #check input validation (UPDATE THIS WHEN WE HAVE VALIDATION) if not sku: - raise HTTPException(status_code=400, details={ - "error": { - "code": "INVALID_SKU", - "message": "SKU does not exist" - } - }) + raise_bad_request_error() snack = delete_snack(sku) #check if snack exists if not snack: - raise HTTPException(status_code=404, details= { - "error": { - "code": "SNACK_NOT_FOUND", - "message": "Snack with SKU {sku} not found" - } - }) + raise_not_found_error() return snack #check for internal server error except Exception as e: - raise HTTPException(status_code=500, detail= - { - "error": { - "code": "INTERNAL_SERVER_ERROR", - "message": "An internal error occured", - } - }) \ No newline at end of file + raise_internal_error() \ No newline at end of file