diff --git a/Shops/building_materials_store/app/Homework/flask_hw2/app/Dockerfile b/Shops/building_materials_store/app/Homework/flask_hw2/app/Dockerfile new file mode 100644 index 0000000..7d78866 --- /dev/null +++ b/Shops/building_materials_store/app/Homework/flask_hw2/app/Dockerfile @@ -0,0 +1,6 @@ +FROM python:3.10 +COPY . /app +WORKDIR /app +RUN pip install -r requirements.txt +CMD ["python3", "run.py"] +EXPOSE 5000 diff --git a/Shops/building_materials_store/app/Homework/flask_hw2/app/config.py b/Shops/building_materials_store/app/Homework/flask_hw2/app/config.py new file mode 100644 index 0000000..94a7d02 --- /dev/null +++ b/Shops/building_materials_store/app/Homework/flask_hw2/app/config.py @@ -0,0 +1,7 @@ +from flask import Flask +from storage import Storage + +storage = Storage("storage.json") +app = Flask(__name__) + +secret_key = 'qwerty' diff --git a/Shops/building_materials_store/app/Homework/flask_hw2/app/requirements.txt b/Shops/building_materials_store/app/Homework/flask_hw2/app/requirements.txt new file mode 100644 index 0000000..f4962f0 Binary files /dev/null and b/Shops/building_materials_store/app/Homework/flask_hw2/app/requirements.txt differ diff --git a/Shops/building_materials_store/app/Homework/flask_hw2/app/run.py b/Shops/building_materials_store/app/Homework/flask_hw2/app/run.py new file mode 100644 index 0000000..1eb455c --- /dev/null +++ b/Shops/building_materials_store/app/Homework/flask_hw2/app/run.py @@ -0,0 +1,4 @@ +from views import app + +if __name__ == "__main__": + app.run(debug=True, host='0.0.0.0', port=5000) diff --git a/Shops/building_materials_store/app/Homework/flask_hw2/app/service.py b/Shops/building_materials_store/app/Homework/flask_hw2/app/service.py new file mode 100644 index 0000000..efcd521 --- /dev/null +++ b/Shops/building_materials_store/app/Homework/flask_hw2/app/service.py @@ -0,0 +1,30 @@ +import hashlib +from config import storage, secret_key +import jwt + + +def hash_md5(data): + return hashlib.md5(data.encode('utf-8')).hexdigest() + + +def registrate(account): + account['password'] = hash_md5(account.get('password')) + email = account.get("email") + db = storage.get_by_email(email) + saved_email = db.get("email") + if email != saved_email: + return storage.add(account) + + +def login(account): + email = account.get("email") + data = storage.get_by_email(email) + password = hash_md5(account.get("password")) + saved_password = data.get("password") + saved_email = data.get("email") + if password == saved_password and email == saved_email: + return make_jwt(data) + + +def make_jwt(data): + return jwt.encode(data, secret_key, algorithm='HS256') diff --git a/Shops/building_materials_store/app/Homework/flask_hw2/app/storage.json b/Shops/building_materials_store/app/Homework/flask_hw2/app/storage.json new file mode 100644 index 0000000..e69de29 diff --git a/Shops/building_materials_store/app/Homework/flask_hw2/app/storage.py b/Shops/building_materials_store/app/Homework/flask_hw2/app/storage.py new file mode 100644 index 0000000..74caa32 --- /dev/null +++ b/Shops/building_materials_store/app/Homework/flask_hw2/app/storage.py @@ -0,0 +1,22 @@ +import json + + +class Storage: + + def __init__(self, path): + self.path = path + + def get(self, *args, **kwargs): + with open(self.path, "r") as file: + data = json.load(file) + return data + + def get_by_email(self, email): + data = self.get() + return list(filter(lambda acc: acc.get("email") == email, data))[0] + + def add(self, data): + storage_data = self.get() + storage_data.append(data) + with open(self.path, "w") as file: + json.dump(storage_data, file) diff --git a/Shops/building_materials_store/app/Homework/flask_hw2/app/views.py b/Shops/building_materials_store/app/Homework/flask_hw2/app/views.py new file mode 100644 index 0000000..e563237 --- /dev/null +++ b/Shops/building_materials_store/app/Homework/flask_hw2/app/views.py @@ -0,0 +1,33 @@ +from config import app +from flask import request, jsonify, make_response +from service import registrate, login as log + + +@app.route('/login', methods=["POST"]) +def login(): + data = request.get_json() + try: + token = log(data) + result = ({"token": token, + "status": "ok"}, 200) + except Exception as e: + result = ({ + "status": "error", + "detail": "Passwords or email didn't match.", + }, 400) + return make_response(jsonify(result)) + + +@app.route('/reg', methods=["POST"]) +def reg(): + data = request.get_json() + try: + registrate(data) + result = ({ + "status": "ok"}, 200) + except Exception as e: + result = ({ + "status": "error", + "detail": "User already exists. " + }, 400) + return make_response(jsonify(result))