diff --git a/.gitignore b/.gitignore index cf3c132..3327845 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,13 @@ dmypy.json #Pycharm .idea/ *.iml + +# Wing project file +*.wpr + +# Nano, vi, vim lockfile +*.swp + +# log +*.log + diff --git a/Dockerfile b/Dockerfile index 0283646..86e59b4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,28 +1,14 @@ -# Use the official lightweight Python image. -# https://hub.docker.com/_/python FROM python:3.8-slim -# Copy local code to the container image. -ENV APP_HOME /app -ENV PIP_NO_CACHE_DIR=true +ADD storage_service requirements.txt /storage_service/ +WORKDIR /storage_service/ -# Set timezone +ENV PIP_NO_CACHE_DIR=true ENV TZ Europe/Budapest RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone -WORKDIR $APP_HOME +RUN pip3 install -r requirements.txt -ARG RELEASE_ID -ENV RELEASE_ID ${RELEASE_ID:-""} +EXPOSE 8000 +CMD ["gunicorn", "-b", "0.0.0.0:8000", "app:app"] -#Copy requirements to install -COPY requirements.txt ./ - -# Install production dependencies. -RUN pip install -r requirements.txt - -COPY ./src ./src - -EXPOSE 8080 - -ENTRYPOINT ["gunicorn", "-b", "0.0.0.0:8080", "--workers", "1", "--threads", "8", "app:app"] diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..e079f8a --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1 @@ +pytest diff --git a/requirements.txt b/requirements.txt index 3e4cee2..14bd26e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,8 @@ +requests +blinker +Flask +marshmallow +Flask-Classful +gunicorn sentry_sdk -gunicorn \ No newline at end of file +flask_minio \ No newline at end of file diff --git a/storage_service/app.py b/storage_service/app.py new file mode 100644 index 0000000..abc1d28 --- /dev/null +++ b/storage_service/app.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +import os +from flask import Flask +from werkzeug.middleware.proxy_fix import ProxyFix + +# import stuff +from utils import register_all_error_handlers + +# import views +from views import ObjectView + +# create flask app +app = Flask(__name__) +app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1) + +# important stuff +app.secret_key = os.environ.get('SECRET_KEY', os.urandom(12)) + +# register error handlers +register_all_error_handlers(app) + +# register views +for view in [ObjectView]: + view.register(app, trailing_slash=False) + + + + +# start debuggig if needed +if __name__ == "__main__": + app.run(debug=True) diff --git a/storage_service/schemas/__init__.py b/storage_service/schemas/__init__.py new file mode 100644 index 0000000..e5a0d9b --- /dev/null +++ b/storage_service/schemas/__init__.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/storage_service/tests/__init__.py b/storage_service/tests/__init__.py new file mode 100644 index 0000000..21b405d --- /dev/null +++ b/storage_service/tests/__init__.py @@ -0,0 +1 @@ +import os diff --git a/storage_service/utils/__init__.py b/storage_service/utils/__init__.py new file mode 100644 index 0000000..6c6531e --- /dev/null +++ b/storage_service/utils/__init__.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python3 +from .require_decorators import json_required +from .error_handlers import register_all_error_handlers diff --git a/storage_service/utils/error_handlers.py b/storage_service/utils/error_handlers.py new file mode 100644 index 0000000..b3e73a9 --- /dev/null +++ b/storage_service/utils/error_handlers.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + + +def get_standard_error_handler(code: int): + + def error_handler(err): + return {"msg": str(err)}, code + + return error_handler + + +def register_all_error_handlers(app): + """ + function to register all handlers + """ + + error_codes_to_override = [404, 403, 401, 405, 400, 409, 422] + + for code in error_codes_to_override: + app.register_error_handler(code, get_standard_error_handler(code)) + diff --git a/storage_service/utils/require_decorators.py b/storage_service/utils/require_decorators.py new file mode 100644 index 0000000..937f3f0 --- /dev/null +++ b/storage_service/utils/require_decorators.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +from flask import request, current_app, abort + +from functools import wraps + + + +def json_required(f): + + @wraps(f) + def call(*args, **kwargs): + + if request.is_json: + return f(*args, **kwargs) + else: + abort(400, "JSON required") + + return call + diff --git a/storage_service/views/__init__.py b/storage_service/views/__init__.py new file mode 100644 index 0000000..65fa8d8 --- /dev/null +++ b/storage_service/views/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +from .object_view import ObjectView diff --git a/storage_service/views/object_view.py b/storage_service/views/object_view.py new file mode 100644 index 0000000..61611f4 --- /dev/null +++ b/storage_service/views/object_view.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 +from flask import jsonify +from flask_classful import FlaskView + + +class ObjectView(FlaskView): + + def post(self): + return jsonify({}), 200