From 7a451097f2d1f840a7bf0fc2dae0604b9e966c7e Mon Sep 17 00:00:00 2001 From: Askill Date: Thu, 15 Aug 2024 16:52:14 +0200 Subject: [PATCH] started with boilerplate and BasketEndpoint --- .vscode/settings.json | 3 + README.md | 55 +++++++++++++++++++ app/src/ShyBadger/__init__.py | 2 + app/src/ShyBadger/endpoints/BasketEndpoint.py | 8 +++ app/src/ShyBadger/main.py | 18 ++++++ app/src/main.py | 5 ++ requirements.txt | 4 ++ 7 files changed, 95 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 app/src/ShyBadger/__init__.py create mode 100644 app/src/ShyBadger/endpoints/BasketEndpoint.py create mode 100644 app/src/ShyBadger/main.py create mode 100644 app/src/main.py create mode 100644 requirements.txt diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..13ee2b0 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "nuxt.isNuxtApp": false +} \ No newline at end of file diff --git a/README.md b/README.md index 521c1c6..708d3e5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,57 @@ # Hiring-Task-Shy-Badger +# Shopping-Basket + +Implement a virtual shopping-basket in the programming language of your choice (Java, Ruby, Elixir, JavaScript, ...). It should be possible to add items to the shopping-basket. Implementing a graphical user interface (GUI) is not necessary - it's enough to show the behavior using test cases. +The following `API` shows the desired interface/behavior in pseudo-code. The final implementation can deviate from that. + +## API +A warehouse has a set of products with fixed prices + +``` +INVENTORY = [["A0001", 12.99], ["A0002", 3.99], ...] +``` + +Each user has a shopping-basket + +``` +basket = Basket.new +``` + +It is possible to add items to the shopping-basket + +``` +basket.scan("A0001") +``` + +A user can check the total price of all items in his shopping basket at any given time + +``` +basket.total +=> 12.99 Euro +``` + +## Task +Additionally, certain sales deals shall be supported: + +* Buy 1 get 1 free for a certain article + +``` +# Buy1Get1Free A0002 +basket.scan("A0002") +basket.scan("A0001") +basket.scan("A0002") +basket.total +=> 16.98 +``` + +* 10% off a given article + +``` +# 10Percent A0001 +basket.scan("A0002") +basket.scan("A0001") +basket.scan("A0002") +basket.total +=> 19.67 +``` \ No newline at end of file diff --git a/app/src/ShyBadger/__init__.py b/app/src/ShyBadger/__init__.py new file mode 100644 index 0000000..9388197 --- /dev/null +++ b/app/src/ShyBadger/__init__.py @@ -0,0 +1,2 @@ +# left empty so the user has to import all submodules explicitly, +# this ensures clear namespace separation \ No newline at end of file diff --git a/app/src/ShyBadger/endpoints/BasketEndpoint.py b/app/src/ShyBadger/endpoints/BasketEndpoint.py new file mode 100644 index 0000000..f441aa9 --- /dev/null +++ b/app/src/ShyBadger/endpoints/BasketEndpoint.py @@ -0,0 +1,8 @@ +from flask_restful import Resource, reqparse +import flask + +class Basket(Resource): + def get(self, id = None): + if id is None: + flask.make_response(flask.jsonify({'error': "No ID supplied"}), 401) + return flask.Response({"data": {}}, mimetype='image/png') \ No newline at end of file diff --git a/app/src/ShyBadger/main.py b/app/src/ShyBadger/main.py new file mode 100644 index 0000000..58b1459 --- /dev/null +++ b/app/src/ShyBadger/main.py @@ -0,0 +1,18 @@ +from flask import Flask, request, g, render_template, redirect +from flask_restful import Resource, reqparse +from flask_restful_swagger_3 import Api +from json import dumps +import logging + +import ShyBadger.endpoints.BasketEndpoint as BasketEndpoint + +app = Flask(__name__) +api = Api(app) +logging.basicConfig(level=logging.DEBUG) +api.add_resource(BasketEndpoint.Basket,'/api/v1/recipe//image') + +@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 diff --git a/app/src/main.py b/app/src/main.py new file mode 100644 index 0000000..3ab4a0b --- /dev/null +++ b/app/src/main.py @@ -0,0 +1,5 @@ +from ShyBadger.main import app + +# disabled threading for easier session handleing in this demo project +# if threaded was True, as session store would be needed +app.run(host="0.0.0.0", port='80', debug=False, threaded=False) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..012a876 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +flask +flask_restful +requests +flask-restful-swagger-3