diff --git a/app/__init__.py b/app/__init__.py index d8293bd..cc38a61 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -45,6 +45,8 @@ def create_app(config_class=Config): app.register_blueprint(errors_bp) from app.main import bp as main_bp app.register_blueprint(main_bp) + from app.api import bp as api_bp + app.register_blueprint(api_bp, url_prefix="/api") return app diff --git a/app/api/__init__.py b/app/api/__init__.py new file mode 100644 index 0000000..28f513c --- /dev/null +++ b/app/api/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('api', __name__) + +from app.api import routes \ No newline at end of file diff --git a/app/api/routes.py b/app/api/routes.py new file mode 100644 index 0000000..f615ff4 --- /dev/null +++ b/app/api/routes.py @@ -0,0 +1,39 @@ +from app import LOGGER +from app.main import bp +from app.models import LoginToken +from app.utils import database_utils +from flask import abort, request +from flask.json import jsonify + +@bp.route('/auth') +def token_authorization(): + LOGGER.debug("Token Login") + if not request.json or 'login' not in request.json: + abort(400) + if not LoginToken.query.filter_by(token=request.json['login']).first(): + abort(403) + return jsonify({}), 200 + +@bp.route('/insert_multiple_items', methods=['POST']) +def insert(): + """Accepts dictionaries in the following format: + { 'user': , + 'dates': [ + { 'date': , + 'items': [ + { 'item_id': , + 'amount': + } + ] + } + ] + } + """ + match request.json: + case {'user': user, 'dates': dates}: + failed = database_utils.insert_bought_items(user, dates) + case _: + abort(400) + if failed: + return jsonify(failed), 400 + return jsonify({'inserted': True}), 201 \ No newline at end of file diff --git a/app/utils/database_utils.py b/app/utils/database_utils.py index 37f3ad2..b11a959 100644 --- a/app/utils/database_utils.py +++ b/app/utils/database_utils.py @@ -10,23 +10,26 @@ from sqlalchemy import and_, text from sqlalchemy.dialects.postgresql import insert from string import ascii_letters, digits -def insert_bought_items(token: str, items: dict, date: str = None): - if not date: - date = dtdate.today() - for item, amount in deepcopy(items).items(): - query_insert = insert(Bought).values(token=token, item=int(item), date=date, amount=int(amount)) - query_insert = query_insert.on_conflict_do_update("bought_pkey", set_=dict(amount=text(f'bought.amount + {amount}'))) - try: - db.session.execute(query_insert) - db.session.commit() - except errors.ForeignKeyViolation as e: - db.session.rollback() - except Exception as e: - db.session.rollback() - LOGGER.exception("") - else: - del(items[item]) - return {'user':token, 'date': date, 'items': items} if items else {} +def insert_bought_items(token: str, dates: dict): + for date in deepcopy(dates): + date_index = dates.index(date) + for item in deepcopy(date['items']): + query_insert = insert(Bought).values(token=token, item=int(item['item_id']), date=date['date'], amount=int(item["amount"])) + query_insert = query_insert.on_conflict_do_update("bought_pkey", set_=dict(amount=text(f'bought.amount + {item["amount"]}'))) + try: + db.session.execute(query_insert) + db.session.commit() + except errors.ForeignKeyViolation as e: + db.session.rollback() + except Exception as e: + db.session.rollback() + LOGGER.exception("") + else: + item_index = dates[date_index]['items'].index(item) + del(dates[date_index]['items'][item_index]) + if len(dates[date_index]['items']) == 0: + del(dates[date_index]) + return {'user':token, 'dates': date} if date else {} def get_report(**kwargs): query_select = db.session.query(bwp.c.token, User.email, bwp.c.date, bwp.c.item, Item.name, bwp.c.amount, bwp.c.price) diff --git a/boot.sh b/boot.sh index 12b7ce9..f5e57d8 100644 --- a/boot.sh +++ b/boot.sh @@ -1,13 +1,12 @@ #!/bin/bash source venv/bin/activate while true; do - flask db upgrade 05fce74b56cb + flask db upgrade 2be4d1ae5493-1 if [[ "$?" == "0" ]]; then break fi echo Deploy command failed, retrying in 5 secs... sleep 5 done -flask db upgrade 2be4d1ae5493 flask db upgrade exec gunicorn -b :5000 --access-logfile - --error-logfile - run:app \ No newline at end of file