diff --git a/app/src/ShyBadger/__init__.py b/app/ShyBadger/src/__init__.py similarity index 100% rename from app/src/ShyBadger/__init__.py rename to app/ShyBadger/src/__init__.py diff --git a/app/src/ShyBadger/endpoints/BasketEndpoint.py b/app/ShyBadger/src/endpoints/BasketEndpoint.py similarity index 100% rename from app/src/ShyBadger/endpoints/BasketEndpoint.py rename to app/ShyBadger/src/endpoints/BasketEndpoint.py diff --git a/app/src/ShyBadger/main.py b/app/ShyBadger/src/main.py similarity index 68% rename from app/src/ShyBadger/main.py rename to app/ShyBadger/src/main.py index 58b1459..9953114 100644 --- a/app/src/ShyBadger/main.py +++ b/app/ShyBadger/src/main.py @@ -4,15 +4,16 @@ from flask_restful_swagger_3 import Api from json import dumps import logging -import ShyBadger.endpoints.BasketEndpoint as BasketEndpoint +import endpoints.BasketEndpoint as BasketEndpoint app = Flask(__name__) api = Api(app) logging.basicConfig(level=logging.DEBUG) -api.add_resource(BasketEndpoint.Basket,'/api/v1/recipe//image') +api.add_resource(BasketEndpoint.Basket,'/api/v1/basket/') @app.route("/") def index(): """in lieu of a UI redirect to the API doc""" app.logger.info(f"request from {request.remote_addr}") - return redirect("/api/doc/swagger.json", code=302) \ No newline at end of file + return redirect("/api/doc/swagger.json", code=302) + diff --git a/app/ShyBadger/src/models/Item.py b/app/ShyBadger/src/models/Item.py new file mode 100644 index 0000000..7e16611 --- /dev/null +++ b/app/ShyBadger/src/models/Item.py @@ -0,0 +1,6 @@ +from dataclasses import dataclass + +@dataclass +class Item: + id: str + price: str \ No newline at end of file diff --git a/app/src/main.py b/app/ShyBadger/src/run.py similarity index 57% rename from app/src/main.py rename to app/ShyBadger/src/run.py index 3ab4a0b..2b2a255 100644 --- a/app/src/main.py +++ b/app/ShyBadger/src/run.py @@ -1,4 +1,4 @@ -from ShyBadger.main import app +from main import app # disabled threading for easier session handleing in this demo project # if threaded was True, as session store would be needed diff --git a/app/ShyBadger/src/services/BasketService.py b/app/ShyBadger/src/services/BasketService.py new file mode 100644 index 0000000..4eae938 --- /dev/null +++ b/app/ShyBadger/src/services/BasketService.py @@ -0,0 +1,24 @@ + +from collections import defaultdict +from DealsService import DealsService +from ProductService import ProductService + + +class BasketService: + baskets = None + dealsService = None + productService = None + + def __init__(self) -> None: + self.baskets = defaultdict() + self.dealsService = DealsService() + self.productService = ProductService() + + def total(self, sessionID: str) -> int: + items = self.baskets[sessionID] + prices = self.dealsService.getPrices() + return sum(prices) + + def scan(self, session_id: str, itemId) -> None: + item = self.productService.get_item_from_id(itemId) + self.baskets[session_id].append(item) \ No newline at end of file diff --git a/app/ShyBadger/src/services/DealsService.py b/app/ShyBadger/src/services/DealsService.py new file mode 100644 index 0000000..d1e10a1 --- /dev/null +++ b/app/ShyBadger/src/services/DealsService.py @@ -0,0 +1,37 @@ + +from collections import defaultdict +import math + + +class DealsService: + deals = [] + def __init__(self) -> None: + pass + + def get_prices(self) -> list: + return [0] + + def _round_up(self, val: float): + return math.ceil(val*100)/100 + + def two_for_one_deal(self, items) -> list: + new_items = [] + groups = defaultdict(list) + + for obj in items: + groups[obj.id].append(obj) + + for group in groups.values(): + for deal in self.deals: + # the deals do not stack, the first deal in the list of deals is taken, + # ideally for the customer all deals would be calculated and the maximum value selected + # not implemented for time reasons + if deal(group): + break + + return [item for group in groups.values() for item in group] + + def two_for_one_deal(self, group): + '''' applies deal onto item group in place ''' + for i in range(len(group)//2): + group[i].price = self._round_up(group[i].price / 2) \ No newline at end of file diff --git a/app/ShyBadger/src/services/ProductService.py b/app/ShyBadger/src/services/ProductService.py new file mode 100644 index 0000000..bfc4574 --- /dev/null +++ b/app/ShyBadger/src/services/ProductService.py @@ -0,0 +1,13 @@ +from collections import defaultdict + +from src.models import Item + + +class ProductService: + prices = None + + def __init__(self) -> None: + self.prices = defaultdict() + + def get_item_from_id(self, item_id: str) -> Item: + return Item(id=item_id, price=self.prices.get(item_id))