Skip to content

Commit

Permalink
update main file to use repo methods
Browse files Browse the repository at this point in the history
  • Loading branch information
JoaoVitorBranco committed Aug 4, 2023
1 parent be0096e commit d6a1617
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 77 deletions.
22 changes: 18 additions & 4 deletions src/app/entities/item.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def __init__(self, name: str=None, price: float=None, item_type: ItemTypeEnum=No
self.admin_permission = admin_permission

@staticmethod
def validate_name(name: str) -> Tuple[float, str]:
def validate_name(name: str) -> Tuple[bool, str]:
if name is None:
return (False, "Name is required")
if type(name) != str:
Expand All @@ -41,7 +41,7 @@ def validate_name(name: str) -> Tuple[float, str]:
return (True, "")

@staticmethod
def validate_price(price: float) -> Tuple[float, str]:
def validate_price(price: float) -> Tuple[bool, str]:
if price is None:
return (False, "Price is required")
if type(price) != float:
Expand All @@ -51,21 +51,35 @@ def validate_price(price: float) -> Tuple[float, str]:
return (True, "")

@staticmethod
def validate_item_type(item_type: ItemTypeEnum) -> Tuple[float, str]:
def validate_item_type(item_type: ItemTypeEnum) -> Tuple[bool, str]:
if item_type is None:
return (False, "Item type is required")
if type(item_type) != ItemTypeEnum:
return (False, "Item type must be a ItemTypeEnum")
return (True, "")

@staticmethod
def validate_admin_permission(admin_permission: bool) -> Tuple[float, str]:
def validate_admin_permission(admin_permission: bool) -> Tuple[bool, str]:
if admin_permission is None:
return (False, "Admin permission is required")
if type(admin_permission) != bool:
return (False, "Admin permission must be a boolean")
return (True, "")

@staticmethod
def validate_item_id(item_id: int) -> Tuple[bool, str]:
if item_id is None:
return (False, "Missing 'item_id' parameter")

if type(item_id) != int:
return (False, "Parameter 'item_id' must be an integer")

if item_id < 0:
return (False, "Parameter 'item_id' must be a positive integer")

return (True, "")


def to_dict(self):
return {
"name": self.name,
Expand Down
25 changes: 25 additions & 0 deletions src/app/environments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

from enum import Enum

from .errors.environment_errors import EnvironmentNotFound

from .repo.item_repository_interface import IItemRepository


class REPO(Enum):
MOCK = "MOCK"

class Environments:
"""
This is an abstraction of "Environments" to simplify the concept. The environments are hardcoded in this class.
"""
repo: REPO = REPO.MOCK
@staticmethod
def get_item_repo() -> IItemRepository:
if Environments.repo == REPO.MOCK:
from .repo.item_repository_mock import ItemRepositoryMock
return ItemRepositoryMock
else:
raise EnvironmentNotFound("REPO")


6 changes: 6 additions & 0 deletions src/app/errors/environment_errors.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from .base_error import BaseError


class EnvironmentNotFound(BaseError):
def __init__(self, env: str, message: str):
super().__init__(f'The environment {env} is wrong')
97 changes: 41 additions & 56 deletions src/app/main.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
from fastapi import FastAPI, HTTPException
from mangum import Mangum

from .environments import Environments

from .repo.item_repository_mock import ItemRepositoryMock

from .errors.entity_errors import ParamNotValidated

from .enums.item_type_enum import ItemTypeEnum
Expand All @@ -10,30 +14,19 @@

app = FastAPI()

items = {
1: Item(name="Barbie", price=48.90, item_type=ItemTypeEnum.TOY, admin_permission=False),
2: Item(name="Hamburguer", price=38.00, item_type=ItemTypeEnum.FOOD, admin_permission=False),
3: Item(name="T-shirt", price=22.95, item_type=ItemTypeEnum.CLOTHES, admin_permission=False),
4: Item(name="Super Mario Bros", price=55.00, item_type=ItemTypeEnum.GAMES, admin_permission=True)
}

# TODO: Implement my logic here to handle the requests from SimpleFastAPI
repo = Environments.get_item_repo()()

@app.get("/items/get_all_items")
def get_all_items():
global items
return items
return repo.get_all_items()

@app.get("/items/{item_id}")
def get_item(item_id: int):
if item_id is None:
raise HTTPException(status_code=400, detail="Missing 'item_id' parameter")

if type(item_id) != int:
raise HTTPException(status_code=400, detail="Parameter 'item_id' must be an integer")
validation_item_id = Item.validate_item_id(item_id=item_id)
if not validation_item_id[0]:
raise HTTPException(status_code=400, detail=validation_item_id[1])

global items
item = items.get(item_id)
item = repo.get_item(item_id)

if item is None:
raise HTTPException(status_code=404, detail="Item Not found")
Expand All @@ -46,14 +39,14 @@ def get_item(item_id: int):
@app.post("/items/create_item", status_code=201)
def create_item(request: dict):
item_id = request.get("item_id")
if item_id is None:
raise HTTPException(status_code=400, detail="Missing 'item_id' parameter")

if type(item_id) != int:
raise HTTPException(status_code=400, detail="Parameter 'item_id' must be an integer")

if item_id < 0:
raise HTTPException(status_code=400, detail="Parameter 'item_id' must be a positive integer")
validation_item_id = Item.validate_item_id(item_id=item_id)
if not validation_item_id[0]:
raise HTTPException(status_code=400, detail=validation_item_id[1])

item = repo.get_item(item_id)
if item is not None:
raise HTTPException(status_code=409, detail="Item already exists")

name = request.get("name")
price = request.get("price")
Expand All @@ -72,48 +65,44 @@ def create_item(request: dict):
except ParamNotValidated as err:
raise HTTPException(status_code=400, detail=err.message)

items[item_id] = item
item_response = repo.create_item(item, item_id)
return {
"item_id": item_id,
"item": item.to_dict()
"item": item_response.to_dict()
}

@app.delete("/items/delete_item")
def delete_item(request: dict):
item_id = request.get("item_id")
if item_id is None:
raise HTTPException(status_code=400, detail="Missing 'item_id' parameter")

if type(item_id) != int:
raise HTTPException(status_code=400, detail="Parameter 'item_id' must be an integer")

global items
item = items.get(item_id)
validation_item_id = Item.validate_item_id(item_id=item_id)
if not validation_item_id[0]:
raise HTTPException(status_code=400, detail=validation_item_id[1])

item = repo.get_item(item_id)

if item is None:
raise HTTPException(status_code=404, detail="Item Not found")

if item.admin_permission == True:
raise HTTPException(status_code=403, detail="Item Not found")

items.pop(item_id)
item_deleted = repo.delete_item(item_id)

return {
"item_id": item_id,
"item": item.to_dict()
"item": item_deleted.to_dict()
}

@app.put("/items/update_item")
def update_item(request: dict):
item_id = request.get("item_id")
if item_id is None:
raise HTTPException(status_code=400, detail="Missing 'item_id' parameter")

if type(item_id) != int:
raise HTTPException(status_code=400, detail="Parameter 'item_id' must be an integer")

global items
item = items.get(item_id)
validation_item_id = Item.validate_item_id(item_id=item_id)
if not validation_item_id[0]:
raise HTTPException(status_code=400, detail=validation_item_id[1])

item = repo.get_item(item_id)

if item is None:
raise HTTPException(status_code=404, detail="Item Not found")
Expand All @@ -123,27 +112,23 @@ def update_item(request: dict):

name = request.get("name")
price = request.get("price")
item_type = request.get("item_type")
admin_permission = request.get("admin_permission")

if name == None and price == None and item_type == None and admin_permission == None:
raise HTTPException(status_code=400, detail="Missing parameters")
if name != None:
items[item_id].name = name
if price != None:
items[item_id].price = price
if item_type != None:
if type(item_type) != str:
item_type_value = request.get("item_type")
if item_type_value != None:
if type(item_type_value) != str:
raise HTTPException(status_code=400, detail="Item type must be a string")
if item_type not in [possible_type.value for possible_type in ItemTypeEnum]:
if item_type_value not in [possible_type.value for possible_type in ItemTypeEnum]:
raise HTTPException(status_code=400, detail="Item type is not a valid one")
items[item_id].item_type = ItemTypeEnum[item_type]
if admin_permission != None:
items[item_id].admin_permission = admin_permission
item_type = ItemTypeEnum[item_type_value]
else:
item_type = None

item_updated = repo.update_item(item_id, name, price, item_type, admin_permission)

return {
"item_id": item_id,
"item": items[item_id].to_dict()
"item": item_updated.to_dict()
}


Expand Down
1 change: 1 addition & 0 deletions src/app/repo/item_repository_mock.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ def get_item(self, item_id: int) -> Optional[Item]:
return self.items.get(item_id, None)

def create_item(self, item: Item, item_id: int) -> Item:

self.items[item_id] = item
return item

Expand Down
Loading

0 comments on commit d6a1617

Please sign in to comment.