From 0f70917b7b5f544156679bbd8f3a337b54be383e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20Vachot?= Date: Mon, 24 Jan 2022 20:04:49 +0100 Subject: [PATCH 01/31] Create: frontend --- .github/workflows/docker-image.yml | 30 - backend/Dockerfile | 6 - backend/app.py | 8 - backend/application/__init__.py | 35 -- backend/application/api_functions.py | 364 ------------ backend/application/logs_model.py | 41 -- backend/application/responses.py | 35 -- backend/application/routes.py | 345 ----------- backend/application/sessionJWT.py | 39 -- backend/application/users_model.py | 37 -- backend/config.py | 43 -- backend/env.sh | 6 - backend/fictive_users.py | 47 -- backend/init-db1.sql | 13 - backend/init-db2.sql | 14 - backend/requirements.txt | 13 - backend/test.py | 542 ------------------ docker-compose.yml | 81 +-- frontend/src/environments/environment.prod.ts | 3 +- 19 files changed, 3 insertions(+), 1699 deletions(-) delete mode 100644 .github/workflows/docker-image.yml delete mode 100644 backend/Dockerfile delete mode 100644 backend/app.py delete mode 100644 backend/application/__init__.py delete mode 100644 backend/application/api_functions.py delete mode 100644 backend/application/logs_model.py delete mode 100644 backend/application/responses.py delete mode 100644 backend/application/routes.py delete mode 100644 backend/application/sessionJWT.py delete mode 100644 backend/application/users_model.py delete mode 100644 backend/config.py delete mode 100755 backend/env.sh delete mode 100644 backend/fictive_users.py delete mode 100755 backend/init-db1.sql delete mode 100644 backend/init-db2.sql delete mode 100644 backend/requirements.txt delete mode 100644 backend/test.py diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml deleted file mode 100644 index 7b13ff2..0000000 --- a/.github/workflows/docker-image.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Push-Development - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - name: Push Development - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - - name: Run tests - run: docker-compose run test - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASS }} - - name: Build and push - id: docker_build - uses: docker/build-push-action@v2 - with: - push: true - tags: user/app:latest \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile deleted file mode 100644 index 2987276..0000000 --- a/backend/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM python:latest -WORKDIR /data/backend -COPY requirements.txt requirements.txt -RUN pip install --upgrade pip -RUN pip install -r requirements.txt -COPY . . \ No newline at end of file diff --git a/backend/app.py b/backend/app.py deleted file mode 100644 index 50e795c..0000000 --- a/backend/app.py +++ /dev/null @@ -1,8 +0,0 @@ -from application import create_app -import os - -app = create_app(os.environ.get('FLASK_ENV', None)) - -if __name__ == "__main__": - PORT = os.environ.get('PORT', 33507) - app.run(host='0.0.0.0', port=PORT, DEBUG=True) diff --git a/backend/application/__init__.py b/backend/application/__init__.py deleted file mode 100644 index b68cd09..0000000 --- a/backend/application/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -from flask import Flask -from flask_sqlalchemy import SQLAlchemy -from flask_cors import CORS -import sys - -db = SQLAlchemy() - - -def create_app(flask_env='development'): - app = Flask(__name__, instance_relative_config=False) - origin = app.config.get('ALLOW_ORIGIN') - if origin is None: - origin = ['http://127.0.0.1:4200', 'http://localhost:4200'] - CORS(app, supports_credentials=True, origins=origin) - if flask_env == 'production': - app.config.from_object("config.ProductionConfig") - elif flask_env == 'testing': - app.config.from_object("config.TestingConfig") - elif flask_env == 'development': - app.config.from_object("config.DevelopmentConfig") - else: - app.config.from_object("config.Config") - - if app.config['SQLALCHEMY_DATABASE_URI_1'] is None or app.config['SQLALCHEMY_DATABASE_URI_2'] is None: - print('No ENV Variable for DATABASE_URL_USERS or DATABASE_URL_LOGS') - sys.exit(1) - else: - print('ENV Variables passed : ', app.config['SQLALCHEMY_BINDS']) - - db.init_app(app) - with app.app_context(): - from . import routes - app.register_blueprint(routes.bp) - db.create_all() - return app diff --git a/backend/application/api_functions.py b/backend/application/api_functions.py deleted file mode 100644 index bb67cbd..0000000 --- a/backend/application/api_functions.py +++ /dev/null @@ -1,364 +0,0 @@ -import hashlib -import os -from datetime import datetime -from flask_sqlalchemy import inspect -from sqlalchemy import asc, desc, or_ -from .users_model import Users, db -from .logs_model import Logs - - -def db_create_log(ip, action, message, has_succeeded, status_code, table=None, id_user=None): - log = Logs( - date=datetime.now().strftime('%Y-%m-%dT%H:%M:%S'), - ip=ip, - action=action, - message=message, - has_succeeded=has_succeeded, - status_code=status_code, - table=table, - id_user=id_user - ) - db.session.add(log) - db.session.commit() - return log.json() - - -def hash_password(salt, password): - return hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, 100000) - - -def db_login(ip, email, password): - user = Users.query.filter( - Users.email == email - ).scalar() - - # Check User and Hash Pass - if user and user.hash_pass == hash_password(user.salt, password): - message = 'User authenticated.' - db_create_log( - ip=ip, - action='login', - message=message, - has_succeeded=True, - status_code=0, - table='users', - id_user=user.id - ) - return {'status': 0, 'message': message, 'data': user.json()} - else: - message = f'Email or password invalid' - db_create_log( - ip=ip, - action='login', - message=message, - has_succeeded=False, - status_code=1, - table='users', - id_user=None - ) - return {'status': 1, 'message': message} # Email or password invalid - - -def db_register(ip, email, nickname, password, is_admin=False): - user = Users.query.filter( - Users.email == email - ).scalar() - if user: - message = f'{email} already exist.' - db_create_log( - ip=ip, - action='register', - message=message, - has_succeeded=False, - status_code=1, - table='users', - id_user=None - ) - return {'status': 1, 'message': message} # User already exist - - # Salt Hash Pass with SHA256 - salt = os.urandom(32) - hash_pass = hash_password(salt, password) - - user = Users( - email=email, - hash_pass=hash_pass, - nickname=nickname, - salt=salt, - is_admin=is_admin - ) - user_inspect = inspect(user) - db.session.add(user) - check_inspect = user_inspect.pending - db.session.commit() - - # Add to logs - if check_inspect: - id_user = user.json()['id'] - message = 'User registered.' - has_succeeded = True - status_code = 0 - else: - id_user = None - message = 'Internal Error: User not registered.' - has_succeeded = False - status_code = 1 - - db_create_log( - ip=ip, - action='register', - message=message, - has_succeeded=has_succeeded, - status_code=status_code, - table='users', - id_user=id_user - ) - if status_code == 0: - return {'status': 0, 'message': message, 'data': user.json()} - elif status_code == 1: - return {'status': 1, 'message': message} - - -def db_user_update(ip, user_id, nickname, password): - user = Users.query.filter( - Users.id == user_id - ).scalar() - if user: - has_succeeded = False - status_code = 2 - if nickname and password: - # Salt Hash Pass with SHA256 - salt = os.urandom(32) - hash_pass = hash_password(salt, password) - Users.query.filter(Users.id == user_id).update({'nickname': nickname, 'hash_pass': hash_pass, 'salt': salt}) - db.session.commit() - message = 'User nickname and password updated.' - has_succeeded = True - status_code = 0 - elif nickname: - Users.query.filter(Users.id == user_id).update({'nickname': nickname}) - db.session.commit() - message = 'User nickname updated.' - has_succeeded = True - status_code = 0 - elif password: - # Salt Hash Pass with SHA256 - salt = os.urandom(32) - hash_pass = hash_password(salt, password) - Users.query.filter(Users.id == user_id).update({'hash_pass': hash_pass, 'salt': salt}) - db.session.commit() - message = 'User password updated.' - has_succeeded = True - status_code = 0 - else: - message = 'Only nickname and/or password can be changed.' - - db_create_log( - ip=ip, - action='user_update', - message=message, - has_succeeded=has_succeeded, - status_code=status_code, - table='users', - id_user=user_id - ) - return {'status': status_code, 'message': message, 'data': user.json()} - else: - message = 'User do not exist.' - db_create_log( - ip=ip, - action='user_update', - message=message, - has_succeeded=False, - status_code=1, - table='users', - id_user=user_id - ) - return {'status': 1, 'message': message} - - -def db_user_delete(ip, user_id): - user_to_delete = Users.query.filter(Users.id == user_id).scalar() - if user_to_delete: - is_admin = bool(user_to_delete.json()['is_admin']) - if is_admin and (Users.query.filter(Users.is_admin == True).count() <= 1 or user_id == 0): - message = 'Can\'t delete last admin' - db_create_log( - ip=ip, - action='user_delete', - message=message, - has_succeeded=False, - status_code=2, - table='users', - id_user=user_id - ) - return {'status': 2, 'message': message} - else: - test = Users.query.filter(Users.id == user_id).delete() - if test == 1: - db.session.commit() - message = 'User deleted.' - db_create_log( - ip=ip, - action='user_delete', - message=message, - has_succeeded=True, - status_code=0, - table='users', - id_user=user_id - ) - return {'status': 0, 'message': message, 'data': None} - else: - message = 'User do not exist.' - db_create_log( - ip=ip, - action='user_delete', - message=message, - has_succeeded=False, - status_code=1, - table='users', - id_user=user_id - ) - return {'status': 1, 'message': message} - else: - message = 'User do not exist.' - db_create_log( - ip=ip, - action='user_delete', - message=message, - has_succeeded=False, - status_code=1, - table='users', - id_user=user_id - ) - return {'status': 1, 'message': message} - - -def db_admin_update_user(ip, user_id, is_admin, password): - user = Users.query.filter( - Users.id == user_id - ).scalar() - if user: - has_succeeded = False - status_code = 2 - if is_admin is not None and password: - # Salt Hash Pass with SHA256 - salt = os.urandom(32) - hash_pass = hash_password(salt, password) - Users.query.filter(Users.id == user_id).update({'is_admin': is_admin, 'hash_pass': hash_pass, 'salt': salt}) - db.session.commit() - message = 'User is_admin and password updated.' - has_succeeded = True - status_code = 0 - elif is_admin is not None: - Users.query.filter(Users.id == user_id).update({'is_admin': is_admin}) - db.session.commit() - message = 'User is_admin updated.' - has_succeeded = True - status_code = 0 - elif password: - # Salt Hash Pass with SHA256 - salt = os.urandom(32) - hash_pass = hash_password(salt, password) - Users.query.filter(Users.id == user_id).update({'hash_pass': hash_pass, 'salt': salt}) - db.session.commit() - message = 'User password updated.' - has_succeeded = True - status_code = 0 - else: - message = 'Only is_admin and/or password can be changed.' - - db_create_log( - ip=ip, - action='user_update', - message=message, - has_succeeded=has_succeeded, - status_code=status_code, - table='users', - id_user=user_id - ) - return {'status': status_code, 'message': message, 'data': user.json()} - else: - message = 'User do not exist.' - db_create_log( - ip=ip, - action='user_update', - message=message, - has_succeeded=False, - status_code=1, - table='users', - id_user=user_id - ) - return {'status': 1, 'message': message} - - -def db_users(ip, user_id, query, by='email,nickname', id=None, is_admin=None, order_by='email,asc'): - # q= or id = - # if q= then by= (default: email,nickname) or email or nickname - # is_admin = - # order_by = (default: email,asc), (nickname,asc), (id,desc), (is_admin,desc) - - users = Users.query - if query is id and query is not None: - message = 'Query or id field' - db_create_log( - ip=ip, - action='users', - message=message, - has_succeeded=False, - status_code=1, - table='users', - id_user=user_id - ) - return {'status': 1, 'message': message} - - if query and by: - if by == 'email': - users = users.filter(Users.email.like('%' + query + '%')) - elif by == 'nickname': - users = users.filter(Users.nickname.like('%' + query + '%')) - else: - users = users.filter(or_(Users.nickname.like('%' + query + '%'), Users.email.like('%' + query + '%'))) - elif query and not by: - users = users.filter(or_(Users.nickname.like('%' + query + '%'), Users.email.like('%' + query + '%'))) - elif id: - users = users.filter(Users.id == id) - else: - pass - - if is_admin is not None: - users = users.filter(Users.is_admin == is_admin) - - order_by = order_by.split(',') - if order_by[0] == 'nickname': - order = Users.nickname - elif order_by[0] == 'id': - order = Users.id - elif order_by[0] == 'is_admin': - order = Users.is_admin - else: - order = Users.email - - if len(order_by) > 1: - if order_by[1] == 'asc': - users = users.order_by(asc(order)) - elif order_by[1] == 'desc': - users = users.order_by(desc(order)) - else: - users = users.order_by(asc(order)) - else: - users = users.order_by(asc(order)) - - users = users.all() - - message = f'query({query}), by({by}), id({id}), is_admin({is_admin}) and order_by({order_by}): {len(users)} result(s)' - db_create_log( - ip=ip, - action='users', - message=message, - has_succeeded=True, - status_code=0, - table='users', - id_user=user_id - ) - return {'status': 0, 'message': message, 'data': [user.json() for user in users]} diff --git a/backend/application/logs_model.py b/backend/application/logs_model.py deleted file mode 100644 index 53ac617..0000000 --- a/backend/application/logs_model.py +++ /dev/null @@ -1,41 +0,0 @@ -from . import db - - -class Logs(db.Model): - __bind_key__ = 'db-logs' - - id = db.Column(db.Integer, primary_key=True) - date = db.Column(db.TIMESTAMP(), nullable=False) - id_user = db.Column(db.Integer, nullable=True) - ip = db.Column(db.String(), nullable=False) - table = db.Column(db.String(), nullable=False) - action = db.Column(db.String(), nullable=False) - message = db.Column(db.String(), nullable=False) - has_succeeded = db.Column(db.Boolean, nullable=False) - status_code = db.Column(db.Integer, nullable=False) - - def __init__(self, date, id_user, ip, table, action, message, has_succeeded, status_code): - self.date = date - self.id_user = id_user - self.ip = ip - self.table = table - self.action = action - self.message = message - self.has_succeeded = has_succeeded - self.status_code = status_code - - def __repr__(self): - return { - 'id': self.id, - 'date': self.date, - 'id_user': self.id_user, - 'ip': self.ip, - 'table': self.table, - 'action': self.action, - 'message': self.message, - 'has_succeeded': self.has_succeeded, - 'status_code': self.status_code - } - - def json(self): - return self.__repr__() diff --git a/backend/application/responses.py b/backend/application/responses.py deleted file mode 100644 index 03e11a6..0000000 --- a/backend/application/responses.py +++ /dev/null @@ -1,35 +0,0 @@ -from flask import current_app as app -import json - - -def send_error(status_code, message, token=None): - data_json = { - 'status': 'error', - 'message': message - } - res = app.response_class( - response=json.dumps(data_json), - status=status_code, - mimetype='application/json' - ) - if token is not None: - res.set_cookie('SESSIONID', token) - return res - - -def send_message(message, data, token=None, token_delete=False): - data_json = { - 'status': 'success', - 'message': message, - 'data': data - } - res = app.response_class( - response=json.dumps(data_json), - status=200, - mimetype='application/json' - ) - if token is not None: - res.set_cookie('SESSIONID', token) - if token_delete: - res.delete_cookie('SESSIONID') - return res diff --git a/backend/application/routes.py b/backend/application/routes.py deleted file mode 100644 index 70d5160..0000000 --- a/backend/application/routes.py +++ /dev/null @@ -1,345 +0,0 @@ -from flask import request, Blueprint -from werkzeug.exceptions import HTTPException -from .responses import send_message, send_error -from .api_functions import db_login, db_register, db_user_update, db_create_log, db_user_delete, db_admin_update_user, db_users -from .sessionJWT import create_auth_token, check_auth_token - -bp = Blueprint('myapp', __name__) - - -@bp.app_errorhandler(HTTPException) -def handle_exception(e): - return send_error(e.code, e.name) - - -# Login -@bp.route('/api/login', methods=['POST']) -def login(): - post_json = request.json - try: - post_email = str(post_json['email']) - post_password = str(post_json['password']) - if post_email != '' and post_password != '': - ip = request.remote_addr - res = db_login(ip, post_email, post_password) - if res['status'] == 0: - user = res['data'] - token = create_auth_token(user) - return send_message(res['message'], user, token) - elif res['status'] == 1: - user = None - token = create_auth_token(user) - return send_error(400, res['message'], token) - else: - return send_error(400, 'Empty email and/or password fields.') - except KeyError as e: - return send_error(400, 'Need email, password fields.') - - -# Register -@bp.route('/api/register', methods=['POST']) -def register(): - post_json = request.json - try: - post_email = str(post_json['email']) - post_nickname = str(post_json['nickname']) - post_password = str(post_json['password']) - if post_email != '' and post_password != '' and post_nickname != '': - ip = request.remote_addr - res = db_register(ip, post_email, post_nickname, post_password) - if res['status'] == 1: - return send_error(500, res['message']) - elif res['status'] == 0: - return send_message(res['message'], res['data']) - else: - return send_error(400, 'Empty email and/or password and/or nickname fields.') - except KeyError as e: - return send_error(400, 'Need ' + str(e) + 'field.') - - -# Logout -@bp.route('/api/logout', methods=['DELETE']) -def logout(): - token = check_auth_token(request) - if token['success']: - ip = request.remote_addr - message = 'User disconnected.' - db_create_log( - ip=ip, - action='logout', - message=message, - has_succeeded=True, - status_code=0, - table='users', - id_user=token['payload']['id'] - ) - return send_message(message, None, token_delete=True) - else: - return send_error(500, token['message']) - - -# Update User (Nickname, Password) -@bp.route('/api/user/update', methods=['PUT']) -def user_update(): - token = check_auth_token(request) - if token['success']: - post_json = request.json - post_nickname = None - post_password = None - fields = '' - if 'nickname' in post_json: - post_nickname = str(post_json['nickname']) - else: - fields += 'nickname ' - - if 'password' in post_json: - post_password = str(post_json['password']) - else: - fields += 'password ' - - if post_nickname is not None or post_password is not None: - if post_nickname != '' and post_password != '': - ip = request.remote_addr - user_id = token['payload']['id'] - res = db_user_update(ip, user_id, post_nickname, post_password) - if res['status'] == 1: - return send_error(500, res['message']) - elif res['status'] == 0: - return send_message(res['message'], res['data']) - else: - return send_error(400, 'Empty nickname and/or password fields.') - else: - return send_error(400, 'Need ' + fields + 'field.') - else: - return send_error(500, token['message']) - - -# Delete User -@bp.route('/api/user/delete', methods=['DELETE']) -def user_delete(): - token = check_auth_token(request) - if token['success']: - ip = request.remote_addr - user_id = token['payload']['id'] - res = db_user_delete(ip, user_id) - if res['status'] != 0: - return send_error(500, res['message']) - else: - db_create_log( - ip=ip, - action='delete', - message='User deleted.', - has_succeeded=True, - status_code=0, - table='users', - id_user=token['payload']['id'] - ) - return send_message(res['message'], None, token_delete=True) - else: - return send_error(500, token['message']) - - -# Admin : Create User -@bp.route('/api/admin/create/user', methods=['POST']) -def admin_create_user(): - token = check_auth_token(request) - if token['success']: - ip = request.remote_addr - user_id = token['payload']['id'] - is_admin = token['payload']['is_admin'] - if is_admin: - post_json = request.json - post_email = None - post_nickname = None - post_password = None - post_is_admin = None - fields = '' - if 'email' in post_json: - post_email = str(post_json['email']) - else: - fields += 'email ' - - if 'nickname' in post_json: - post_nickname = str(post_json['nickname']) - else: - fields += 'nickname ' - - if 'password' in post_json: - post_password = str(post_json['password']) - else: - fields += 'password ' - - if 'is_admin' in post_json: - post_is_admin = bool(post_json['is_admin']) - else: - fields += 'is_admin ' - - if post_email is not None or post_nickname is not None or post_password is not None or post_is_admin is not None: - if post_email != '' and post_nickname != '' and post_password != '' and str(post_is_admin) != '': - res = db_register(ip, post_email, post_nickname, post_password, is_admin=post_is_admin) - if res['status'] == 1: - db_create_log( - ip=ip, - action='admin/create/user', - message=res['message'], - has_succeeded=False, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_error(500, res['message']) - elif res['status'] == 0: - db_create_log( - ip=ip, - action='admin/create/user', - message=res['message'], - has_succeeded=True, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_message(res['message'], res['data']) - else: - return send_error(400, 'Empty email and/or nickname and/or password and/or is_admin fields.') - else: - return send_error(400, 'Need ' + fields + 'field.') - else: - return send_error(500, 'User does not have permission.') - else: - return send_error(500, token['message']) - - -# Admin : Change User password and/or role -@bp.route('/api/admin/update/user', methods=['PUT']) -def admin_update_user(): - token = check_auth_token(request) - if token['success']: - user_id = token['payload']['id'] - is_admin = token['payload']['is_admin'] - if is_admin: - post_json = request.json - post_is_admin = None - post_password = None - post_user_id_delete = None - fields = '' - if 'id' in post_json: - post_user_id_delete = int(post_json['id']) - else: - fields += 'id ' - - if 'is_admin' in post_json: - post_is_admin = bool(post_json['is_admin']) - else: - fields += 'is_admin ' - - if 'password' in post_json: - post_password = str(post_json['password']) - else: - fields += 'password ' - - if post_user_id_delete is not None and (post_is_admin is not None or post_password is not None): - if str(post_is_admin) != '' and post_password != '' and str(post_user_id_delete) != '': - ip = request.remote_addr - res = db_admin_update_user(ip, post_user_id_delete, post_is_admin, post_password) - if res['status'] == 1: - db_create_log( - ip=ip, - action='admin/update/user', - message=res['message'], - has_succeeded=False, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_error(500, res['message']) - elif res['status'] == 0: - db_create_log( - ip=ip, - action='admin/update/user', - message=res['message'], - has_succeeded=True, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_message(res['message'], res['data']) - else: - return send_error(400, 'Empty is_admin and/or password fields.') - else: - return send_error(400, 'Need ' + fields + 'field.') - else: - return send_error(500, 'User does not have permission.') - else: - return send_error(500, token['message']) - - -# Admin : Delete User -@bp.route('/api/admin/delete/user/', methods=['DELETE']) -def admin_delete_user(id): - token = check_auth_token(request) - if token['success']: - ip = request.remote_addr - user_id = token['payload']['id'] - is_admin = token['payload']['is_admin'] - if is_admin: - post_json = {'id': id} - post_user_id_delete = None - fields = '' - if 'id' in post_json: - post_user_id_delete = int(post_json['id']) - else: - fields += 'id' - if post_user_id_delete is not None: - if str(post_user_id_delete) != '': - res = db_user_delete(ip, int(post_user_id_delete)) - if res['status'] == 1: - db_create_log( - ip=ip, - action='admin/delete/user', - message=res['message'], - has_succeeded=False, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_error(500, res['message']) - else: - db_create_log( - ip=ip, - action='admin/delete/user', - message=res['message'], - has_succeeded=True, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_message(res['message'], None) - else: - return send_error(400, 'Empty id field.') - else: - return send_error(400, 'Need ' + fields + 'field.') - else: - return send_error(500, 'User does not have permission.') - else: - return send_error(500, token['message']) - - -# List of User (must be authenticated) & Search -@bp.route('/api/users', methods=['GET']) -def users(): - token = check_auth_token(request) - if token['success']: - ip = request.remote_addr - user_id = token['payload']['id'] - get_query = request.args.get('q') - get_by = request.args.get('by') - get_id = request.args.get('id') - get_is_admin = request.args.get('is_admin') - get_order_by = request.args.get('order_by') - res = db_users(ip, user_id, get_query, get_by, get_id, get_is_admin, get_order_by) - if res['status'] == 1: - return send_error(500, res['message']) - else: - return send_message(res['message'], res['data']) - else: - return send_error(500, token['message']) diff --git a/backend/application/sessionJWT.py b/backend/application/sessionJWT.py deleted file mode 100644 index ef228fb..0000000 --- a/backend/application/sessionJWT.py +++ /dev/null @@ -1,39 +0,0 @@ -from datetime import datetime, timedelta -from flask import current_app as app -import jwt - - -def create_auth_token(user, time_second=1800): - try: - time = datetime.now() - payload = { - 'exp': time + timedelta(days=0, seconds=time_second), - 'iat': time, - 'user': user - } - return jwt.encode( - payload, - app.config.get('SECRET_KEY'), - algorithm='HS256' - ) - except Exception as e: - return e - - -def decode_auth_token(auth_token): - try: - payload = jwt.decode( - auth_token, - app.config.get('SECRET_KEY'), - algorithms='HS256' - ) - return {'success': True, 'payload': payload['user']} - except jwt.ExpiredSignatureError: - return {'success': False, 'message': 'Signature expired . Please log in again.'} - except jwt.InvalidTokenError as e: - return {'success': False, 'message': 'User not authenticated.'} - - -def check_auth_token(request): - token = request.cookies.get('SESSIONID') - return decode_auth_token(token) diff --git a/backend/application/users_model.py b/backend/application/users_model.py deleted file mode 100644 index b932328..0000000 --- a/backend/application/users_model.py +++ /dev/null @@ -1,37 +0,0 @@ -from . import db - - -class Users(db.Model): - __bind_key__ = 'db-users' - - id = db.Column(db.Integer, primary_key=True, autoincrement=True) - email = db.Column(db.String(), nullable=False, unique=True) - nickname = db.Column(db.String(), nullable=False) - hash_pass = db.Column(db.LargeBinary(), nullable=False) - salt = db.Column(db.LargeBinary(), nullable=False) - is_admin = db.Column(db.Boolean, default=False, nullable=False) - - def __init__(self, email, nickname, hash_pass, salt, is_admin): - self.email = email - self.hash_pass = hash_pass - self.nickname = nickname - self.salt = salt - self.is_admin = is_admin - - def __repr__(self): - return { - 'id': self.id, - 'email': self.email, - 'nickname': self.nickname, - 'hash_pass': self.hash_pass, - 'salt': self.salt, - 'is_admin': self.is_admin - } - - def json(self): - return { - 'id': self.id, - 'email': self.email, - 'nickname': self.nickname, - 'is_admin': self.is_admin - } diff --git a/backend/config.py b/backend/config.py deleted file mode 100644 index ae0e613..0000000 --- a/backend/config.py +++ /dev/null @@ -1,43 +0,0 @@ -import os - -basedir = os.path.abspath(os.path.dirname(__file__)) - - -class Config(object): - DEBUG = False - TESTING = False - CSRF_ENABLED = True - - FLASK_APP = os.environ.get('FLASK_APP', None) - FLASK_ENV = os.environ.get('FLASK_ENV', None) - - SQLALCHEMY_ECHO = False - SQLALCHEMY_TRACK_MODIFICATIONS = False - SQLALCHEMY_DATABASE_URI_1 = os.environ.get('DATABASE_URL_USERS', None) - SQLALCHEMY_DATABASE_URI_2 = os.environ.get('DATABASE_URL_LOGS', None) - SQLALCHEMY_BINDS = { - 'db-users': SQLALCHEMY_DATABASE_URI_1, - 'db-logs': SQLALCHEMY_DATABASE_URI_2 - } - - SECRET_KEY = os.environ.get('SECRET_KEY', 'default_secret_key') - ALLOW_ORIGIN = os.environ.get('ALLOW_ORIGIN', None) - - -class ProductionConfig(Config): - DEBUG = False - SQLALCHEMY_ECHO = False - SQLALCHEMY_TRACK_MODIFICATIONS = False - - -class TestingConfig(Config): - TESTING = True - SQLALCHEMY_ECHO = False - SQLALCHEMY_TRACK_MODIFICATIONS = False - - -class DevelopmentConfig(Config): - DEVELOPMENT = True - DEBUG = True - SQLALCHEMY_ECHO = True - SQLALCHEMY_TRACK_MODIFICATIONS = True diff --git a/backend/env.sh b/backend/env.sh deleted file mode 100755 index da2fa7f..0000000 --- a/backend/env.sh +++ /dev/null @@ -1,6 +0,0 @@ -export FLASK_APP=app.py -export FLASK_ENV=development -export FLASK_DEBUG=1 -export PYTHONUNBUFFERED=1 -export DATABASE_URL_USERS=postgresql://flaskaled1:aled1@localhost:5433/flaskaledDb1 -export DATABASE_URL_LOGS=postgresql://flaskaled2:aled2@localhost:5434/flaskaledDb2 diff --git a/backend/fictive_users.py b/backend/fictive_users.py deleted file mode 100644 index 6f97529..0000000 --- a/backend/fictive_users.py +++ /dev/null @@ -1,47 +0,0 @@ -import os -from application.users_model import Users -from application.api_functions import hash_password - -TAB_USER_WITH_PASSWORD = [ - { - "id": 1, - "email": "riri@gmail.com", - "nickname": "Riri", - "password": "ririPass", - "is_admin": False - }, - { - "id": 2, - "email": "fifi@gmail.com", - "nickname": "Fifi", - "password": "fifiPass", - "is_admin": False - }, - { - "id": 3, - "email": "donald@gmail.com", - "nickname": "Donald", - "password": "donaldPass", - "is_admin": False - }, - { - "id": 4, - "email": "daisy@gmail.com", - "nickname": "Daisy", - "password": "daisyPass", - "is_admin": True - }, -] - - -# Convert user with passord (uwp) to user -def uwp_to_user(uwp): - salt0 = os.urandom(32) - hash_pass0 = hash_password(salt0, uwp["password"]) - return Users( - email=uwp["email"], - nickname=uwp["nickname"], - hash_pass=hash_pass0, - salt=salt0, - is_admin=uwp["is_admin"] - ) diff --git a/backend/init-db1.sql b/backend/init-db1.sql deleted file mode 100755 index bbec183..0000000 --- a/backend/init-db1.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: users - -CREATE TABLE IF NOT EXISTS users -( - id serial PRIMARY KEY, - email character varying(320) NOT NULL, - nickname character varying(50) NOT NULL, - hash_pass bytea NOT NULL, - salt bytea NOT NULL, - is_admin boolean NOT NULL DEFAULT FALSE -); - -INSERT INTO users VALUES(0,'admin@admin.admin','Admin',decode('e5ed79b503704ed20a1d250770db68182118de7fe0236db9bbfb0dd9684087d6', 'hex'),decode('7012f69f1ac7c23c5dca498c30fa94527b507cc9e40fab9bae284d1465a37724', 'hex'),TRUE); \ No newline at end of file diff --git a/backend/init-db2.sql b/backend/init-db2.sql deleted file mode 100644 index 02ebdc9..0000000 --- a/backend/init-db2.sql +++ /dev/null @@ -1,14 +0,0 @@ --- Table: logs - -CREATE TABLE IF NOT EXISTS logs -( - id serial PRIMARY KEY, - date timestamp NOT NULL, - id_user integer, - ip character varying(15) NOT NULL, - "table" character varying(25) NOT NULL, - action character varying(50) NOT NULL, - message character varying(512) NOT NULL, - has_succeeded boolean NOT NULL, - status_code smallint NOT NULL -); \ No newline at end of file diff --git a/backend/requirements.txt b/backend/requirements.txt deleted file mode 100644 index 6317cbe..0000000 --- a/backend/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -alembic==1.7.5 -Flask==2.0.2 -Flask-Migrate==3.1.0 -Flask-Script==2.0.6 -Flask-Testing==0.8.1 -Flask-SQLAlchemy==2.5.1 -Flask-WTF==0.15.1 -pipreqs==0.4.10 -PyJWT==2.3.0 -pytest==6.2.5 -SQLAlchemy==1.4.27 -psycopg2==2.9.2 -Flask-Cors==3.0.10 \ No newline at end of file diff --git a/backend/test.py b/backend/test.py deleted file mode 100644 index 2aa595f..0000000 --- a/backend/test.py +++ /dev/null @@ -1,542 +0,0 @@ -import unittest -from flask_testing import TestCase -from fictive_users import TAB_USER_WITH_PASSWORD, uwp_to_user -from application import db, create_app - - -class BaseTestCase(TestCase): - - def create_app(self): - app = create_app('testing') - return app - - def setUp(self): - db.drop_all() - db.create_all() - for uwp in TAB_USER_WITH_PASSWORD: - db.session.add(uwp_to_user(uwp)) - db.session.commit() - - def tearDown(self): - db.session.remove() - db.drop_all() - - -class FlaskTestCase(BaseTestCase): - - # -- UTILS --- - - def login(self, email, password): - data0 = { - "email": email, - "password": password - } - response = self.client.post('/api/login', json=data0) - return response - - # --- LOGIN --- - - def test_login_NoFields_statusCode(self): - response = self.client.post('/api/login', json={}) - self.assertEqual(response.status_code, 400) - - def test_login_NoFields_message(self): - response = self.client.post('/api/login', json={}) - self.assertEqual(response.json['message'], 'Need email, password fields.') - - def test_login_emptyFields_statusCode(self): - data0 = { - "email": "", - "password": "blabla" - } - response = self.client.post('/api/login', json=data0) - self.assertEqual(response.status_code, 400) - - def test_login_emptyFields_message(self): - data0 = { - "email": "", - "password": "blabla" - } - response = self.client.post('/api/login', json=data0) - self.assertEqual(response.json['message'], 'Empty email and/or password fields.') - - def test_login_wrongFields_statusCode(self): - data0 = { - "email": "nimp@gmail.com", - "password": "nimp" - } - response = self.client.post('/api/login', json=data0) - self.assertEqual(response.status_code, 400) - - def test_login_wrongFields_message(self): - data0 = { - "email": "nimp@gmail.com", - "password": "nimp" - } - response = self.client.post('/api/login', json=data0) - self.assertEqual(response.json['message'], 'Email or password invalid') - - def test_login_success_statusCode(self): - data0 = { - "email": "riri@gmail.com", - "password": "ririPass" - } - response = self.client.post('/api/login', json=data0) - self.assertEqual(response.status_code, 200) - - def test_login_success_message(self): - data0 = { - "email": "riri@gmail.com", - "password": "ririPass" - } - response = self.client.post('/api/login', json=data0) - self.assertEqual(response.json['message'], 'User authenticated.') - - # --- REGISTER --- - - def test_register_noFields_statusCode(self): - response = self.client.post('/api/register', json={}) - self.assertEqual(response.status_code, 400) - - def test_register_noFields_message(self): - response = self.client.post('/api/register', json={}) - self.assertIn('Need', response.json['message']) - - def test_register_emptyFields_statusCode(self): - data0 = { - "email": "", - "password": "blabla", - "nickname": "blabla" - } - response = self.client.post('/api/register', json=data0) - self.assertEqual(response.status_code, 400) - - def test_register_emptyFields_message(self): - data0 = { - "email": "", - "password": "blabla", - "nickname": "blabla" - } - response = self.client.post('/api/register', json=data0) - self.assertEqual(response.json['message'], 'Empty email and/or password and/or nickname fields.') - - def test_register_alreadyExist_statusCode(self): - data0 = { - "email": "riri@gmail.com", - "password": "blabla", - "nickname": "blabla" - } - response = self.client.post('/api/register', json=data0) - self.assertEqual(response.status_code, 500) - - def test_register_alreadyExist_statusCode(self): - data0 = { - "email": "riri@gmail.com", - "password": "blabla", - "nickname": "blabla" - } - response = self.client.post('/api/register', json=data0) - self.assertIn('already exist', response.json['message']) - - def test_register_success_statusCode(self): - data0 = { - "email": "loulou@gmail.com", - "password": "loulouPass", - "nickname": "Loulou" - } - response = self.client.post('/api/register', json=data0) - self.assertEqual(response.status_code, 200) - - def test_register_success_message(self): - data0 = { - "email": "loulou@gmail.com", - "password": "loulouPass", - "nickname": "Loulou" - } - response = self.client.post('/api/register', json=data0) - self.assertEqual(response.json['message'], 'User registered.') - - # --- LOGOUT --- - - def test_logout_fail_(self): - response = self.client.delete('/api/logout') - self.assertEqual(response.status_code, 500) - - def test_logout_success(self): - response = self.login("riri@gmail.com", "ririPass") - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/logout') - self.assertEqual(response.status_code, 200) - - # --- USER/UPDATE --- - - def test_userUpdate_notConnected_statusCode(self): - response = self.client.put('/api/user/update', json={}) - self.assertEqual(response.status_code, 500) - - def test_userUpdate_notConnected_message(self): - response = self.client.put('/api/user/update', json={}) - self.assertEqual(response.json['message'], 'User not authenticated.') - - def test_userUpdate_noFields_statusCode(self): - response = self.login("riri@gmail.com", "ririPass") - self.assertEqual(response.status_code, 200) - response = self.client.put('/api/user/update', json={}) - self.assertEqual(response.status_code, 400) - - def test_userUpdate_noFields_message(self): - response = self.login("riri@gmail.com", "ririPass") - self.assertEqual(response.status_code, 200) - response = self.client.put('/api/user/update', json={}) - self.assertIn('Need', response.json['message']) - - def test_userUpdate_emptyFields_statusCode(self): - response = self.login("riri@gmail.com", "ririPass") - self.assertEqual(response.status_code, 200) - data0 = { - "nickname": "", - "password": "blabla" - } - response = self.client.put('/api/user/update', json=data0) - self.assertEqual(response.status_code, 400) - - def test_userUpdate_emptyFields_message(self): - response = self.login("riri@gmail.com", "ririPass") - self.assertEqual(response.status_code, 200) - data0 = { - "nickname": "", - "password": "blabla" - } - response = self.client.put('/api/user/update', json=data0) - self.assertEqual(response.json['message'], 'Empty nickname and/or password fields.') - - def test_self_update_success_statusCode(self): - response = self.login("riri@gmail.com", "ririPass") - self.assertEqual(response.status_code, 200) - data0 = { - "nickname": "Ririri", - "password": "ririPass" - } - response = self.client.put('/api/user/update', json=data0) - self.assertEqual(response.status_code, 200) - - # --- USER/DELETE --- - - def test_userDelete_notConnected_statusCode(self): - response = self.client.delete('/api/user/delete') - self.assertEqual(response.status_code, 500) - - def test_userDelete_notConnected_message(self): - response = self.client.delete('/api/user/delete') - self.assertEqual(response.json['message'], 'User not authenticated.') - - def test_userDelete_success_statusCode(self): - response = self.login('riri@gmail.com', 'ririPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/user/delete') - self.assertEqual(response.status_code, 200) - - def test_userDelete_success_message(self): - response = self.login('riri@gmail.com', 'ririPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/user/delete') - self.assertEqual(response.json['message'], 'User deleted.') - - def test_userDelete_lastAdmin_statusCode(self): - response = self.login('donald@gmail.com', 'donaldPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/user/delete') - self.assertEqual(response.status_code, 200) - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/user/delete') - self.assertEqual(response.status_code, 500) - - def test_userDelete_lastAdmin_message(self): - response = self.login('donald@gmail.com', 'donaldPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/user/delete') - self.assertEqual(response.status_code, 200) - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/user/delete') - self.assertEqual(response.json['message'], 'Can\'t delete last admin') - - # --- ADMIN/CREATE/USER --- - - def test_adminCreate_notConnected_statusCode(self): - response = self.client.post('/api/admin/create/user', json={}) - self.assertEqual(response.status_code, 500) - - def test_adminCreate_notConnected_message(self): - response = self.client.post('/api/admin/create/user', json={}) - self.assertEqual(response.json['message'], 'User not authenticated.') - - def test_adminCreate_noPermission_statusCode(self): - response = self.login('riri@gmail.com', 'ririPass') - self.assertEqual(response.status_code, 200) - response = self.client.post('/api/admin/create/user', json={}) - self.assertEqual(response.status_code, 500) - - def test_adminCreate_noPermission_message(self): - response = self.login('riri@gmail.com', 'ririPass') - self.assertEqual(response.status_code, 200) - response = self.client.post('/api/admin/create/user', json={}) - self.assertEqual(response.json['message'], 'User does not have permission.') - - def test_adminCreate_noFields_statusCode(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.post('/api/admin/create/user', json={}) - self.assertEqual(response.status_code, 400) - - def test_adminCreate_noFields_message(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.post('/api/admin/create/user', json={}) - self.assertIn('Need', response.json['message']) - - def test_adminCreate_emptyFields_statusCode(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "email": "", - "nickname": "Mickey", - "password": "mickeyPass", - "is_admin": True, - } - response = self.client.post('/api/admin/create/user', json=data0) - self.assertEqual(response.status_code, 400) - - def test_adminCreate_emptyFields_message(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "email": "", - "nickname": "Mickey", - "password": "mickeyPass", - "is_admin": True, - } - response = self.client.post('/api/admin/create/user', json=data0) - self.assertEqual(response.json['message'], - 'Empty email and/or nickname and/or password and/or is_admin fields.') - - def test_adminCreate_alreadyExist_statusCode(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "email": "riri@gmail.com", - "passord": "blabla", - "nickname": "blabla", - } - response = self.client.post('/api/admin/create/user', json=data0) - self.assertEqual(response.status_code, 500) - - def test_adminCreate_alreadyExist_message(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "email": "riri@gmail.com", - "passord": "blabla", - "nickname": "blabla", - } - response = self.client.post('/api/admin/create/user', json=data0) - self.assertIn('already exist', response.json['message']) - - def test_adminCreate_success_statusCode(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "email": "mickey@gmail.com", - "nickname": "Mickey", - "password": "mickeyPass", - "is_admin": True, - } - response = self.client.post('/api/admin/create/user', json=data0) - self.assertEqual(response.status_code, 200) - - def test_adminCreate_success_message(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "email": "mickey@gmail.com", - "nickname": "Mickey", - "password": "mickeyPass", - "is_admin": True, - } - response = self.client.post('/api/admin/create/user', json=data0) - self.assertEqual(response.json['message'], 'User registered.') - - # --- ADMIN/UPDATE/USER --- - - def test_adminUpdate_notConnected_statusCode(self): - response = self.client.put('/api/admin/update/user', json={}) - self.assertEqual(response.status_code, 500) - - def test_adminUpdate_notConnected_message(self): - response = self.client.put('/api/admin/update/user', json={}) - self.assertEqual(response.json['message'], 'User not authenticated.') - - def test_adminUpdate_noPermission_statusCode(self): - response = self.login('riri@gmail.com', 'ririPass') - self.assertEqual(response.status_code, 200) - response = self.client.put('/api/admin/update/user', json={}) - self.assertEqual(response.status_code, 500) - - def test_adminUpdate_noPermission_message(self): - response = self.login('riri@gmail.com', 'ririPass') - self.assertEqual(response.status_code, 200) - response = self.client.put('/api/admin/update/user', json={}) - self.assertEqual(response.json['message'], 'User does not have permission.') - - def test_adminUpdate_noFields_statusCode(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.put('/api/admin/update/user', json={}) - self.assertEqual(response.status_code, 400) - - def test_adminUpdate_noFields_message(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.put('/api/admin/update/user', json={}) - self.assertIn('Need', response.json['message']) - - def test_adminUpdate_emptyFields_statusCode(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "id": 1, - "password": "", - "is_admin": False, - } - response = self.client.put('/api/admin/update/user', json=data0) - self.assertEqual(response.status_code, 400) - - def test_adminUpdate_emptyFields_message(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "id": 1, - "password": "", - "is_admin": False, - } - response = self.client.put('/api/admin/update/user', json=data0) - self.assertEqual(response.json['message'], 'Empty is_admin and/or password fields.') - - def test_adminUpdate_notExists_statusCode(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "id": 99, - "password": "blabla", - "is_admin": False - } - response = self.client.put('/api/admin/update/user', json=data0) - self.assertEqual(response.status_code, 500) - - def test_adminUpdate_notExists_message(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "id": 99, - "password": "blabla", - "is_admin": False - } - response = self.client.put('/api/admin/update/user', json=data0) - self.assertEqual(response.json['message'], 'User do not exist.') - - def test_adminUpdate_success_message(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "id": 1, - "password": "roroPass", - "is_admin": False, - } - response = self.client.put('/api/admin/update/user', json=data0) - self.assertEqual(response.status_code, 200) - - def test_adminUpdate_success_statusCode(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - data0 = { - "id": 1, - "password": "roroPass", - "is_admin": False, - } - response = self.client.put('/api/admin/update/user', json=data0) - self.assertIn("updated", response.json['message']) - - # --- ADMIN/DELETE/USER --- - - def test_adminDelete_notConnected_statusCode(self): - response = self.client.delete('/api/admin/delete/user/1') - self.assertEqual(response.status_code, 500) - - def test_adminDelete_notConnected_message(self): - response = self.client.delete('/api/admin/delete/user/1') - self.assertEqual(response.json['message'], 'User not authenticated.') - - def test_adminDelete_noPermission_statusCode(self): - response = self.login('riri@gmail.com', 'ririPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/admin/delete/user/1') - self.assertEqual(response.status_code, 500) - - def test_adminDelete_noPermission_message(self): - response = self.login('riri@gmail.com', 'ririPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/admin/delete/user/1') - self.assertEqual(response.json['message'], 'User does not have permission.') - - def test_adminDelete_noFields_statusCode(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/admin/delete/user/') - self.assertEqual(response.status_code, 404) - - def test_adminDelete_no_fields(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/admin/delete/user') - self.assertEqual('Not Found', response.json['message']) - - def test_adminDelete_notExists_statusCode(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/admin/delete/user/99') - self.assertEqual(response.status_code, 500) - - def test_adminDelete_notExists_message(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/admin/delete/user/99') - self.assertEqual(response.json['message'], 'User do not exist.') - - def test_adminDelete_success_statusCode(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/admin/delete/user/2') - self.assertEqual(response.status_code, 200) - - def test_adminDelete_success_message(self): - response = self.login('daisy@gmail.com', 'daisyPass') - self.assertEqual(response.status_code, 200) - response = self.client.delete('/api/admin/delete/user/2') - self.assertEqual(response.json['message'], 'User deleted.') - - # --- LIST OF USER --- - - def test_listOfUsers_fail(self): - response = self.client.get('/api/users') - self.assertEqual(response.status_code, 500) - - def test_listOfUsers_success(self): - response = self.login('riri@gmail.com', 'ririPass') - self.assertEqual(response.status_code, 200) - response = self.client.get('/api/users?order_by=nickname') - self.assertEqual(response.status_code, 200) - - -if __name__ == '__main__': - unittest.main() diff --git a/docker-compose.yml b/docker-compose.yml index f5519be..8d77875 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,60 +1,6 @@ version: '3.8' services: - flaskaled-srv1: - image: postgres:latest - container_name: flaskaled-srv1 - ports: - - "5433:5432" - volumes: - - ./backend/init-db1.sql:/docker-entrypoint-initdb.d/init-db1.sql - environment: - - POSTGRES_HOST=flaskaled-srv1 - - POSTGRES_PORT=5432 - - POSTGRES_DB=flaskaledDb1 - - POSTGRES_USER=flaskaled1 - - POSTGRES_PASSWORD=aled1 - restart: unless-stopped - - flaskaled-srv2: - image: postgres:latest - container_name: flaskaled-srv2 - ports: - - "5434:5432" - volumes: - - ./backend/init-db2.sql:/docker-entrypoint-initdb.d/init-db2.sql - environment: - - POSTGRES_HOST=flaskaled-srv2 - - POSTGRES_PORT=5432 - - POSTGRES_DB=flaskaledDb2 - - POSTGRES_USER=flaskaled2 - - POSTGRES_PASSWORD=aled2 - restart: unless-stopped - - backend: - container_name: backend - build: ./backend - command: python -m flask run --host=0.0.0.0 - ports: - - "5000:5000" - volumes: - - ./backend:/data/backend - depends_on: - - flaskaled-srv1 - - flaskaled-srv2 - links: - - flaskaled-srv1 - - flaskaled-srv2 - environment: - - FLASK_APP=app.py - - FLASK_ENV=development - - FLASK_DEBUG=1 - - PYTHONUNBUFFERED=1 - - DATABASE_URL_USERS=postgresql://flaskaled1:aled1@flaskaled-srv1/flaskaledDb1 - - DATABASE_URL_LOGS=postgresql://flaskaled2:aled2@flaskaled-srv2/flaskaledDb2 - - ALLOW_ORIGIN=frontend - - SECRET_KEY=default_secret_key - frontend: container_name: frontend build: ./frontend @@ -64,30 +10,5 @@ services: volumes: - ./frontend:/data/frontend - ./frontend/node_modules:/data/frontend/node_modules - depends_on: - - backend - links: - - backend environment: - - NODE_ENV=development - - test: - container_name: test - build: ./backend - command: python test.py - volumes: - - ./backend:/data/backend - depends_on: - - flaskaled-srv1 - - flaskaled-srv2 - links: - - flaskaled-srv1 - - flaskaled-srv2 - environment: - - FLASK_APP=app.py - - FLASK_ENV=test - - FLASK_DEBUG=0 - - PYTHONUNBUFFERED=1 - - DATABASE_URL_USERS=postgresql://flaskaled1:aled1@flaskaled-srv1/flaskaledDb1 - - DATABASE_URL_LOGS=postgresql://flaskaled2:aled2@flaskaled-srv2/flaskaledDb2 - - SECRET_KEY=default_secret_key + - NODE_ENV=development \ No newline at end of file diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts index 3612073..92c0bcc 100644 --- a/frontend/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -1,3 +1,4 @@ export const environment = { - production: true + production: true, + debutUrl: 'http://10.1.2.10:5000/api/' }; From 38098497a5440f55c9ffbf2bd564ea980f0b6376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20Vachot?= Date: Mon, 24 Jan 2022 22:17:11 +0100 Subject: [PATCH 02/31] Update: build && server frontend --- docker-compose.yml | 2 +- frontend/package.json | 3 ++- frontend/server.js | 13 +++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 frontend/server.js diff --git a/docker-compose.yml b/docker-compose.yml index 8d77875..f6b105e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,4 +11,4 @@ services: - ./frontend:/data/frontend - ./frontend/node_modules:/data/frontend/node_modules environment: - - NODE_ENV=development \ No newline at end of file + - NODE_ENV=production \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json index 43ae649..2f177c9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "ng serve --host 0.0.0.0", + "start": "ng build && node server.js", "build": "ng build", "watch": "ng build --watch --configuration development", "test": "ng test" @@ -21,6 +21,7 @@ "@angular/platform-browser-dynamic": "~13.1.1", "@angular/router": "~13.1.1", "bootstrap": "^5.1.3", + "express": "^4.17.2", "jquery": "^3.6.0", "popper": "^1.0.1", "rxjs": "~6.6.0", diff --git a/frontend/server.js b/frontend/server.js new file mode 100644 index 0000000..7398651 --- /dev/null +++ b/frontend/server.js @@ -0,0 +1,13 @@ +const path = require('path'); +const express = require('express'); +const app = express(); +const port = process.env.PORT || 4200; + +app.use(express.static(__dirname + '/dist/frontend')); +app.get('/*', function(req,res) { + res.sendFile(path.join(__dirname+ '/dist/frontend/index.html')); +}); + +app.listen(port, '0.0.0.0',() => { + console.log (`listening on port ${port}`); +}); From db79c561c72233d47c1bfe59ed8ed65425d373ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20Vachot?= Date: Mon, 24 Jan 2022 22:53:20 +0100 Subject: [PATCH 03/31] Update: build && server frontend --- frontend/.browserslistrc => .browserslistrc | 0 frontend/.editorconfig => .editorconfig | 0 frontend/.gitignore => .gitignore | 0 frontend/Dockerfile => Dockerfile | 4 ++-- frontend/README.md => README.md | 0 frontend/angular.json => angular.json | 0 docker-compose.yml | 8 ++++---- frontend/karma.conf.js => karma.conf.js | 0 frontend/package.json => package.json | 0 frontend/server.js => server.js | 0 .../src => src}/app/admin/myProfil/commentary.txt | 0 .../page-user-list/page-user-list.component.html | 0 .../page-user-list/page-user-list.component.scss | 0 .../page-user-list/page-user-list.component.spec.ts | 0 .../page-user-list/page-user-list.component.ts | 0 .../popup-create-person.component.html | 0 .../popup-create-person.component.scss | 0 .../popup-create-person.component.spec.ts | 0 .../popup-create-person.component.ts | 0 .../popup-update-person-admin.component.html | 0 .../popup-update-person-admin.component.scss | 0 .../popup-update-person-admin.component.spec.ts | 0 .../popup-update-person-admin.component.ts | 0 {frontend/src => src}/app/app-routing.module.ts | 0 {frontend/src => src}/app/app.component.html | 0 {frontend/src => src}/app/app.component.scss | 0 {frontend/src => src}/app/app.component.spec.ts | 0 {frontend/src => src}/app/app.component.ts | 0 {frontend/src => src}/app/app.module.ts | 0 .../common/components/navbar/navbar.component.html | 0 .../common/components/navbar/navbar.component.scss | 0 .../components/navbar/navbar.component.spec.ts | 0 .../common/components/navbar/navbar.component.ts | 0 .../page-profil/page-profil.component.html | 0 .../page-profil/page-profil.component.scss | 0 .../page-profil/page-profil.component.spec.ts | 0 .../components/page-profil/page-profil.component.ts | 0 .../popup-delete-profil.component.html | 0 .../popup-delete-profil.component.scss | 0 .../popup-delete-profil.component.spec.ts | 0 .../popup-delete-profil.component.ts | 0 .../popup-update-profil.component.html | 0 .../popup-update-profil.component.scss | 0 .../popup-update-profil.component.spec.ts | 0 .../popup-update-profil.component.ts | 0 .../app/common/guards/admin/admin.guard.spec.ts | 0 .../app/common/guards/admin/admin.guard.ts | 0 .../app/common/guards/user/user.guard.spec.ts | 0 .../app/common/guards/user/user.guard.ts | 0 .../services/checkEmail/check-email.service.spec.ts | 0 .../services/checkEmail/check-email.service.ts | 0 .../fictitious-datas.service.spec.ts | 0 .../fictitiousDatas/fictitious-datas.service.ts | 0 .../common/services/hashage/hashage.service.spec.ts | 0 .../app/common/services/hashage/hashage.service.ts | 0 .../common/services/message/message.service.spec.ts | 0 .../app/common/services/message/message.service.ts | 0 .../common/services/profil/profil.service.spec.ts | 0 .../app/common/services/profil/profil.service.ts | 0 .../app/login/page-login/page-login.component.html | 0 .../app/login/page-login/page-login.component.scss | 0 .../login/page-login/page-login.component.spec.ts | 0 .../app/login/page-login/page-login.component.ts | 0 .../page-register/page-register.component.html | 0 .../page-register/page-register.component.scss | 0 .../page-register/page-register.component.spec.ts | 0 .../page-register/page-register.component.ts | 0 .../popup-confirm-register.component.html | 0 .../popup-confirm-register.component.scss | 0 .../popup-confirm-register.component.spec.ts | 0 .../popup-confirm-register.component.ts | 0 .../src => src}/app/user/myProfil/commentary.txt | 0 .../user/page-registry/page-registry.component.html | 0 .../user/page-registry/page-registry.component.scss | 0 .../page-registry/page-registry.component.spec.ts | 0 .../user/page-registry/page-registry.component.ts | 0 {frontend/src => src}/assets/.gitkeep | 0 {frontend/src => src}/assets/logo.png | Bin {frontend/src => src}/assets/logo1.png | Bin .../src => src}/environments/environment.prod.ts | 0 {frontend/src => src}/environments/environment.ts | 0 {frontend/src => src}/favicon.ico | Bin {frontend/src => src}/index.html | 0 {frontend/src => src}/main.ts | 0 {frontend/src => src}/polyfills.ts | 0 {frontend/src => src}/styles.scss | 0 {frontend/src => src}/test.ts | 0 frontend/tsconfig.app.json => tsconfig.app.json | 0 frontend/tsconfig.json => tsconfig.json | 0 frontend/tsconfig.spec.json => tsconfig.spec.json | 0 90 files changed, 6 insertions(+), 6 deletions(-) rename frontend/.browserslistrc => .browserslistrc (100%) rename frontend/.editorconfig => .editorconfig (100%) rename frontend/.gitignore => .gitignore (100%) rename frontend/Dockerfile => Dockerfile (68%) rename frontend/README.md => README.md (100%) rename frontend/angular.json => angular.json (100%) rename frontend/karma.conf.js => karma.conf.js (100%) rename frontend/package.json => package.json (100%) rename frontend/server.js => server.js (100%) rename {frontend/src => src}/app/admin/myProfil/commentary.txt (100%) rename {frontend/src => src}/app/admin/userList/page-user-list/page-user-list.component.html (100%) rename {frontend/src => src}/app/admin/userList/page-user-list/page-user-list.component.scss (100%) rename {frontend/src => src}/app/admin/userList/page-user-list/page-user-list.component.spec.ts (100%) rename {frontend/src => src}/app/admin/userList/page-user-list/page-user-list.component.ts (100%) rename {frontend/src => src}/app/admin/userList/popup-create-person/popup-create-person.component.html (100%) rename {frontend/src => src}/app/admin/userList/popup-create-person/popup-create-person.component.scss (100%) rename {frontend/src => src}/app/admin/userList/popup-create-person/popup-create-person.component.spec.ts (100%) rename {frontend/src => src}/app/admin/userList/popup-create-person/popup-create-person.component.ts (100%) rename {frontend/src => src}/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.html (100%) rename {frontend/src => src}/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.scss (100%) rename {frontend/src => src}/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.spec.ts (100%) rename {frontend/src => src}/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.ts (100%) rename {frontend/src => src}/app/app-routing.module.ts (100%) rename {frontend/src => src}/app/app.component.html (100%) rename {frontend/src => src}/app/app.component.scss (100%) rename {frontend/src => src}/app/app.component.spec.ts (100%) rename {frontend/src => src}/app/app.component.ts (100%) rename {frontend/src => src}/app/app.module.ts (100%) rename {frontend/src => src}/app/common/components/navbar/navbar.component.html (100%) rename {frontend/src => src}/app/common/components/navbar/navbar.component.scss (100%) rename {frontend/src => src}/app/common/components/navbar/navbar.component.spec.ts (100%) rename {frontend/src => src}/app/common/components/navbar/navbar.component.ts (100%) rename {frontend/src => src}/app/common/components/page-profil/page-profil.component.html (100%) rename {frontend/src => src}/app/common/components/page-profil/page-profil.component.scss (100%) rename {frontend/src => src}/app/common/components/page-profil/page-profil.component.spec.ts (100%) rename {frontend/src => src}/app/common/components/page-profil/page-profil.component.ts (100%) rename {frontend/src => src}/app/common/components/popup-delete-profil/popup-delete-profil.component.html (100%) rename {frontend/src => src}/app/common/components/popup-delete-profil/popup-delete-profil.component.scss (100%) rename {frontend/src => src}/app/common/components/popup-delete-profil/popup-delete-profil.component.spec.ts (100%) rename {frontend/src => src}/app/common/components/popup-delete-profil/popup-delete-profil.component.ts (100%) rename {frontend/src => src}/app/common/components/popup-update-profil/popup-update-profil.component.html (100%) rename {frontend/src => src}/app/common/components/popup-update-profil/popup-update-profil.component.scss (100%) rename {frontend/src => src}/app/common/components/popup-update-profil/popup-update-profil.component.spec.ts (100%) rename {frontend/src => src}/app/common/components/popup-update-profil/popup-update-profil.component.ts (100%) rename {frontend/src => src}/app/common/guards/admin/admin.guard.spec.ts (100%) rename {frontend/src => src}/app/common/guards/admin/admin.guard.ts (100%) rename {frontend/src => src}/app/common/guards/user/user.guard.spec.ts (100%) rename {frontend/src => src}/app/common/guards/user/user.guard.ts (100%) rename {frontend/src => src}/app/common/services/checkEmail/check-email.service.spec.ts (100%) rename {frontend/src => src}/app/common/services/checkEmail/check-email.service.ts (100%) rename {frontend/src => src}/app/common/services/fictitiousDatas/fictitious-datas.service.spec.ts (100%) rename {frontend/src => src}/app/common/services/fictitiousDatas/fictitious-datas.service.ts (100%) rename {frontend/src => src}/app/common/services/hashage/hashage.service.spec.ts (100%) rename {frontend/src => src}/app/common/services/hashage/hashage.service.ts (100%) rename {frontend/src => src}/app/common/services/message/message.service.spec.ts (100%) rename {frontend/src => src}/app/common/services/message/message.service.ts (100%) rename {frontend/src => src}/app/common/services/profil/profil.service.spec.ts (100%) rename {frontend/src => src}/app/common/services/profil/profil.service.ts (100%) rename {frontend/src => src}/app/login/page-login/page-login.component.html (100%) rename {frontend/src => src}/app/login/page-login/page-login.component.scss (100%) rename {frontend/src => src}/app/login/page-login/page-login.component.spec.ts (100%) rename {frontend/src => src}/app/login/page-login/page-login.component.ts (100%) rename {frontend/src => src}/app/register/page-register/page-register.component.html (100%) rename {frontend/src => src}/app/register/page-register/page-register.component.scss (100%) rename {frontend/src => src}/app/register/page-register/page-register.component.spec.ts (100%) rename {frontend/src => src}/app/register/page-register/page-register.component.ts (100%) rename {frontend/src => src}/app/register/popup-confirm-register/popup-confirm-register.component.html (100%) rename {frontend/src => src}/app/register/popup-confirm-register/popup-confirm-register.component.scss (100%) rename {frontend/src => src}/app/register/popup-confirm-register/popup-confirm-register.component.spec.ts (100%) rename {frontend/src => src}/app/register/popup-confirm-register/popup-confirm-register.component.ts (100%) rename {frontend/src => src}/app/user/myProfil/commentary.txt (100%) rename {frontend/src => src}/app/user/page-registry/page-registry.component.html (100%) rename {frontend/src => src}/app/user/page-registry/page-registry.component.scss (100%) rename {frontend/src => src}/app/user/page-registry/page-registry.component.spec.ts (100%) rename {frontend/src => src}/app/user/page-registry/page-registry.component.ts (100%) rename {frontend/src => src}/assets/.gitkeep (100%) rename {frontend/src => src}/assets/logo.png (100%) rename {frontend/src => src}/assets/logo1.png (100%) rename {frontend/src => src}/environments/environment.prod.ts (100%) rename {frontend/src => src}/environments/environment.ts (100%) rename {frontend/src => src}/favicon.ico (100%) rename {frontend/src => src}/index.html (100%) rename {frontend/src => src}/main.ts (100%) rename {frontend/src => src}/polyfills.ts (100%) rename {frontend/src => src}/styles.scss (100%) rename {frontend/src => src}/test.ts (100%) rename frontend/tsconfig.app.json => tsconfig.app.json (100%) rename frontend/tsconfig.json => tsconfig.json (100%) rename frontend/tsconfig.spec.json => tsconfig.spec.json (100%) diff --git a/frontend/.browserslistrc b/.browserslistrc similarity index 100% rename from frontend/.browserslistrc rename to .browserslistrc diff --git a/frontend/.editorconfig b/.editorconfig similarity index 100% rename from frontend/.editorconfig rename to .editorconfig diff --git a/frontend/.gitignore b/.gitignore similarity index 100% rename from frontend/.gitignore rename to .gitignore diff --git a/frontend/Dockerfile b/Dockerfile similarity index 68% rename from frontend/Dockerfile rename to Dockerfile index b0c17cc..e936fe3 100644 --- a/frontend/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM node:latest -WORKDIR /data/frontend +WORKDIR /app-frontend COPY ["package.json", "package-lock.json*", "./"] -RUN npm install --NODE_ENV +RUN npm install RUN npm install -g @angular/cli COPY . . diff --git a/frontend/README.md b/README.md similarity index 100% rename from frontend/README.md rename to README.md diff --git a/frontend/angular.json b/angular.json similarity index 100% rename from frontend/angular.json rename to angular.json diff --git a/docker-compose.yml b/docker-compose.yml index f6b105e..5800f07 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,12 +3,12 @@ version: '3.8' services: frontend: container_name: frontend - build: ./frontend + build: . command: npm start ports: - "4200:4200" volumes: - - ./frontend:/data/frontend - - ./frontend/node_modules:/data/frontend/node_modules + - ./src:/data/frontend + - ./node_modules:/data/frontend/node_modules environment: - - NODE_ENV=production \ No newline at end of file + - NODE_ENV=production diff --git a/frontend/karma.conf.js b/karma.conf.js similarity index 100% rename from frontend/karma.conf.js rename to karma.conf.js diff --git a/frontend/package.json b/package.json similarity index 100% rename from frontend/package.json rename to package.json diff --git a/frontend/server.js b/server.js similarity index 100% rename from frontend/server.js rename to server.js diff --git a/frontend/src/app/admin/myProfil/commentary.txt b/src/app/admin/myProfil/commentary.txt similarity index 100% rename from frontend/src/app/admin/myProfil/commentary.txt rename to src/app/admin/myProfil/commentary.txt diff --git a/frontend/src/app/admin/userList/page-user-list/page-user-list.component.html b/src/app/admin/userList/page-user-list/page-user-list.component.html similarity index 100% rename from frontend/src/app/admin/userList/page-user-list/page-user-list.component.html rename to src/app/admin/userList/page-user-list/page-user-list.component.html diff --git a/frontend/src/app/admin/userList/page-user-list/page-user-list.component.scss b/src/app/admin/userList/page-user-list/page-user-list.component.scss similarity index 100% rename from frontend/src/app/admin/userList/page-user-list/page-user-list.component.scss rename to src/app/admin/userList/page-user-list/page-user-list.component.scss diff --git a/frontend/src/app/admin/userList/page-user-list/page-user-list.component.spec.ts b/src/app/admin/userList/page-user-list/page-user-list.component.spec.ts similarity index 100% rename from frontend/src/app/admin/userList/page-user-list/page-user-list.component.spec.ts rename to src/app/admin/userList/page-user-list/page-user-list.component.spec.ts diff --git a/frontend/src/app/admin/userList/page-user-list/page-user-list.component.ts b/src/app/admin/userList/page-user-list/page-user-list.component.ts similarity index 100% rename from frontend/src/app/admin/userList/page-user-list/page-user-list.component.ts rename to src/app/admin/userList/page-user-list/page-user-list.component.ts diff --git a/frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.html b/src/app/admin/userList/popup-create-person/popup-create-person.component.html similarity index 100% rename from frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.html rename to src/app/admin/userList/popup-create-person/popup-create-person.component.html diff --git a/frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.scss b/src/app/admin/userList/popup-create-person/popup-create-person.component.scss similarity index 100% rename from frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.scss rename to src/app/admin/userList/popup-create-person/popup-create-person.component.scss diff --git a/frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.spec.ts b/src/app/admin/userList/popup-create-person/popup-create-person.component.spec.ts similarity index 100% rename from frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.spec.ts rename to src/app/admin/userList/popup-create-person/popup-create-person.component.spec.ts diff --git a/frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.ts b/src/app/admin/userList/popup-create-person/popup-create-person.component.ts similarity index 100% rename from frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.ts rename to src/app/admin/userList/popup-create-person/popup-create-person.component.ts diff --git a/frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.html b/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.html similarity index 100% rename from frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.html rename to src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.html diff --git a/frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.scss b/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.scss similarity index 100% rename from frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.scss rename to src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.scss diff --git a/frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.spec.ts b/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.spec.ts similarity index 100% rename from frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.spec.ts rename to src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.spec.ts diff --git a/frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.ts b/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.ts similarity index 100% rename from frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.ts rename to src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.ts diff --git a/frontend/src/app/app-routing.module.ts b/src/app/app-routing.module.ts similarity index 100% rename from frontend/src/app/app-routing.module.ts rename to src/app/app-routing.module.ts diff --git a/frontend/src/app/app.component.html b/src/app/app.component.html similarity index 100% rename from frontend/src/app/app.component.html rename to src/app/app.component.html diff --git a/frontend/src/app/app.component.scss b/src/app/app.component.scss similarity index 100% rename from frontend/src/app/app.component.scss rename to src/app/app.component.scss diff --git a/frontend/src/app/app.component.spec.ts b/src/app/app.component.spec.ts similarity index 100% rename from frontend/src/app/app.component.spec.ts rename to src/app/app.component.spec.ts diff --git a/frontend/src/app/app.component.ts b/src/app/app.component.ts similarity index 100% rename from frontend/src/app/app.component.ts rename to src/app/app.component.ts diff --git a/frontend/src/app/app.module.ts b/src/app/app.module.ts similarity index 100% rename from frontend/src/app/app.module.ts rename to src/app/app.module.ts diff --git a/frontend/src/app/common/components/navbar/navbar.component.html b/src/app/common/components/navbar/navbar.component.html similarity index 100% rename from frontend/src/app/common/components/navbar/navbar.component.html rename to src/app/common/components/navbar/navbar.component.html diff --git a/frontend/src/app/common/components/navbar/navbar.component.scss b/src/app/common/components/navbar/navbar.component.scss similarity index 100% rename from frontend/src/app/common/components/navbar/navbar.component.scss rename to src/app/common/components/navbar/navbar.component.scss diff --git a/frontend/src/app/common/components/navbar/navbar.component.spec.ts b/src/app/common/components/navbar/navbar.component.spec.ts similarity index 100% rename from frontend/src/app/common/components/navbar/navbar.component.spec.ts rename to src/app/common/components/navbar/navbar.component.spec.ts diff --git a/frontend/src/app/common/components/navbar/navbar.component.ts b/src/app/common/components/navbar/navbar.component.ts similarity index 100% rename from frontend/src/app/common/components/navbar/navbar.component.ts rename to src/app/common/components/navbar/navbar.component.ts diff --git a/frontend/src/app/common/components/page-profil/page-profil.component.html b/src/app/common/components/page-profil/page-profil.component.html similarity index 100% rename from frontend/src/app/common/components/page-profil/page-profil.component.html rename to src/app/common/components/page-profil/page-profil.component.html diff --git a/frontend/src/app/common/components/page-profil/page-profil.component.scss b/src/app/common/components/page-profil/page-profil.component.scss similarity index 100% rename from frontend/src/app/common/components/page-profil/page-profil.component.scss rename to src/app/common/components/page-profil/page-profil.component.scss diff --git a/frontend/src/app/common/components/page-profil/page-profil.component.spec.ts b/src/app/common/components/page-profil/page-profil.component.spec.ts similarity index 100% rename from frontend/src/app/common/components/page-profil/page-profil.component.spec.ts rename to src/app/common/components/page-profil/page-profil.component.spec.ts diff --git a/frontend/src/app/common/components/page-profil/page-profil.component.ts b/src/app/common/components/page-profil/page-profil.component.ts similarity index 100% rename from frontend/src/app/common/components/page-profil/page-profil.component.ts rename to src/app/common/components/page-profil/page-profil.component.ts diff --git a/frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.html b/src/app/common/components/popup-delete-profil/popup-delete-profil.component.html similarity index 100% rename from frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.html rename to src/app/common/components/popup-delete-profil/popup-delete-profil.component.html diff --git a/frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.scss b/src/app/common/components/popup-delete-profil/popup-delete-profil.component.scss similarity index 100% rename from frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.scss rename to src/app/common/components/popup-delete-profil/popup-delete-profil.component.scss diff --git a/frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.spec.ts b/src/app/common/components/popup-delete-profil/popup-delete-profil.component.spec.ts similarity index 100% rename from frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.spec.ts rename to src/app/common/components/popup-delete-profil/popup-delete-profil.component.spec.ts diff --git a/frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.ts b/src/app/common/components/popup-delete-profil/popup-delete-profil.component.ts similarity index 100% rename from frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.ts rename to src/app/common/components/popup-delete-profil/popup-delete-profil.component.ts diff --git a/frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.html b/src/app/common/components/popup-update-profil/popup-update-profil.component.html similarity index 100% rename from frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.html rename to src/app/common/components/popup-update-profil/popup-update-profil.component.html diff --git a/frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.scss b/src/app/common/components/popup-update-profil/popup-update-profil.component.scss similarity index 100% rename from frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.scss rename to src/app/common/components/popup-update-profil/popup-update-profil.component.scss diff --git a/frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.spec.ts b/src/app/common/components/popup-update-profil/popup-update-profil.component.spec.ts similarity index 100% rename from frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.spec.ts rename to src/app/common/components/popup-update-profil/popup-update-profil.component.spec.ts diff --git a/frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.ts b/src/app/common/components/popup-update-profil/popup-update-profil.component.ts similarity index 100% rename from frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.ts rename to src/app/common/components/popup-update-profil/popup-update-profil.component.ts diff --git a/frontend/src/app/common/guards/admin/admin.guard.spec.ts b/src/app/common/guards/admin/admin.guard.spec.ts similarity index 100% rename from frontend/src/app/common/guards/admin/admin.guard.spec.ts rename to src/app/common/guards/admin/admin.guard.spec.ts diff --git a/frontend/src/app/common/guards/admin/admin.guard.ts b/src/app/common/guards/admin/admin.guard.ts similarity index 100% rename from frontend/src/app/common/guards/admin/admin.guard.ts rename to src/app/common/guards/admin/admin.guard.ts diff --git a/frontend/src/app/common/guards/user/user.guard.spec.ts b/src/app/common/guards/user/user.guard.spec.ts similarity index 100% rename from frontend/src/app/common/guards/user/user.guard.spec.ts rename to src/app/common/guards/user/user.guard.spec.ts diff --git a/frontend/src/app/common/guards/user/user.guard.ts b/src/app/common/guards/user/user.guard.ts similarity index 100% rename from frontend/src/app/common/guards/user/user.guard.ts rename to src/app/common/guards/user/user.guard.ts diff --git a/frontend/src/app/common/services/checkEmail/check-email.service.spec.ts b/src/app/common/services/checkEmail/check-email.service.spec.ts similarity index 100% rename from frontend/src/app/common/services/checkEmail/check-email.service.spec.ts rename to src/app/common/services/checkEmail/check-email.service.spec.ts diff --git a/frontend/src/app/common/services/checkEmail/check-email.service.ts b/src/app/common/services/checkEmail/check-email.service.ts similarity index 100% rename from frontend/src/app/common/services/checkEmail/check-email.service.ts rename to src/app/common/services/checkEmail/check-email.service.ts diff --git a/frontend/src/app/common/services/fictitiousDatas/fictitious-datas.service.spec.ts b/src/app/common/services/fictitiousDatas/fictitious-datas.service.spec.ts similarity index 100% rename from frontend/src/app/common/services/fictitiousDatas/fictitious-datas.service.spec.ts rename to src/app/common/services/fictitiousDatas/fictitious-datas.service.spec.ts diff --git a/frontend/src/app/common/services/fictitiousDatas/fictitious-datas.service.ts b/src/app/common/services/fictitiousDatas/fictitious-datas.service.ts similarity index 100% rename from frontend/src/app/common/services/fictitiousDatas/fictitious-datas.service.ts rename to src/app/common/services/fictitiousDatas/fictitious-datas.service.ts diff --git a/frontend/src/app/common/services/hashage/hashage.service.spec.ts b/src/app/common/services/hashage/hashage.service.spec.ts similarity index 100% rename from frontend/src/app/common/services/hashage/hashage.service.spec.ts rename to src/app/common/services/hashage/hashage.service.spec.ts diff --git a/frontend/src/app/common/services/hashage/hashage.service.ts b/src/app/common/services/hashage/hashage.service.ts similarity index 100% rename from frontend/src/app/common/services/hashage/hashage.service.ts rename to src/app/common/services/hashage/hashage.service.ts diff --git a/frontend/src/app/common/services/message/message.service.spec.ts b/src/app/common/services/message/message.service.spec.ts similarity index 100% rename from frontend/src/app/common/services/message/message.service.spec.ts rename to src/app/common/services/message/message.service.spec.ts diff --git a/frontend/src/app/common/services/message/message.service.ts b/src/app/common/services/message/message.service.ts similarity index 100% rename from frontend/src/app/common/services/message/message.service.ts rename to src/app/common/services/message/message.service.ts diff --git a/frontend/src/app/common/services/profil/profil.service.spec.ts b/src/app/common/services/profil/profil.service.spec.ts similarity index 100% rename from frontend/src/app/common/services/profil/profil.service.spec.ts rename to src/app/common/services/profil/profil.service.spec.ts diff --git a/frontend/src/app/common/services/profil/profil.service.ts b/src/app/common/services/profil/profil.service.ts similarity index 100% rename from frontend/src/app/common/services/profil/profil.service.ts rename to src/app/common/services/profil/profil.service.ts diff --git a/frontend/src/app/login/page-login/page-login.component.html b/src/app/login/page-login/page-login.component.html similarity index 100% rename from frontend/src/app/login/page-login/page-login.component.html rename to src/app/login/page-login/page-login.component.html diff --git a/frontend/src/app/login/page-login/page-login.component.scss b/src/app/login/page-login/page-login.component.scss similarity index 100% rename from frontend/src/app/login/page-login/page-login.component.scss rename to src/app/login/page-login/page-login.component.scss diff --git a/frontend/src/app/login/page-login/page-login.component.spec.ts b/src/app/login/page-login/page-login.component.spec.ts similarity index 100% rename from frontend/src/app/login/page-login/page-login.component.spec.ts rename to src/app/login/page-login/page-login.component.spec.ts diff --git a/frontend/src/app/login/page-login/page-login.component.ts b/src/app/login/page-login/page-login.component.ts similarity index 100% rename from frontend/src/app/login/page-login/page-login.component.ts rename to src/app/login/page-login/page-login.component.ts diff --git a/frontend/src/app/register/page-register/page-register.component.html b/src/app/register/page-register/page-register.component.html similarity index 100% rename from frontend/src/app/register/page-register/page-register.component.html rename to src/app/register/page-register/page-register.component.html diff --git a/frontend/src/app/register/page-register/page-register.component.scss b/src/app/register/page-register/page-register.component.scss similarity index 100% rename from frontend/src/app/register/page-register/page-register.component.scss rename to src/app/register/page-register/page-register.component.scss diff --git a/frontend/src/app/register/page-register/page-register.component.spec.ts b/src/app/register/page-register/page-register.component.spec.ts similarity index 100% rename from frontend/src/app/register/page-register/page-register.component.spec.ts rename to src/app/register/page-register/page-register.component.spec.ts diff --git a/frontend/src/app/register/page-register/page-register.component.ts b/src/app/register/page-register/page-register.component.ts similarity index 100% rename from frontend/src/app/register/page-register/page-register.component.ts rename to src/app/register/page-register/page-register.component.ts diff --git a/frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.html b/src/app/register/popup-confirm-register/popup-confirm-register.component.html similarity index 100% rename from frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.html rename to src/app/register/popup-confirm-register/popup-confirm-register.component.html diff --git a/frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.scss b/src/app/register/popup-confirm-register/popup-confirm-register.component.scss similarity index 100% rename from frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.scss rename to src/app/register/popup-confirm-register/popup-confirm-register.component.scss diff --git a/frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.spec.ts b/src/app/register/popup-confirm-register/popup-confirm-register.component.spec.ts similarity index 100% rename from frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.spec.ts rename to src/app/register/popup-confirm-register/popup-confirm-register.component.spec.ts diff --git a/frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.ts b/src/app/register/popup-confirm-register/popup-confirm-register.component.ts similarity index 100% rename from frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.ts rename to src/app/register/popup-confirm-register/popup-confirm-register.component.ts diff --git a/frontend/src/app/user/myProfil/commentary.txt b/src/app/user/myProfil/commentary.txt similarity index 100% rename from frontend/src/app/user/myProfil/commentary.txt rename to src/app/user/myProfil/commentary.txt diff --git a/frontend/src/app/user/page-registry/page-registry.component.html b/src/app/user/page-registry/page-registry.component.html similarity index 100% rename from frontend/src/app/user/page-registry/page-registry.component.html rename to src/app/user/page-registry/page-registry.component.html diff --git a/frontend/src/app/user/page-registry/page-registry.component.scss b/src/app/user/page-registry/page-registry.component.scss similarity index 100% rename from frontend/src/app/user/page-registry/page-registry.component.scss rename to src/app/user/page-registry/page-registry.component.scss diff --git a/frontend/src/app/user/page-registry/page-registry.component.spec.ts b/src/app/user/page-registry/page-registry.component.spec.ts similarity index 100% rename from frontend/src/app/user/page-registry/page-registry.component.spec.ts rename to src/app/user/page-registry/page-registry.component.spec.ts diff --git a/frontend/src/app/user/page-registry/page-registry.component.ts b/src/app/user/page-registry/page-registry.component.ts similarity index 100% rename from frontend/src/app/user/page-registry/page-registry.component.ts rename to src/app/user/page-registry/page-registry.component.ts diff --git a/frontend/src/assets/.gitkeep b/src/assets/.gitkeep similarity index 100% rename from frontend/src/assets/.gitkeep rename to src/assets/.gitkeep diff --git a/frontend/src/assets/logo.png b/src/assets/logo.png similarity index 100% rename from frontend/src/assets/logo.png rename to src/assets/logo.png diff --git a/frontend/src/assets/logo1.png b/src/assets/logo1.png similarity index 100% rename from frontend/src/assets/logo1.png rename to src/assets/logo1.png diff --git a/frontend/src/environments/environment.prod.ts b/src/environments/environment.prod.ts similarity index 100% rename from frontend/src/environments/environment.prod.ts rename to src/environments/environment.prod.ts diff --git a/frontend/src/environments/environment.ts b/src/environments/environment.ts similarity index 100% rename from frontend/src/environments/environment.ts rename to src/environments/environment.ts diff --git a/frontend/src/favicon.ico b/src/favicon.ico similarity index 100% rename from frontend/src/favicon.ico rename to src/favicon.ico diff --git a/frontend/src/index.html b/src/index.html similarity index 100% rename from frontend/src/index.html rename to src/index.html diff --git a/frontend/src/main.ts b/src/main.ts similarity index 100% rename from frontend/src/main.ts rename to src/main.ts diff --git a/frontend/src/polyfills.ts b/src/polyfills.ts similarity index 100% rename from frontend/src/polyfills.ts rename to src/polyfills.ts diff --git a/frontend/src/styles.scss b/src/styles.scss similarity index 100% rename from frontend/src/styles.scss rename to src/styles.scss diff --git a/frontend/src/test.ts b/src/test.ts similarity index 100% rename from frontend/src/test.ts rename to src/test.ts diff --git a/frontend/tsconfig.app.json b/tsconfig.app.json similarity index 100% rename from frontend/tsconfig.app.json rename to tsconfig.app.json diff --git a/frontend/tsconfig.json b/tsconfig.json similarity index 100% rename from frontend/tsconfig.json rename to tsconfig.json diff --git a/frontend/tsconfig.spec.json b/tsconfig.spec.json similarity index 100% rename from frontend/tsconfig.spec.json rename to tsconfig.spec.json From 1c522160b811755aee3be0acc5d6ddf0b4600393 Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Fri, 28 Jan 2022 12:05:38 +0100 Subject: [PATCH 04/31] reverse-proxy nginx --- conf/nginx.conf | 36 ++++++++++++++++++++++++++++++++++++ docker-compose.yml | 21 +++++++++++++++++++-- logs/nginx/access.log | 21 +++++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 conf/nginx.conf create mode 100644 logs/nginx/access.log diff --git a/conf/nginx.conf b/conf/nginx.conf new file mode 100644 index 0000000..375380c --- /dev/null +++ b/conf/nginx.conf @@ -0,0 +1,36 @@ +events { + worker_connections 1024; +} + +http { + + resolver 127.0.0.11 ipv6=off; + + proxy_redirect off; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + client_max_body_size 100m; + client_body_buffer_size 128k; + proxy_connect_timeout 90; + proxy_send_timeout 90; + proxy_read_timeout 90; + proxy_buffers 32 4k; + + upstream frontend { + server frontend:4200; + } + + + server { + listen 80; + server_name wordpress; + access_log logs/access.log; + + location / { + proxy_pass http://frontend; + } + + } + +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 5800f07..fcb4319 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,14 +1,31 @@ version: '3.8' services: + nginx: + image: nginx:latest + volumes: + - ./conf/nginx.conf:/etc/nginx/nginx.conf + - ./logs/nginx:/etc/nginx/logs + - ./cert:/etc/nginx/cert + networks: + - net + ports: + - 80:80 + frontend: container_name: frontend build: . command: npm start - ports: - - "4200:4200" + # ports: + # - "4200:4200" volumes: - ./src:/data/frontend - ./node_modules:/data/frontend/node_modules environment: - NODE_ENV=production + networks: + - net + +networks: + net: + driver: bridge diff --git a/logs/nginx/access.log b/logs/nginx/access.log new file mode 100644 index 0000000..98ba7b7 --- /dev/null +++ b/logs/nginx/access.log @@ -0,0 +1,21 @@ +192.168.0.1 - - [28/Jan/2022:11:02:32 +0000] "GET / HTTP/1.1" 200 2713 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.0.1 - - [28/Jan/2022:11:02:32 +0000] "GET /polyfills.0cf80192f5858f6f.js HTTP/1.1" 200 37090 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.0.1 - - [28/Jan/2022:11:02:32 +0000] "GET /runtime.aaedba49815d2ab0.js HTTP/1.1" 200 1066 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.0.1 - - [28/Jan/2022:11:02:32 +0000] "GET /styles.f64087845b474dd2.css HTTP/1.1" 200 235504 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.0.1 - - [28/Jan/2022:11:02:32 +0000] "GET /main.d1e7791aa69a6ada.js HTTP/1.1" 200 694159 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.0.1 - - [28/Jan/2022:11:02:33 +0000] "GET /assets/logo.png HTTP/1.1" 200 201990 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.0.1 - - [28/Jan/2022:11:02:33 +0000] "GET /favicon.ico HTTP/1.1" 200 948 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.0.1 - - [28/Jan/2022:11:02:41 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.0.1 - - [28/Jan/2022:11:02:41 +0000] "GET /polyfills.0cf80192f5858f6f.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.0.1 - - [28/Jan/2022:11:02:41 +0000] "GET /runtime.aaedba49815d2ab0.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.0.1 - - [28/Jan/2022:11:02:41 +0000] "GET /main.d1e7791aa69a6ada.js HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.16.1 - - [28/Jan/2022:11:03:38 +0000] "GET / HTTP/1.1" 200 2713 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.16.1 - - [28/Jan/2022:11:03:38 +0000] "GET /styles.f64087845b474dd2.css HTTP/1.1" 200 235504 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.16.1 - - [28/Jan/2022:11:03:38 +0000] "GET /assets/logo.png HTTP/1.1" 200 201990 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.16.1 - - [28/Jan/2022:11:04:23 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.16.1 - - [28/Jan/2022:11:04:23 +0000] "GET /runtime.aaedba49815d2ab0.js HTTP/1.1" 200 1066 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.16.1 - - [28/Jan/2022:11:04:23 +0000] "GET /polyfills.0cf80192f5858f6f.js HTTP/1.1" 200 37090 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.16.1 - - [28/Jan/2022:11:04:23 +0000] "GET /main.d1e7791aa69a6ada.js HTTP/1.1" 200 694159 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.16.1 - - [28/Jan/2022:11:04:23 +0000] "GET /styles.f64087845b474dd2.css HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.16.1 - - [28/Jan/2022:11:04:23 +0000] "GET /assets/logo.png HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +192.168.16.1 - - [28/Jan/2022:11:04:23 +0000] "GET /favicon.ico HTTP/1.1" 200 948 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" From c1300fdb5f6bb5af46286928989fce022ec6d78b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20Vachot?= Date: Sat, 29 Jan 2022 17:18:43 +0100 Subject: [PATCH 05/31] Test: Not finished --- angular.json | 2 +- backend/Dockerfile | 6 + backend/app.py | 8 + backend/application/__init__.py | 35 +++ backend/application/responses.py | 35 +++ backend/application/routes.py | 375 +++++++++++++++++++++++++++ backend/application/sessionJWT.py | 39 +++ backend/config.py | 31 +++ backend/requirements.txt | 13 + package.json | 4 +- server.js | 13 - src/environments/environment.prod.ts | 2 +- 12 files changed, 546 insertions(+), 17 deletions(-) create mode 100644 backend/Dockerfile create mode 100644 backend/app.py create mode 100644 backend/application/__init__.py create mode 100644 backend/application/responses.py create mode 100644 backend/application/routes.py create mode 100644 backend/application/sessionJWT.py create mode 100644 backend/config.py create mode 100644 backend/requirements.txt delete mode 100644 server.js diff --git a/angular.json b/angular.json index 99c397a..a21c621 100644 --- a/angular.json +++ b/angular.json @@ -20,7 +20,7 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "outputPath": "dist/frontend", + "outputPath": "backend/static", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..2987276 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,6 @@ +FROM python:latest +WORKDIR /data/backend +COPY requirements.txt requirements.txt +RUN pip install --upgrade pip +RUN pip install -r requirements.txt +COPY . . \ No newline at end of file diff --git a/backend/app.py b/backend/app.py new file mode 100644 index 0000000..50e795c --- /dev/null +++ b/backend/app.py @@ -0,0 +1,8 @@ +from application import create_app +import os + +app = create_app(os.environ.get('FLASK_ENV', None)) + +if __name__ == "__main__": + PORT = os.environ.get('PORT', 33507) + app.run(host='0.0.0.0', port=PORT, DEBUG=True) diff --git a/backend/application/__init__.py b/backend/application/__init__.py new file mode 100644 index 0000000..b68cd09 --- /dev/null +++ b/backend/application/__init__.py @@ -0,0 +1,35 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from flask_cors import CORS +import sys + +db = SQLAlchemy() + + +def create_app(flask_env='development'): + app = Flask(__name__, instance_relative_config=False) + origin = app.config.get('ALLOW_ORIGIN') + if origin is None: + origin = ['http://127.0.0.1:4200', 'http://localhost:4200'] + CORS(app, supports_credentials=True, origins=origin) + if flask_env == 'production': + app.config.from_object("config.ProductionConfig") + elif flask_env == 'testing': + app.config.from_object("config.TestingConfig") + elif flask_env == 'development': + app.config.from_object("config.DevelopmentConfig") + else: + app.config.from_object("config.Config") + + if app.config['SQLALCHEMY_DATABASE_URI_1'] is None or app.config['SQLALCHEMY_DATABASE_URI_2'] is None: + print('No ENV Variable for DATABASE_URL_USERS or DATABASE_URL_LOGS') + sys.exit(1) + else: + print('ENV Variables passed : ', app.config['SQLALCHEMY_BINDS']) + + db.init_app(app) + with app.app_context(): + from . import routes + app.register_blueprint(routes.bp) + db.create_all() + return app diff --git a/backend/application/responses.py b/backend/application/responses.py new file mode 100644 index 0000000..03e11a6 --- /dev/null +++ b/backend/application/responses.py @@ -0,0 +1,35 @@ +from flask import current_app as app +import json + + +def send_error(status_code, message, token=None): + data_json = { + 'status': 'error', + 'message': message + } + res = app.response_class( + response=json.dumps(data_json), + status=status_code, + mimetype='application/json' + ) + if token is not None: + res.set_cookie('SESSIONID', token) + return res + + +def send_message(message, data, token=None, token_delete=False): + data_json = { + 'status': 'success', + 'message': message, + 'data': data + } + res = app.response_class( + response=json.dumps(data_json), + status=200, + mimetype='application/json' + ) + if token is not None: + res.set_cookie('SESSIONID', token) + if token_delete: + res.delete_cookie('SESSIONID') + return res diff --git a/backend/application/routes.py b/backend/application/routes.py new file mode 100644 index 0000000..ae9445e --- /dev/null +++ b/backend/application/routes.py @@ -0,0 +1,375 @@ +from flask import request, Blueprint, render_template, current_app as app +from werkzeug.exceptions import HTTPException +from .responses import send_message, send_error +import requests +from .sessionJWT import create_auth_token, check_auth_token + + +# Request Post +def request_post(url, data_json): + return requests.post(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) + + +# Request Put +def request_put(url, data_json): + return requests.put(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) + + +# Request Get +def request_get(url): + return requests.get(app.config['SQLALCHEMY_BINDS'] + url) + + +# Request Delete +def request_delete(url, data_json): + return requests.delete(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) + + +bp = Blueprint('myapp', __name__) + + +@bp.app_errorhandler(HTTPException) +def handle_exception(e): + return send_error(e.code, e.name) + + +@bp.route('/', methods=['GET']) +def root(): + return render_template('index.html') + + +# Login +@bp.route('/api/login', methods=['POST']) +def login(): + post_json = request.json + try: + post_email = str(post_json['email']) + post_password = str(post_json['password']) + if post_email != '' and post_password != '': + ip = request.remote_addr + # res = db_login(ip, post_email, post_password) + res = request_post('login', {'ip': ip, 'email': post_email, 'password': post_password}).json() + if res['status'] == 0: + user = res['data'] + token = create_auth_token(user) + return send_message(res['message'], user, token) + elif res['status'] == 1: + user = None + token = create_auth_token(user) + return send_error(400, res['message'], token) + else: + return send_error(400, 'Empty email and/or password fields.') + except KeyError as e: + return send_error(400, 'Need email, password fields.') + + +# Register +@bp.route('/api/register', methods=['POST']) +def register(): + post_json = request.json + try: + post_email = str(post_json['email']) + post_nickname = str(post_json['nickname']) + post_password = str(post_json['password']) + if post_email != '' and post_password != '' and post_nickname != '': + ip = request.remote_addr + # res = db_register(ip, post_email, post_nickname, post_password) + res = request_post('register', {'ip': ip, 'email': post_email, 'nickname': post_nickname, 'password': post_password}).json() + if res['status'] == 1: + return send_error(500, res['message']) + elif res['status'] == 0: + return send_message(res['message'], res['data']) + else: + return send_error(400, 'Empty email and/or password and/or nickname fields.') + except KeyError as e: + return send_error(400, 'Need ' + str(e) + 'field.') + + +# Logout +@bp.route('/api/logout', methods=['DELETE']) +def logout(): + token = check_auth_token(request) + if token['success']: + ip = request.remote_addr + message = 'User disconnected.' + request_post('log', { + 'ip': ip, + 'action': 'logout', + 'message': message, + 'has_succeeded': True, + 'status_code': 0, + 'table': 'users', + 'id_user': token['payload']['id'] + }) + return send_message(message, None, token_delete=True) + else: + return send_error(500, token['message']) + + +# Update User (Nickname, Password) +@bp.route('/api/user/update', methods=['PUT']) +def user_update(): + token = check_auth_token(request) + if token['success']: + post_json = request.json + post_nickname = None + post_password = None + fields = '' + if 'nickname' in post_json: + post_nickname = str(post_json['nickname']) + else: + fields += 'nickname ' + + if 'password' in post_json: + post_password = str(post_json['password']) + else: + fields += 'password ' + + if post_nickname is not None or post_password is not None: + if post_nickname != '' and post_password != '': + ip = request.remote_addr + user_id = token['payload']['id'] + # res = db_user_update(ip, user_id, post_nickname, post_password) + res = request_post('user/update', {'ip': ip, 'user_id': user_id, 'nickname': post_nickname, 'password': post_password}).json() + if res['status'] == 1: + return send_error(500, res['message']) + elif res['status'] == 0: + return send_message(res['message'], res['data']) + else: + return send_error(400, 'Empty nickname and/or password fields.') + else: + return send_error(400, 'Need ' + fields + 'field.') + else: + return send_error(500, token['message']) + + +# Delete User +@bp.route('/api/user/delete', methods=['DELETE']) +def user_delete(): + token = check_auth_token(request) + if token['success']: + ip = request.remote_addr + user_id = token['payload']['id'] + # res = db_user_delete(ip, user_id) + res = request_post('user/update', {'ip': ip, 'user_id': user_id}).json() + if res['status'] != 0: + return send_error(500, res['message']) + else: + request_post('log', { + 'ip': ip, + 'action': 'user/delete', + 'message': 'User deleted.', + 'has_succeeded': True, + 'status_code': 0, + 'table': 'users', + 'id_user': token['payload']['id'] + }) + return send_message(res['message'], None, token_delete=True) + else: + return send_error(500, token['message']) + + +# Admin : Create User +@bp.route('/api/admin/create/user', methods=['POST']) +def admin_create_user(): + token = check_auth_token(request) + if token['success']: + ip = request.remote_addr + user_id = token['payload']['id'] + is_admin = token['payload']['is_admin'] + if is_admin: + post_json = request.json + post_email = None + post_nickname = None + post_password = None + post_is_admin = None + fields = '' + if 'email' in post_json: + post_email = str(post_json['email']) + else: + fields += 'email ' + + if 'nickname' in post_json: + post_nickname = str(post_json['nickname']) + else: + fields += 'nickname ' + + if 'password' in post_json: + post_password = str(post_json['password']) + else: + fields += 'password ' + + if 'is_admin' in post_json: + post_is_admin = bool(post_json['is_admin']) + else: + fields += 'is_admin ' + + if post_email is not None or post_nickname is not None or post_password is not None or post_is_admin is not None: + if post_email != '' and post_nickname != '' and post_password != '' and str(post_is_admin) != '': + res = db_register(ip, post_email, post_nickname, post_password, is_admin=post_is_admin) + if res['status'] == 1: + db_create_log( + ip=ip, + action='admin/create/user', + message=res['message'], + has_succeeded=False, + status_code=res['status'], + table='users', + id_user=user_id + ) + return send_error(500, res['message']) + elif res['status'] == 0: + db_create_log( + ip=ip, + action='admin/create/user', + message=res['message'], + has_succeeded=True, + status_code=res['status'], + table='users', + id_user=user_id + ) + return send_message(res['message'], res['data']) + else: + return send_error(400, 'Empty email and/or nickname and/or password and/or is_admin fields.') + else: + return send_error(400, 'Need ' + fields + 'field.') + else: + return send_error(500, 'User does not have permission.') + else: + return send_error(500, token['message']) + + +# Admin : Change User password and/or role +@bp.route('/api/admin/update/user', methods=['PUT']) +def admin_update_user(): + token = check_auth_token(request) + if token['success']: + user_id = token['payload']['id'] + is_admin = token['payload']['is_admin'] + if is_admin: + post_json = request.json + post_is_admin = None + post_password = None + post_user_id_delete = None + fields = '' + if 'id' in post_json: + post_user_id_delete = int(post_json['id']) + else: + fields += 'id ' + + if 'is_admin' in post_json: + post_is_admin = bool(post_json['is_admin']) + else: + fields += 'is_admin ' + + if 'password' in post_json: + post_password = str(post_json['password']) + else: + fields += 'password ' + + if post_user_id_delete is not None and (post_is_admin is not None or post_password is not None): + if str(post_is_admin) != '' and post_password != '' and str(post_user_id_delete) != '': + ip = request.remote_addr + res = db_admin_update_user(ip, post_user_id_delete, post_is_admin, post_password) + if res['status'] == 1: + db_create_log( + ip=ip, + action='admin/update/user', + message=res['message'], + has_succeeded=False, + status_code=res['status'], + table='users', + id_user=user_id + ) + return send_error(500, res['message']) + elif res['status'] == 0: + db_create_log( + ip=ip, + action='admin/update/user', + message=res['message'], + has_succeeded=True, + status_code=res['status'], + table='users', + id_user=user_id + ) + return send_message(res['message'], res['data']) + else: + return send_error(400, 'Empty is_admin and/or password fields.') + else: + return send_error(400, 'Need ' + fields + 'field.') + else: + return send_error(500, 'User does not have permission.') + else: + return send_error(500, token['message']) + + +# Admin : Delete User +@bp.route('/api/admin/delete/user/', methods=['DELETE']) +def admin_delete_user(id): + token = check_auth_token(request) + if token['success']: + ip = request.remote_addr + user_id = token['payload']['id'] + is_admin = token['payload']['is_admin'] + if is_admin: + post_json = {'id': id} + post_user_id_delete = None + fields = '' + if 'id' in post_json: + post_user_id_delete = int(post_json['id']) + else: + fields += 'id' + if post_user_id_delete is not None: + if str(post_user_id_delete) != '': + res = db_user_delete(ip, int(post_user_id_delete)) + if res['status'] == 1: + db_create_log( + ip=ip, + action='admin/delete/user', + message=res['message'], + has_succeeded=False, + status_code=res['status'], + table='users', + id_user=user_id + ) + return send_error(500, res['message']) + else: + db_create_log( + ip=ip, + action='admin/delete/user', + message=res['message'], + has_succeeded=True, + status_code=res['status'], + table='users', + id_user=user_id + ) + return send_message(res['message'], None) + else: + return send_error(400, 'Empty id field.') + else: + return send_error(400, 'Need ' + fields + 'field.') + else: + return send_error(500, 'User does not have permission.') + else: + return send_error(500, token['message']) + + +# List of User (must be authenticated) & Search +@bp.route('/api/users', methods=['GET']) +def users(): + token = check_auth_token(request) + if token['success']: + ip = request.remote_addr + user_id = token['payload']['id'] + get_query = request.args.get('q') + get_by = request.args.get('by') + get_id = request.args.get('id') + get_is_admin = request.args.get('is_admin') + get_order_by = request.args.get('order_by') + res = db_users(ip, user_id, get_query, get_by, get_id, get_is_admin, get_order_by) + if res['status'] == 1: + return send_error(500, res['message']) + else: + return send_message(res['message'], res['data']) + else: + return send_error(500, token['message']) diff --git a/backend/application/sessionJWT.py b/backend/application/sessionJWT.py new file mode 100644 index 0000000..ef228fb --- /dev/null +++ b/backend/application/sessionJWT.py @@ -0,0 +1,39 @@ +from datetime import datetime, timedelta +from flask import current_app as app +import jwt + + +def create_auth_token(user, time_second=1800): + try: + time = datetime.now() + payload = { + 'exp': time + timedelta(days=0, seconds=time_second), + 'iat': time, + 'user': user + } + return jwt.encode( + payload, + app.config.get('SECRET_KEY'), + algorithm='HS256' + ) + except Exception as e: + return e + + +def decode_auth_token(auth_token): + try: + payload = jwt.decode( + auth_token, + app.config.get('SECRET_KEY'), + algorithms='HS256' + ) + return {'success': True, 'payload': payload['user']} + except jwt.ExpiredSignatureError: + return {'success': False, 'message': 'Signature expired . Please log in again.'} + except jwt.InvalidTokenError as e: + return {'success': False, 'message': 'User not authenticated.'} + + +def check_auth_token(request): + token = request.cookies.get('SESSIONID') + return decode_auth_token(token) diff --git a/backend/config.py b/backend/config.py new file mode 100644 index 0000000..7bd3251 --- /dev/null +++ b/backend/config.py @@ -0,0 +1,31 @@ +import os + +basedir = os.path.abspath(os.path.dirname(__file__)) + + +class Config(object): + DEBUG = False + TESTING = False + CSRF_ENABLED = True + + FLASK_APP = os.environ.get('FLASK_APP', None) + FLASK_ENV = os.environ.get('FLASK_ENV', None) + + API_URL = os.environ.get('API_URL', 'http://127.0.0.1:5000/api/') + + SECRET_KEY = os.environ.get('SECRET_KEY', 'default_secret_key') + ALLOW_ORIGIN = os.environ.get('ALLOW_ORIGIN', None) + + +class ProductionConfig(Config): + DEBUG = False + API_URL = os.environ.get('API_URL', 'http://10.1.2.10:5000/api/') + + +class TestingConfig(Config): + TESTING = True + + +class DevelopmentConfig(Config): + DEVELOPMENT = True + DEBUG = True diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..6317cbe --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,13 @@ +alembic==1.7.5 +Flask==2.0.2 +Flask-Migrate==3.1.0 +Flask-Script==2.0.6 +Flask-Testing==0.8.1 +Flask-SQLAlchemy==2.5.1 +Flask-WTF==0.15.1 +pipreqs==0.4.10 +PyJWT==2.3.0 +pytest==6.2.5 +SQLAlchemy==1.4.27 +psycopg2==2.9.2 +Flask-Cors==3.0.10 \ No newline at end of file diff --git a/package.json b/package.json index 2f177c9..5d8ce6c 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "ng build && node server.js", - "build": "ng build", + "start": "ng build --prod --build-optimizer --baseHref=”/static/” && node server.js", + "build": "ng build --prod --build-optimizer --baseHref=”/static/”", "watch": "ng build --watch --configuration development", "test": "ng test" }, diff --git a/server.js b/server.js deleted file mode 100644 index 7398651..0000000 --- a/server.js +++ /dev/null @@ -1,13 +0,0 @@ -const path = require('path'); -const express = require('express'); -const app = express(); -const port = process.env.PORT || 4200; - -app.use(express.static(__dirname + '/dist/frontend')); -app.get('/*', function(req,res) { - res.sendFile(path.join(__dirname+ '/dist/frontend/index.html')); -}); - -app.listen(port, '0.0.0.0',() => { - console.log (`listening on port ${port}`); -}); diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 92c0bcc..b5bca68 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - debutUrl: 'http://10.1.2.10:5000/api/' + debutUrl: 'http://127.0.0.1:5000/api/' }; From 3d65dd45de176626fac92931752fe44802e68d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Mon, 31 Jan 2022 10:07:12 +0100 Subject: [PATCH 06/31] Update: Finished Implementing (Not tested) --- backend/application/routes.py | 516 ++++++++++++++++------------------ 1 file changed, 236 insertions(+), 280 deletions(-) diff --git a/backend/application/routes.py b/backend/application/routes.py index ae9445e..4638a34 100644 --- a/backend/application/routes.py +++ b/backend/application/routes.py @@ -7,22 +7,22 @@ from .sessionJWT import create_auth_token, check_auth_token # Request Post def request_post(url, data_json): - return requests.post(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) + return requests.post(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) # Request Put def request_put(url, data_json): - return requests.put(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) + return requests.put(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) # Request Get def request_get(url): - return requests.get(app.config['SQLALCHEMY_BINDS'] + url) + return requests.get(app.config['SQLALCHEMY_BINDS'] + url) # Request Delete def request_delete(url, data_json): - return requests.delete(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) + return requests.delete(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) bp = Blueprint('myapp', __name__) @@ -30,346 +30,302 @@ bp = Blueprint('myapp', __name__) @bp.app_errorhandler(HTTPException) def handle_exception(e): - return send_error(e.code, e.name) + return send_error(e.code, e.name) @bp.route('/', methods=['GET']) def root(): - return render_template('index.html') + return render_template('index.html') # Login @bp.route('/api/login', methods=['POST']) def login(): - post_json = request.json - try: - post_email = str(post_json['email']) - post_password = str(post_json['password']) - if post_email != '' and post_password != '': - ip = request.remote_addr - # res = db_login(ip, post_email, post_password) - res = request_post('login', {'ip': ip, 'email': post_email, 'password': post_password}).json() - if res['status'] == 0: - user = res['data'] - token = create_auth_token(user) - return send_message(res['message'], user, token) - elif res['status'] == 1: - user = None - token = create_auth_token(user) - return send_error(400, res['message'], token) - else: - return send_error(400, 'Empty email and/or password fields.') - except KeyError as e: - return send_error(400, 'Need email, password fields.') + post_json = request.json + try: + post_email = str(post_json['email']) + post_password = str(post_json['password']) + if post_email != '' and post_password != '': + ip = request.remote_addr + # res = db_login(ip, post_email, post_password) + res = request_post('login', {'ip': ip, 'email': post_email, 'password': post_password}).json() + if res['status'] == 0: + user = res['data'] + token = create_auth_token(user) + return send_message(res['message'], user, token) + elif res['status'] == 1: + user = None + token = create_auth_token(user) + return send_error(400, res['message'], token) + else: + return send_error(400, 'Empty email and/or password fields.') + except KeyError as e: + return send_error(400, 'Need email, password fields.') # Register @bp.route('/api/register', methods=['POST']) def register(): - post_json = request.json - try: - post_email = str(post_json['email']) - post_nickname = str(post_json['nickname']) - post_password = str(post_json['password']) - if post_email != '' and post_password != '' and post_nickname != '': - ip = request.remote_addr - # res = db_register(ip, post_email, post_nickname, post_password) - res = request_post('register', {'ip': ip, 'email': post_email, 'nickname': post_nickname, 'password': post_password}).json() - if res['status'] == 1: - return send_error(500, res['message']) - elif res['status'] == 0: - return send_message(res['message'], res['data']) - else: - return send_error(400, 'Empty email and/or password and/or nickname fields.') - except KeyError as e: - return send_error(400, 'Need ' + str(e) + 'field.') + post_json = request.json + try: + post_email = str(post_json['email']) + post_nickname = str(post_json['nickname']) + post_password = str(post_json['password']) + if post_email != '' and post_password != '' and post_nickname != '': + ip = request.remote_addr + # res = db_register(ip, post_email, post_nickname, post_password) + res = request_post('register', {'ip': ip, 'email': post_email, 'nickname': post_nickname, + 'password': post_password}).json() + if res['status'] == 1: + return send_error(500, res['message']) + elif res['status'] == 0: + return send_message(res['message'], res['data']) + else: + return send_error(400, 'Empty email and/or password and/or nickname fields.') + except KeyError as e: + return send_error(400, 'Need ' + str(e) + 'field.') # Logout @bp.route('/api/logout', methods=['DELETE']) def logout(): - token = check_auth_token(request) - if token['success']: - ip = request.remote_addr - message = 'User disconnected.' - request_post('log', { - 'ip': ip, - 'action': 'logout', - 'message': message, - 'has_succeeded': True, - 'status_code': 0, - 'table': 'users', - 'id_user': token['payload']['id'] - }) - return send_message(message, None, token_delete=True) - else: - return send_error(500, token['message']) + token = check_auth_token(request) + if token['success']: + ip = request.remote_addr + request_post('logout', {'ip': ip}).json() + message = 'User disconnected.' + return send_message(message, None, token_delete=True) + else: + return send_error(500, token['message']) # Update User (Nickname, Password) @bp.route('/api/user/update', methods=['PUT']) def user_update(): - token = check_auth_token(request) - if token['success']: - post_json = request.json - post_nickname = None - post_password = None - fields = '' - if 'nickname' in post_json: - post_nickname = str(post_json['nickname']) - else: - fields += 'nickname ' + token = check_auth_token(request) + if token['success']: + post_json = request.json + post_nickname = None + post_password = None + fields = '' + if 'nickname' in post_json: + post_nickname = str(post_json['nickname']) + else: + fields += 'nickname ' - if 'password' in post_json: - post_password = str(post_json['password']) - else: - fields += 'password ' + if 'password' in post_json: + post_password = str(post_json['password']) + else: + fields += 'password ' - if post_nickname is not None or post_password is not None: - if post_nickname != '' and post_password != '': - ip = request.remote_addr - user_id = token['payload']['id'] - # res = db_user_update(ip, user_id, post_nickname, post_password) - res = request_post('user/update', {'ip': ip, 'user_id': user_id, 'nickname': post_nickname, 'password': post_password}).json() - if res['status'] == 1: - return send_error(500, res['message']) - elif res['status'] == 0: - return send_message(res['message'], res['data']) - else: - return send_error(400, 'Empty nickname and/or password fields.') + if post_nickname is not None or post_password is not None: + if post_nickname != '' and post_password != '': + ip = request.remote_addr + user_id = token['payload']['id'] + # res = db_user_update(ip, user_id, post_nickname, post_password) + res = request_post('user/update', {'ip': ip, 'user_id': user_id, 'nickname': post_nickname, + 'password': post_password}).json() + if res['status'] == 1: + return send_error(500, res['message']) + elif res['status'] == 0: + return send_message(res['message'], res['data']) + else: + return send_error(400, 'Empty nickname and/or password fields.') + else: + return send_error(400, 'Need ' + fields + 'field.') else: - return send_error(400, 'Need ' + fields + 'field.') - else: - return send_error(500, token['message']) + return send_error(500, token['message']) # Delete User @bp.route('/api/user/delete', methods=['DELETE']) def user_delete(): - token = check_auth_token(request) - if token['success']: - ip = request.remote_addr - user_id = token['payload']['id'] - # res = db_user_delete(ip, user_id) - res = request_post('user/update', {'ip': ip, 'user_id': user_id}).json() - if res['status'] != 0: - return send_error(500, res['message']) + token = check_auth_token(request) + if token['success']: + ip = request.remote_addr + user_id = token['payload']['id'] + # res = db_user_delete(ip, user_id) + res = request_post('user/delete', {'ip': ip, 'user_id': user_id}).json() + if res['status'] != 0: + return send_error(500, res['message']) + else: + return send_message(res['message'], None, token_delete=True) else: - request_post('log', { - 'ip': ip, - 'action': 'user/delete', - 'message': 'User deleted.', - 'has_succeeded': True, - 'status_code': 0, - 'table': 'users', - 'id_user': token['payload']['id'] - }) - return send_message(res['message'], None, token_delete=True) - else: - return send_error(500, token['message']) + return send_error(500, token['message']) # Admin : Create User @bp.route('/api/admin/create/user', methods=['POST']) def admin_create_user(): - token = check_auth_token(request) - if token['success']: - ip = request.remote_addr - user_id = token['payload']['id'] - is_admin = token['payload']['is_admin'] - if is_admin: - post_json = request.json - post_email = None - post_nickname = None - post_password = None - post_is_admin = None - fields = '' - if 'email' in post_json: - post_email = str(post_json['email']) - else: - fields += 'email ' + token = check_auth_token(request) + if token['success']: + ip = request.remote_addr + user_id = token['payload']['id'] + is_admin = token['payload']['is_admin'] + if is_admin: + post_json = request.json + post_email = None + post_nickname = None + post_password = None + post_is_admin = None + fields = '' + if 'email' in post_json: + post_email = str(post_json['email']) + else: + fields += 'email ' - if 'nickname' in post_json: - post_nickname = str(post_json['nickname']) - else: - fields += 'nickname ' + if 'nickname' in post_json: + post_nickname = str(post_json['nickname']) + else: + fields += 'nickname ' - if 'password' in post_json: - post_password = str(post_json['password']) - else: - fields += 'password ' + if 'password' in post_json: + post_password = str(post_json['password']) + else: + fields += 'password ' - if 'is_admin' in post_json: - post_is_admin = bool(post_json['is_admin']) - else: - fields += 'is_admin ' + if 'is_admin' in post_json: + post_is_admin = bool(post_json['is_admin']) + else: + fields += 'is_admin ' - if post_email is not None or post_nickname is not None or post_password is not None or post_is_admin is not None: - if post_email != '' and post_nickname != '' and post_password != '' and str(post_is_admin) != '': - res = db_register(ip, post_email, post_nickname, post_password, is_admin=post_is_admin) - if res['status'] == 1: - db_create_log( - ip=ip, - action='admin/create/user', - message=res['message'], - has_succeeded=False, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_error(500, res['message']) - elif res['status'] == 0: - db_create_log( - ip=ip, - action='admin/create/user', - message=res['message'], - has_succeeded=True, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_message(res['message'], res['data']) + if post_email is not None or post_nickname is not None or post_password is not None or post_is_admin is not None: + if post_email != '' and post_nickname != '' and post_password != '' and str(post_is_admin) != '': + # res = db_register(ip, post_email, post_nickname, post_password, is_admin=post_is_admin) + res = request_post('admin/create/user', { + 'ip': ip, + 'email': post_email, + 'nickname': post_nickname, + 'password': post_password, + 'is_admin': post_is_admin + }) + if res['status'] == 1: + return send_error(500, res['message']) + elif res['status'] == 0: + return send_message(res['message'], res['data']) + else: + return send_error(400, 'Empty email and/or nickname and/or password and/or is_admin fields.') + else: + return send_error(400, 'Need ' + fields + 'field.') else: - return send_error(400, 'Empty email and/or nickname and/or password and/or is_admin fields.') - else: - return send_error(400, 'Need ' + fields + 'field.') + return send_error(500, 'User does not have permission.') else: - return send_error(500, 'User does not have permission.') - else: - return send_error(500, token['message']) + return send_error(500, token['message']) # Admin : Change User password and/or role @bp.route('/api/admin/update/user', methods=['PUT']) def admin_update_user(): - token = check_auth_token(request) - if token['success']: - user_id = token['payload']['id'] - is_admin = token['payload']['is_admin'] - if is_admin: - post_json = request.json - post_is_admin = None - post_password = None - post_user_id_delete = None - fields = '' - if 'id' in post_json: - post_user_id_delete = int(post_json['id']) - else: - fields += 'id ' + token = check_auth_token(request) + if token['success']: + user_id = token['payload']['id'] + is_admin = token['payload']['is_admin'] + if is_admin: + post_json = request.json + post_is_admin = None + post_password = None + post_user_id_delete = None + fields = '' + if 'id' in post_json: + post_user_id_delete = int(post_json['id']) + else: + fields += 'id ' - if 'is_admin' in post_json: - post_is_admin = bool(post_json['is_admin']) - else: - fields += 'is_admin ' + if 'is_admin' in post_json: + post_is_admin = bool(post_json['is_admin']) + else: + fields += 'is_admin ' - if 'password' in post_json: - post_password = str(post_json['password']) - else: - fields += 'password ' + if 'password' in post_json: + post_password = str(post_json['password']) + else: + fields += 'password ' - if post_user_id_delete is not None and (post_is_admin is not None or post_password is not None): - if str(post_is_admin) != '' and post_password != '' and str(post_user_id_delete) != '': - ip = request.remote_addr - res = db_admin_update_user(ip, post_user_id_delete, post_is_admin, post_password) - if res['status'] == 1: - db_create_log( - ip=ip, - action='admin/update/user', - message=res['message'], - has_succeeded=False, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_error(500, res['message']) - elif res['status'] == 0: - db_create_log( - ip=ip, - action='admin/update/user', - message=res['message'], - has_succeeded=True, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_message(res['message'], res['data']) + if post_user_id_delete is not None and (post_is_admin is not None or post_password is not None): + if str(post_is_admin) != '' and post_password != '' and str(post_user_id_delete) != '': + ip = request.remote_addr + # res = db_admin_update_user(ip, post_user_id_delete, post_is_admin, post_password) + res = request_put('admin/update/user', { + 'ip': ip, + 'user_id_delete': post_user_id_delete, + 'is_admin': post_is_admin, + 'password': post_password + }) + if res['status'] == 1: + return send_error(500, res['message']) + elif res['status'] == 0: + return send_message(res['message'], res['data']) + else: + return send_error(400, 'Empty is_admin and/or password fields.') + else: + return send_error(400, 'Need ' + fields + 'field.') else: - return send_error(400, 'Empty is_admin and/or password fields.') - else: - return send_error(400, 'Need ' + fields + 'field.') + return send_error(500, 'User does not have permission.') else: - return send_error(500, 'User does not have permission.') - else: - return send_error(500, token['message']) + return send_error(500, token['message']) # Admin : Delete User @bp.route('/api/admin/delete/user/', methods=['DELETE']) def admin_delete_user(id): - token = check_auth_token(request) - if token['success']: - ip = request.remote_addr - user_id = token['payload']['id'] - is_admin = token['payload']['is_admin'] - if is_admin: - post_json = {'id': id} - post_user_id_delete = None - fields = '' - if 'id' in post_json: - post_user_id_delete = int(post_json['id']) - else: - fields += 'id' - if post_user_id_delete is not None: - if str(post_user_id_delete) != '': - res = db_user_delete(ip, int(post_user_id_delete)) - if res['status'] == 1: - db_create_log( - ip=ip, - action='admin/delete/user', - message=res['message'], - has_succeeded=False, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_error(500, res['message']) - else: - db_create_log( - ip=ip, - action='admin/delete/user', - message=res['message'], - has_succeeded=True, - status_code=res['status'], - table='users', - id_user=user_id - ) - return send_message(res['message'], None) + token = check_auth_token(request) + if token['success']: + ip = request.remote_addr + # user_id = token['payload']['id'] + is_admin = token['payload']['is_admin'] + if is_admin: + post_json = {'id': id} + post_user_id_delete = None + fields = '' + if 'id' in post_json: + post_user_id_delete = int(post_json['id']) + else: + fields += 'id' + if post_user_id_delete is not None: + if str(post_user_id_delete) != '': + # res = db_user_delete(ip, int(post_user_id_delete)) + res = request_delete('admin/delete/user', + {'ip': ip, 'user_id_delete': post_user_id_delete, 'is_admin': is_admin}) + if res['status'] == 1: + return send_error(500, res['message']) + else: + return send_message(res['message'], None) + else: + return send_error(400, 'Empty id field.') + else: + return send_error(400, 'Need ' + fields + 'field.') else: - return send_error(400, 'Empty id field.') - else: - return send_error(400, 'Need ' + fields + 'field.') + return send_error(500, 'User does not have permission.') else: - return send_error(500, 'User does not have permission.') - else: - return send_error(500, token['message']) + return send_error(500, token['message']) # List of User (must be authenticated) & Search @bp.route('/api/users', methods=['GET']) def users(): - token = check_auth_token(request) - if token['success']: - ip = request.remote_addr - user_id = token['payload']['id'] - get_query = request.args.get('q') - get_by = request.args.get('by') - get_id = request.args.get('id') - get_is_admin = request.args.get('is_admin') - get_order_by = request.args.get('order_by') - res = db_users(ip, user_id, get_query, get_by, get_id, get_is_admin, get_order_by) - if res['status'] == 1: - return send_error(500, res['message']) + token = check_auth_token(request) + if token['success']: + ip = request.remote_addr + user_id = token['payload']['id'] + get_query = request.args.get('q') + get_by = request.args.get('by') + get_id = request.args.get('id') + get_is_admin = request.args.get('is_admin') + get_order_by = request.args.get('order_by') + # res = db_users(ip, user_id, get_query, get_by, get_id, get_is_admin, get_order_by) + res = request_get( + 'users' + f'?ip={ip}' + f'&user_id={user_id}' + f'&q={get_query}' + f'&by={get_by}' + f'&id={get_id}' + f'&is_admin={get_is_admin}' + f'&order_by={get_order_by}' + ) + if res['status'] == 1: + return send_error(500, res['message']) + else: + return send_message(res['message'], res['data']) else: - return send_message(res['message'], res['data']) - else: - return send_error(500, token['message']) + return send_error(500, token['message']) From bc62ef4f0d9838dc16d63b444e3696c0c6d1a641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Mon, 31 Jan 2022 10:46:15 +0100 Subject: [PATCH 07/31] Update: Routes adapted --- backend/application/routes.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/backend/application/routes.py b/backend/application/routes.py index 4638a34..c101915 100644 --- a/backend/application/routes.py +++ b/backend/application/routes.py @@ -92,7 +92,8 @@ def logout(): token = check_auth_token(request) if token['success']: ip = request.remote_addr - request_post('logout', {'ip': ip}).json() + user_id = token['payload']['id'] + request_post('logout', {'ip': ip, 'user_id': user_id}).json() message = 'User disconnected.' return send_message(message, None, token_delete=True) else: @@ -194,6 +195,8 @@ def admin_create_user(): # res = db_register(ip, post_email, post_nickname, post_password, is_admin=post_is_admin) res = request_post('admin/create/user', { 'ip': ip, + 'user_id': user_id, + 'token_is_admin': is_admin, 'email': post_email, 'nickname': post_nickname, 'password': post_password, @@ -247,6 +250,8 @@ def admin_update_user(): # res = db_admin_update_user(ip, post_user_id_delete, post_is_admin, post_password) res = request_put('admin/update/user', { 'ip': ip, + 'user_id': user_id, + 'token_is_admin': is_admin, 'user_id_delete': post_user_id_delete, 'is_admin': post_is_admin, 'password': post_password @@ -271,7 +276,7 @@ def admin_delete_user(id): token = check_auth_token(request) if token['success']: ip = request.remote_addr - # user_id = token['payload']['id'] + user_id = token['payload']['id'] is_admin = token['payload']['is_admin'] if is_admin: post_json = {'id': id} @@ -284,8 +289,12 @@ def admin_delete_user(id): if post_user_id_delete is not None: if str(post_user_id_delete) != '': # res = db_user_delete(ip, int(post_user_id_delete)) - res = request_delete('admin/delete/user', - {'ip': ip, 'user_id_delete': post_user_id_delete, 'is_admin': is_admin}) + res = request_delete('admin/delete/user', { + 'ip': ip, + 'user_id': user_id, + 'token_is_admin': is_admin, + 'user_id_delete': post_user_id_delete + }) if res['status'] == 1: return send_error(500, res['message']) else: From a18333c2c3f4d0a5b5cd4f0c12c5001fd61f7ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Mon, 31 Jan 2022 16:15:40 +0100 Subject: [PATCH 08/31] Moved --- Dockerfile | 12 ++++----- .../application/__init__.py => __init__.py | 16 ++--------- app.py | 7 +++++ backend/Dockerfile | 6 ----- backend/app.py | 8 ------ backend/requirements.txt | 13 --------- backend/config.py => config.py | 1 + .browserslistrc => frontend/.browserslistrc | 2 ++ .editorconfig => frontend/.editorconfig | 0 .gitignore => frontend/.gitignore | 0 frontend/Dockerfile | 6 +++++ README.md => frontend/README.md | 0 angular.json => frontend/angular.json | 2 +- {conf => frontend/conf}/nginx.conf | 0 karma.conf.js => frontend/karma.conf.js | 0 {logs => frontend/logs}/nginx/access.log | 0 package.json => frontend/package.json | 4 +-- .../src}/app/admin/myProfil/commentary.txt | 0 .../page-user-list.component.html | 0 .../page-user-list.component.scss | 0 .../page-user-list.component.spec.ts | 0 .../page-user-list.component.ts | 0 .../popup-create-person.component.html | 0 .../popup-create-person.component.scss | 0 .../popup-create-person.component.spec.ts | 0 .../popup-create-person.component.ts | 0 .../popup-update-person-admin.component.html | 0 .../popup-update-person-admin.component.scss | 0 ...opup-update-person-admin.component.spec.ts | 0 .../popup-update-person-admin.component.ts | 0 .../src}/app/app-routing.module.ts | 0 {src => frontend/src}/app/app.component.html | 0 {src => frontend/src}/app/app.component.scss | 0 .../src}/app/app.component.spec.ts | 0 {src => frontend/src}/app/app.component.ts | 0 {src => frontend/src}/app/app.module.ts | 0 .../components/navbar/navbar.component.html | 0 .../components/navbar/navbar.component.scss | 0 .../navbar/navbar.component.spec.ts | 0 .../components/navbar/navbar.component.ts | 0 .../page-profil/page-profil.component.html | 0 .../page-profil/page-profil.component.scss | 0 .../page-profil/page-profil.component.spec.ts | 0 .../page-profil/page-profil.component.ts | 0 .../popup-delete-profil.component.html | 0 .../popup-delete-profil.component.scss | 0 .../popup-delete-profil.component.spec.ts | 0 .../popup-delete-profil.component.ts | 0 .../popup-update-profil.component.html | 0 .../popup-update-profil.component.scss | 0 .../popup-update-profil.component.spec.ts | 0 .../popup-update-profil.component.ts | 0 .../common/guards/admin/admin.guard.spec.ts | 0 .../app/common/guards/admin/admin.guard.ts | 0 .../app/common/guards/user/user.guard.spec.ts | 0 .../src}/app/common/guards/user/user.guard.ts | 0 .../checkEmail/check-email.service.spec.ts | 0 .../checkEmail/check-email.service.ts | 0 .../fictitious-datas.service.spec.ts | 0 .../fictitious-datas.service.ts | 0 .../services/hashage/hashage.service.spec.ts | 0 .../services/hashage/hashage.service.ts | 0 .../services/message/message.service.spec.ts | 0 .../services/message/message.service.ts | 0 .../services/profil/profil.service.spec.ts | 0 .../common/services/profil/profil.service.ts | 0 .../page-login/page-login.component.html | 0 .../page-login/page-login.component.scss | 0 .../page-login/page-login.component.spec.ts | 0 .../login/page-login/page-login.component.ts | 0 .../page-register.component.html | 0 .../page-register.component.scss | 0 .../page-register.component.spec.ts | 0 .../page-register/page-register.component.ts | 0 .../popup-confirm-register.component.html | 0 .../popup-confirm-register.component.scss | 0 .../popup-confirm-register.component.spec.ts | 0 .../popup-confirm-register.component.ts | 0 .../src}/app/user/myProfil/commentary.txt | 0 .../page-registry.component.html | 0 .../page-registry.component.scss | 0 .../page-registry.component.spec.ts | 0 .../page-registry/page-registry.component.ts | 0 {src => frontend/src}/assets/.gitkeep | 0 {src => frontend/src}/assets/logo.png | Bin {src => frontend/src}/assets/logo1.png | Bin .../src}/environments/environment.prod.ts | 2 +- .../src}/environments/environment.ts | 2 +- {src => frontend/src}/favicon.ico | Bin {src => frontend/src}/index.html | 0 {src => frontend/src}/main.ts | 0 {src => frontend/src}/polyfills.ts | 0 {src => frontend/src}/styles.scss | 0 {src => frontend/src}/test.ts | 0 .../tsconfig.app.json | 0 tsconfig.json => frontend/tsconfig.json | 0 .../tsconfig.spec.json | 0 requirements.txt | 7 +++++ .../application/responses.py => responses.py | 0 backend/application/routes.py => routes.py | 25 +++++++++++++----- .../sessionJWT.py => sessionJWT.py | 0 101 files changed, 54 insertions(+), 59 deletions(-) rename backend/application/__init__.py => __init__.py (56%) create mode 100644 app.py delete mode 100644 backend/Dockerfile delete mode 100644 backend/app.py delete mode 100644 backend/requirements.txt rename backend/config.py => config.py (92%) rename .browserslistrc => frontend/.browserslistrc (94%) rename .editorconfig => frontend/.editorconfig (100%) rename .gitignore => frontend/.gitignore (100%) create mode 100644 frontend/Dockerfile rename README.md => frontend/README.md (100%) rename angular.json => frontend/angular.json (98%) rename {conf => frontend/conf}/nginx.conf (100%) rename karma.conf.js => frontend/karma.conf.js (100%) rename {logs => frontend/logs}/nginx/access.log (100%) rename package.json => frontend/package.json (87%) rename {src => frontend/src}/app/admin/myProfil/commentary.txt (100%) rename {src => frontend/src}/app/admin/userList/page-user-list/page-user-list.component.html (100%) rename {src => frontend/src}/app/admin/userList/page-user-list/page-user-list.component.scss (100%) rename {src => frontend/src}/app/admin/userList/page-user-list/page-user-list.component.spec.ts (100%) rename {src => frontend/src}/app/admin/userList/page-user-list/page-user-list.component.ts (100%) rename {src => frontend/src}/app/admin/userList/popup-create-person/popup-create-person.component.html (100%) rename {src => frontend/src}/app/admin/userList/popup-create-person/popup-create-person.component.scss (100%) rename {src => frontend/src}/app/admin/userList/popup-create-person/popup-create-person.component.spec.ts (100%) rename {src => frontend/src}/app/admin/userList/popup-create-person/popup-create-person.component.ts (100%) rename {src => frontend/src}/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.html (100%) rename {src => frontend/src}/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.scss (100%) rename {src => frontend/src}/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.spec.ts (100%) rename {src => frontend/src}/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.ts (100%) rename {src => frontend/src}/app/app-routing.module.ts (100%) rename {src => frontend/src}/app/app.component.html (100%) rename {src => frontend/src}/app/app.component.scss (100%) rename {src => frontend/src}/app/app.component.spec.ts (100%) rename {src => frontend/src}/app/app.component.ts (100%) rename {src => frontend/src}/app/app.module.ts (100%) rename {src => frontend/src}/app/common/components/navbar/navbar.component.html (100%) rename {src => frontend/src}/app/common/components/navbar/navbar.component.scss (100%) rename {src => frontend/src}/app/common/components/navbar/navbar.component.spec.ts (100%) rename {src => frontend/src}/app/common/components/navbar/navbar.component.ts (100%) rename {src => frontend/src}/app/common/components/page-profil/page-profil.component.html (100%) rename {src => frontend/src}/app/common/components/page-profil/page-profil.component.scss (100%) rename {src => frontend/src}/app/common/components/page-profil/page-profil.component.spec.ts (100%) rename {src => frontend/src}/app/common/components/page-profil/page-profil.component.ts (100%) rename {src => frontend/src}/app/common/components/popup-delete-profil/popup-delete-profil.component.html (100%) rename {src => frontend/src}/app/common/components/popup-delete-profil/popup-delete-profil.component.scss (100%) rename {src => frontend/src}/app/common/components/popup-delete-profil/popup-delete-profil.component.spec.ts (100%) rename {src => frontend/src}/app/common/components/popup-delete-profil/popup-delete-profil.component.ts (100%) rename {src => frontend/src}/app/common/components/popup-update-profil/popup-update-profil.component.html (100%) rename {src => frontend/src}/app/common/components/popup-update-profil/popup-update-profil.component.scss (100%) rename {src => frontend/src}/app/common/components/popup-update-profil/popup-update-profil.component.spec.ts (100%) rename {src => frontend/src}/app/common/components/popup-update-profil/popup-update-profil.component.ts (100%) rename {src => frontend/src}/app/common/guards/admin/admin.guard.spec.ts (100%) rename {src => frontend/src}/app/common/guards/admin/admin.guard.ts (100%) rename {src => frontend/src}/app/common/guards/user/user.guard.spec.ts (100%) rename {src => frontend/src}/app/common/guards/user/user.guard.ts (100%) rename {src => frontend/src}/app/common/services/checkEmail/check-email.service.spec.ts (100%) rename {src => frontend/src}/app/common/services/checkEmail/check-email.service.ts (100%) rename {src => frontend/src}/app/common/services/fictitiousDatas/fictitious-datas.service.spec.ts (100%) rename {src => frontend/src}/app/common/services/fictitiousDatas/fictitious-datas.service.ts (100%) rename {src => frontend/src}/app/common/services/hashage/hashage.service.spec.ts (100%) rename {src => frontend/src}/app/common/services/hashage/hashage.service.ts (100%) rename {src => frontend/src}/app/common/services/message/message.service.spec.ts (100%) rename {src => frontend/src}/app/common/services/message/message.service.ts (100%) rename {src => frontend/src}/app/common/services/profil/profil.service.spec.ts (100%) rename {src => frontend/src}/app/common/services/profil/profil.service.ts (100%) rename {src => frontend/src}/app/login/page-login/page-login.component.html (100%) rename {src => frontend/src}/app/login/page-login/page-login.component.scss (100%) rename {src => frontend/src}/app/login/page-login/page-login.component.spec.ts (100%) rename {src => frontend/src}/app/login/page-login/page-login.component.ts (100%) rename {src => frontend/src}/app/register/page-register/page-register.component.html (100%) rename {src => frontend/src}/app/register/page-register/page-register.component.scss (100%) rename {src => frontend/src}/app/register/page-register/page-register.component.spec.ts (100%) rename {src => frontend/src}/app/register/page-register/page-register.component.ts (100%) rename {src => frontend/src}/app/register/popup-confirm-register/popup-confirm-register.component.html (100%) rename {src => frontend/src}/app/register/popup-confirm-register/popup-confirm-register.component.scss (100%) rename {src => frontend/src}/app/register/popup-confirm-register/popup-confirm-register.component.spec.ts (100%) rename {src => frontend/src}/app/register/popup-confirm-register/popup-confirm-register.component.ts (100%) rename {src => frontend/src}/app/user/myProfil/commentary.txt (100%) rename {src => frontend/src}/app/user/page-registry/page-registry.component.html (100%) rename {src => frontend/src}/app/user/page-registry/page-registry.component.scss (100%) rename {src => frontend/src}/app/user/page-registry/page-registry.component.spec.ts (100%) rename {src => frontend/src}/app/user/page-registry/page-registry.component.ts (100%) rename {src => frontend/src}/assets/.gitkeep (100%) rename {src => frontend/src}/assets/logo.png (100%) rename {src => frontend/src}/assets/logo1.png (100%) rename {src => frontend/src}/environments/environment.prod.ts (55%) rename {src => frontend/src}/environments/environment.ts (93%) rename {src => frontend/src}/favicon.ico (100%) rename {src => frontend/src}/index.html (100%) rename {src => frontend/src}/main.ts (100%) rename {src => frontend/src}/polyfills.ts (100%) rename {src => frontend/src}/styles.scss (100%) rename {src => frontend/src}/test.ts (100%) rename tsconfig.app.json => frontend/tsconfig.app.json (100%) rename tsconfig.json => frontend/tsconfig.json (100%) rename tsconfig.spec.json => frontend/tsconfig.spec.json (100%) create mode 100644 requirements.txt rename backend/application/responses.py => responses.py (100%) rename backend/application/routes.py => routes.py (94%) rename backend/application/sessionJWT.py => sessionJWT.py (100%) diff --git a/Dockerfile b/Dockerfile index e936fe3..2987276 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM node:latest -WORKDIR /app-frontend -COPY ["package.json", "package-lock.json*", "./"] -RUN npm install -RUN npm install -g @angular/cli -COPY . . +FROM python:latest +WORKDIR /data/backend +COPY requirements.txt requirements.txt +RUN pip install --upgrade pip +RUN pip install -r requirements.txt +COPY . . \ No newline at end of file diff --git a/backend/application/__init__.py b/__init__.py similarity index 56% rename from backend/application/__init__.py rename to __init__.py index b68cd09..ce09789 100644 --- a/backend/application/__init__.py +++ b/__init__.py @@ -1,16 +1,12 @@ from flask import Flask -from flask_sqlalchemy import SQLAlchemy from flask_cors import CORS -import sys - -db = SQLAlchemy() def create_app(flask_env='development'): - app = Flask(__name__, instance_relative_config=False) + app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['http://127.0.0.1:4200', 'http://localhost:4200'] + origin = ['http://127.0.0.1:5000', 'http://localhost:5000'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") @@ -21,15 +17,7 @@ def create_app(flask_env='development'): else: app.config.from_object("config.Config") - if app.config['SQLALCHEMY_DATABASE_URI_1'] is None or app.config['SQLALCHEMY_DATABASE_URI_2'] is None: - print('No ENV Variable for DATABASE_URL_USERS or DATABASE_URL_LOGS') - sys.exit(1) - else: - print('ENV Variables passed : ', app.config['SQLALCHEMY_BINDS']) - - db.init_app(app) with app.app_context(): from . import routes app.register_blueprint(routes.bp) - db.create_all() return app diff --git a/app.py b/app.py new file mode 100644 index 0000000..2faec63 --- /dev/null +++ b/app.py @@ -0,0 +1,7 @@ +from . import create_app +import os + +app = create_app(os.environ.get('FLASK_ENV', None)) + +if __name__ == "__main__": + app.run(host='0.0.0.0', DEBUG=True) diff --git a/backend/Dockerfile b/backend/Dockerfile deleted file mode 100644 index 2987276..0000000 --- a/backend/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM python:latest -WORKDIR /data/backend -COPY requirements.txt requirements.txt -RUN pip install --upgrade pip -RUN pip install -r requirements.txt -COPY . . \ No newline at end of file diff --git a/backend/app.py b/backend/app.py deleted file mode 100644 index 50e795c..0000000 --- a/backend/app.py +++ /dev/null @@ -1,8 +0,0 @@ -from application import create_app -import os - -app = create_app(os.environ.get('FLASK_ENV', None)) - -if __name__ == "__main__": - PORT = os.environ.get('PORT', 33507) - app.run(host='0.0.0.0', port=PORT, DEBUG=True) diff --git a/backend/requirements.txt b/backend/requirements.txt deleted file mode 100644 index 6317cbe..0000000 --- a/backend/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -alembic==1.7.5 -Flask==2.0.2 -Flask-Migrate==3.1.0 -Flask-Script==2.0.6 -Flask-Testing==0.8.1 -Flask-SQLAlchemy==2.5.1 -Flask-WTF==0.15.1 -pipreqs==0.4.10 -PyJWT==2.3.0 -pytest==6.2.5 -SQLAlchemy==1.4.27 -psycopg2==2.9.2 -Flask-Cors==3.0.10 \ No newline at end of file diff --git a/backend/config.py b/config.py similarity index 92% rename from backend/config.py rename to config.py index 7bd3251..c689319 100644 --- a/backend/config.py +++ b/config.py @@ -10,6 +10,7 @@ class Config(object): FLASK_APP = os.environ.get('FLASK_APP', None) FLASK_ENV = os.environ.get('FLASK_ENV', None) + FLASK_RUN_PORT = os.environ.get('FLASK_RUN_PORT', 4200) API_URL = os.environ.get('API_URL', 'http://127.0.0.1:5000/api/') diff --git a/.browserslistrc b/frontend/.browserslistrc similarity index 94% rename from .browserslistrc rename to frontend/.browserslistrc index 427441d..8651e3c 100644 --- a/.browserslistrc +++ b/frontend/.browserslistrc @@ -15,3 +15,5 @@ last 2 Safari major versions last 2 iOS major versions Firefox ESR not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. +not ios_saf 15.2-15.3 +not safari 15.2-15.3 diff --git a/.editorconfig b/frontend/.editorconfig similarity index 100% rename from .editorconfig rename to frontend/.editorconfig diff --git a/.gitignore b/frontend/.gitignore similarity index 100% rename from .gitignore rename to frontend/.gitignore diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..e936fe3 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,6 @@ +FROM node:latest +WORKDIR /app-frontend +COPY ["package.json", "package-lock.json*", "./"] +RUN npm install +RUN npm install -g @angular/cli +COPY . . diff --git a/README.md b/frontend/README.md similarity index 100% rename from README.md rename to frontend/README.md diff --git a/angular.json b/frontend/angular.json similarity index 98% rename from angular.json rename to frontend/angular.json index a21c621..6dd4c96 100644 --- a/angular.json +++ b/frontend/angular.json @@ -20,7 +20,7 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "outputPath": "backend/static", + "outputPath": "dist/", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", diff --git a/conf/nginx.conf b/frontend/conf/nginx.conf similarity index 100% rename from conf/nginx.conf rename to frontend/conf/nginx.conf diff --git a/karma.conf.js b/frontend/karma.conf.js similarity index 100% rename from karma.conf.js rename to frontend/karma.conf.js diff --git a/logs/nginx/access.log b/frontend/logs/nginx/access.log similarity index 100% rename from logs/nginx/access.log rename to frontend/logs/nginx/access.log diff --git a/package.json b/frontend/package.json similarity index 87% rename from package.json rename to frontend/package.json index 5d8ce6c..d95a55b 100644 --- a/package.json +++ b/frontend/package.json @@ -3,8 +3,8 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "ng build --prod --build-optimizer --baseHref=”/static/” && node server.js", - "build": "ng build --prod --build-optimizer --baseHref=”/static/”", + "start": "ng build && python flask run", + "build": "ng build --build-optimizer --baseHref=frontend/dist", "watch": "ng build --watch --configuration development", "test": "ng test" }, diff --git a/src/app/admin/myProfil/commentary.txt b/frontend/src/app/admin/myProfil/commentary.txt similarity index 100% rename from src/app/admin/myProfil/commentary.txt rename to frontend/src/app/admin/myProfil/commentary.txt diff --git a/src/app/admin/userList/page-user-list/page-user-list.component.html b/frontend/src/app/admin/userList/page-user-list/page-user-list.component.html similarity index 100% rename from src/app/admin/userList/page-user-list/page-user-list.component.html rename to frontend/src/app/admin/userList/page-user-list/page-user-list.component.html diff --git a/src/app/admin/userList/page-user-list/page-user-list.component.scss b/frontend/src/app/admin/userList/page-user-list/page-user-list.component.scss similarity index 100% rename from src/app/admin/userList/page-user-list/page-user-list.component.scss rename to frontend/src/app/admin/userList/page-user-list/page-user-list.component.scss diff --git a/src/app/admin/userList/page-user-list/page-user-list.component.spec.ts b/frontend/src/app/admin/userList/page-user-list/page-user-list.component.spec.ts similarity index 100% rename from src/app/admin/userList/page-user-list/page-user-list.component.spec.ts rename to frontend/src/app/admin/userList/page-user-list/page-user-list.component.spec.ts diff --git a/src/app/admin/userList/page-user-list/page-user-list.component.ts b/frontend/src/app/admin/userList/page-user-list/page-user-list.component.ts similarity index 100% rename from src/app/admin/userList/page-user-list/page-user-list.component.ts rename to frontend/src/app/admin/userList/page-user-list/page-user-list.component.ts diff --git a/src/app/admin/userList/popup-create-person/popup-create-person.component.html b/frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.html similarity index 100% rename from src/app/admin/userList/popup-create-person/popup-create-person.component.html rename to frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.html diff --git a/src/app/admin/userList/popup-create-person/popup-create-person.component.scss b/frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.scss similarity index 100% rename from src/app/admin/userList/popup-create-person/popup-create-person.component.scss rename to frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.scss diff --git a/src/app/admin/userList/popup-create-person/popup-create-person.component.spec.ts b/frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.spec.ts similarity index 100% rename from src/app/admin/userList/popup-create-person/popup-create-person.component.spec.ts rename to frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.spec.ts diff --git a/src/app/admin/userList/popup-create-person/popup-create-person.component.ts b/frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.ts similarity index 100% rename from src/app/admin/userList/popup-create-person/popup-create-person.component.ts rename to frontend/src/app/admin/userList/popup-create-person/popup-create-person.component.ts diff --git a/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.html b/frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.html similarity index 100% rename from src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.html rename to frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.html diff --git a/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.scss b/frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.scss similarity index 100% rename from src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.scss rename to frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.scss diff --git a/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.spec.ts b/frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.spec.ts similarity index 100% rename from src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.spec.ts rename to frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.spec.ts diff --git a/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.ts b/frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.ts similarity index 100% rename from src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.ts rename to frontend/src/app/admin/userList/popup-update-person-admin/popup-update-person-admin.component.ts diff --git a/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts similarity index 100% rename from src/app/app-routing.module.ts rename to frontend/src/app/app-routing.module.ts diff --git a/src/app/app.component.html b/frontend/src/app/app.component.html similarity index 100% rename from src/app/app.component.html rename to frontend/src/app/app.component.html diff --git a/src/app/app.component.scss b/frontend/src/app/app.component.scss similarity index 100% rename from src/app/app.component.scss rename to frontend/src/app/app.component.scss diff --git a/src/app/app.component.spec.ts b/frontend/src/app/app.component.spec.ts similarity index 100% rename from src/app/app.component.spec.ts rename to frontend/src/app/app.component.spec.ts diff --git a/src/app/app.component.ts b/frontend/src/app/app.component.ts similarity index 100% rename from src/app/app.component.ts rename to frontend/src/app/app.component.ts diff --git a/src/app/app.module.ts b/frontend/src/app/app.module.ts similarity index 100% rename from src/app/app.module.ts rename to frontend/src/app/app.module.ts diff --git a/src/app/common/components/navbar/navbar.component.html b/frontend/src/app/common/components/navbar/navbar.component.html similarity index 100% rename from src/app/common/components/navbar/navbar.component.html rename to frontend/src/app/common/components/navbar/navbar.component.html diff --git a/src/app/common/components/navbar/navbar.component.scss b/frontend/src/app/common/components/navbar/navbar.component.scss similarity index 100% rename from src/app/common/components/navbar/navbar.component.scss rename to frontend/src/app/common/components/navbar/navbar.component.scss diff --git a/src/app/common/components/navbar/navbar.component.spec.ts b/frontend/src/app/common/components/navbar/navbar.component.spec.ts similarity index 100% rename from src/app/common/components/navbar/navbar.component.spec.ts rename to frontend/src/app/common/components/navbar/navbar.component.spec.ts diff --git a/src/app/common/components/navbar/navbar.component.ts b/frontend/src/app/common/components/navbar/navbar.component.ts similarity index 100% rename from src/app/common/components/navbar/navbar.component.ts rename to frontend/src/app/common/components/navbar/navbar.component.ts diff --git a/src/app/common/components/page-profil/page-profil.component.html b/frontend/src/app/common/components/page-profil/page-profil.component.html similarity index 100% rename from src/app/common/components/page-profil/page-profil.component.html rename to frontend/src/app/common/components/page-profil/page-profil.component.html diff --git a/src/app/common/components/page-profil/page-profil.component.scss b/frontend/src/app/common/components/page-profil/page-profil.component.scss similarity index 100% rename from src/app/common/components/page-profil/page-profil.component.scss rename to frontend/src/app/common/components/page-profil/page-profil.component.scss diff --git a/src/app/common/components/page-profil/page-profil.component.spec.ts b/frontend/src/app/common/components/page-profil/page-profil.component.spec.ts similarity index 100% rename from src/app/common/components/page-profil/page-profil.component.spec.ts rename to frontend/src/app/common/components/page-profil/page-profil.component.spec.ts diff --git a/src/app/common/components/page-profil/page-profil.component.ts b/frontend/src/app/common/components/page-profil/page-profil.component.ts similarity index 100% rename from src/app/common/components/page-profil/page-profil.component.ts rename to frontend/src/app/common/components/page-profil/page-profil.component.ts diff --git a/src/app/common/components/popup-delete-profil/popup-delete-profil.component.html b/frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.html similarity index 100% rename from src/app/common/components/popup-delete-profil/popup-delete-profil.component.html rename to frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.html diff --git a/src/app/common/components/popup-delete-profil/popup-delete-profil.component.scss b/frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.scss similarity index 100% rename from src/app/common/components/popup-delete-profil/popup-delete-profil.component.scss rename to frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.scss diff --git a/src/app/common/components/popup-delete-profil/popup-delete-profil.component.spec.ts b/frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.spec.ts similarity index 100% rename from src/app/common/components/popup-delete-profil/popup-delete-profil.component.spec.ts rename to frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.spec.ts diff --git a/src/app/common/components/popup-delete-profil/popup-delete-profil.component.ts b/frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.ts similarity index 100% rename from src/app/common/components/popup-delete-profil/popup-delete-profil.component.ts rename to frontend/src/app/common/components/popup-delete-profil/popup-delete-profil.component.ts diff --git a/src/app/common/components/popup-update-profil/popup-update-profil.component.html b/frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.html similarity index 100% rename from src/app/common/components/popup-update-profil/popup-update-profil.component.html rename to frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.html diff --git a/src/app/common/components/popup-update-profil/popup-update-profil.component.scss b/frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.scss similarity index 100% rename from src/app/common/components/popup-update-profil/popup-update-profil.component.scss rename to frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.scss diff --git a/src/app/common/components/popup-update-profil/popup-update-profil.component.spec.ts b/frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.spec.ts similarity index 100% rename from src/app/common/components/popup-update-profil/popup-update-profil.component.spec.ts rename to frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.spec.ts diff --git a/src/app/common/components/popup-update-profil/popup-update-profil.component.ts b/frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.ts similarity index 100% rename from src/app/common/components/popup-update-profil/popup-update-profil.component.ts rename to frontend/src/app/common/components/popup-update-profil/popup-update-profil.component.ts diff --git a/src/app/common/guards/admin/admin.guard.spec.ts b/frontend/src/app/common/guards/admin/admin.guard.spec.ts similarity index 100% rename from src/app/common/guards/admin/admin.guard.spec.ts rename to frontend/src/app/common/guards/admin/admin.guard.spec.ts diff --git a/src/app/common/guards/admin/admin.guard.ts b/frontend/src/app/common/guards/admin/admin.guard.ts similarity index 100% rename from src/app/common/guards/admin/admin.guard.ts rename to frontend/src/app/common/guards/admin/admin.guard.ts diff --git a/src/app/common/guards/user/user.guard.spec.ts b/frontend/src/app/common/guards/user/user.guard.spec.ts similarity index 100% rename from src/app/common/guards/user/user.guard.spec.ts rename to frontend/src/app/common/guards/user/user.guard.spec.ts diff --git a/src/app/common/guards/user/user.guard.ts b/frontend/src/app/common/guards/user/user.guard.ts similarity index 100% rename from src/app/common/guards/user/user.guard.ts rename to frontend/src/app/common/guards/user/user.guard.ts diff --git a/src/app/common/services/checkEmail/check-email.service.spec.ts b/frontend/src/app/common/services/checkEmail/check-email.service.spec.ts similarity index 100% rename from src/app/common/services/checkEmail/check-email.service.spec.ts rename to frontend/src/app/common/services/checkEmail/check-email.service.spec.ts diff --git a/src/app/common/services/checkEmail/check-email.service.ts b/frontend/src/app/common/services/checkEmail/check-email.service.ts similarity index 100% rename from src/app/common/services/checkEmail/check-email.service.ts rename to frontend/src/app/common/services/checkEmail/check-email.service.ts diff --git a/src/app/common/services/fictitiousDatas/fictitious-datas.service.spec.ts b/frontend/src/app/common/services/fictitiousDatas/fictitious-datas.service.spec.ts similarity index 100% rename from src/app/common/services/fictitiousDatas/fictitious-datas.service.spec.ts rename to frontend/src/app/common/services/fictitiousDatas/fictitious-datas.service.spec.ts diff --git a/src/app/common/services/fictitiousDatas/fictitious-datas.service.ts b/frontend/src/app/common/services/fictitiousDatas/fictitious-datas.service.ts similarity index 100% rename from src/app/common/services/fictitiousDatas/fictitious-datas.service.ts rename to frontend/src/app/common/services/fictitiousDatas/fictitious-datas.service.ts diff --git a/src/app/common/services/hashage/hashage.service.spec.ts b/frontend/src/app/common/services/hashage/hashage.service.spec.ts similarity index 100% rename from src/app/common/services/hashage/hashage.service.spec.ts rename to frontend/src/app/common/services/hashage/hashage.service.spec.ts diff --git a/src/app/common/services/hashage/hashage.service.ts b/frontend/src/app/common/services/hashage/hashage.service.ts similarity index 100% rename from src/app/common/services/hashage/hashage.service.ts rename to frontend/src/app/common/services/hashage/hashage.service.ts diff --git a/src/app/common/services/message/message.service.spec.ts b/frontend/src/app/common/services/message/message.service.spec.ts similarity index 100% rename from src/app/common/services/message/message.service.spec.ts rename to frontend/src/app/common/services/message/message.service.spec.ts diff --git a/src/app/common/services/message/message.service.ts b/frontend/src/app/common/services/message/message.service.ts similarity index 100% rename from src/app/common/services/message/message.service.ts rename to frontend/src/app/common/services/message/message.service.ts diff --git a/src/app/common/services/profil/profil.service.spec.ts b/frontend/src/app/common/services/profil/profil.service.spec.ts similarity index 100% rename from src/app/common/services/profil/profil.service.spec.ts rename to frontend/src/app/common/services/profil/profil.service.spec.ts diff --git a/src/app/common/services/profil/profil.service.ts b/frontend/src/app/common/services/profil/profil.service.ts similarity index 100% rename from src/app/common/services/profil/profil.service.ts rename to frontend/src/app/common/services/profil/profil.service.ts diff --git a/src/app/login/page-login/page-login.component.html b/frontend/src/app/login/page-login/page-login.component.html similarity index 100% rename from src/app/login/page-login/page-login.component.html rename to frontend/src/app/login/page-login/page-login.component.html diff --git a/src/app/login/page-login/page-login.component.scss b/frontend/src/app/login/page-login/page-login.component.scss similarity index 100% rename from src/app/login/page-login/page-login.component.scss rename to frontend/src/app/login/page-login/page-login.component.scss diff --git a/src/app/login/page-login/page-login.component.spec.ts b/frontend/src/app/login/page-login/page-login.component.spec.ts similarity index 100% rename from src/app/login/page-login/page-login.component.spec.ts rename to frontend/src/app/login/page-login/page-login.component.spec.ts diff --git a/src/app/login/page-login/page-login.component.ts b/frontend/src/app/login/page-login/page-login.component.ts similarity index 100% rename from src/app/login/page-login/page-login.component.ts rename to frontend/src/app/login/page-login/page-login.component.ts diff --git a/src/app/register/page-register/page-register.component.html b/frontend/src/app/register/page-register/page-register.component.html similarity index 100% rename from src/app/register/page-register/page-register.component.html rename to frontend/src/app/register/page-register/page-register.component.html diff --git a/src/app/register/page-register/page-register.component.scss b/frontend/src/app/register/page-register/page-register.component.scss similarity index 100% rename from src/app/register/page-register/page-register.component.scss rename to frontend/src/app/register/page-register/page-register.component.scss diff --git a/src/app/register/page-register/page-register.component.spec.ts b/frontend/src/app/register/page-register/page-register.component.spec.ts similarity index 100% rename from src/app/register/page-register/page-register.component.spec.ts rename to frontend/src/app/register/page-register/page-register.component.spec.ts diff --git a/src/app/register/page-register/page-register.component.ts b/frontend/src/app/register/page-register/page-register.component.ts similarity index 100% rename from src/app/register/page-register/page-register.component.ts rename to frontend/src/app/register/page-register/page-register.component.ts diff --git a/src/app/register/popup-confirm-register/popup-confirm-register.component.html b/frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.html similarity index 100% rename from src/app/register/popup-confirm-register/popup-confirm-register.component.html rename to frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.html diff --git a/src/app/register/popup-confirm-register/popup-confirm-register.component.scss b/frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.scss similarity index 100% rename from src/app/register/popup-confirm-register/popup-confirm-register.component.scss rename to frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.scss diff --git a/src/app/register/popup-confirm-register/popup-confirm-register.component.spec.ts b/frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.spec.ts similarity index 100% rename from src/app/register/popup-confirm-register/popup-confirm-register.component.spec.ts rename to frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.spec.ts diff --git a/src/app/register/popup-confirm-register/popup-confirm-register.component.ts b/frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.ts similarity index 100% rename from src/app/register/popup-confirm-register/popup-confirm-register.component.ts rename to frontend/src/app/register/popup-confirm-register/popup-confirm-register.component.ts diff --git a/src/app/user/myProfil/commentary.txt b/frontend/src/app/user/myProfil/commentary.txt similarity index 100% rename from src/app/user/myProfil/commentary.txt rename to frontend/src/app/user/myProfil/commentary.txt diff --git a/src/app/user/page-registry/page-registry.component.html b/frontend/src/app/user/page-registry/page-registry.component.html similarity index 100% rename from src/app/user/page-registry/page-registry.component.html rename to frontend/src/app/user/page-registry/page-registry.component.html diff --git a/src/app/user/page-registry/page-registry.component.scss b/frontend/src/app/user/page-registry/page-registry.component.scss similarity index 100% rename from src/app/user/page-registry/page-registry.component.scss rename to frontend/src/app/user/page-registry/page-registry.component.scss diff --git a/src/app/user/page-registry/page-registry.component.spec.ts b/frontend/src/app/user/page-registry/page-registry.component.spec.ts similarity index 100% rename from src/app/user/page-registry/page-registry.component.spec.ts rename to frontend/src/app/user/page-registry/page-registry.component.spec.ts diff --git a/src/app/user/page-registry/page-registry.component.ts b/frontend/src/app/user/page-registry/page-registry.component.ts similarity index 100% rename from src/app/user/page-registry/page-registry.component.ts rename to frontend/src/app/user/page-registry/page-registry.component.ts diff --git a/src/assets/.gitkeep b/frontend/src/assets/.gitkeep similarity index 100% rename from src/assets/.gitkeep rename to frontend/src/assets/.gitkeep diff --git a/src/assets/logo.png b/frontend/src/assets/logo.png similarity index 100% rename from src/assets/logo.png rename to frontend/src/assets/logo.png diff --git a/src/assets/logo1.png b/frontend/src/assets/logo1.png similarity index 100% rename from src/assets/logo1.png rename to frontend/src/assets/logo1.png diff --git a/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts similarity index 55% rename from src/environments/environment.prod.ts rename to frontend/src/environments/environment.prod.ts index b5bca68..dc660af 100644 --- a/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - debutUrl: 'http://127.0.0.1:5000/api/' + debutUrl: 'http://127.0.0.1:4200/api/' }; diff --git a/src/environments/environment.ts b/frontend/src/environments/environment.ts similarity index 93% rename from src/environments/environment.ts rename to frontend/src/environments/environment.ts index 0dfd866..ab9ef5a 100644 --- a/src/environments/environment.ts +++ b/frontend/src/environments/environment.ts @@ -5,7 +5,7 @@ export const environment = { production: false, - debutUrl: 'http://127.0.0.1:5000/api/' + debutUrl: 'http://127.0.0.1:4200/api/' }; /* diff --git a/src/favicon.ico b/frontend/src/favicon.ico similarity index 100% rename from src/favicon.ico rename to frontend/src/favicon.ico diff --git a/src/index.html b/frontend/src/index.html similarity index 100% rename from src/index.html rename to frontend/src/index.html diff --git a/src/main.ts b/frontend/src/main.ts similarity index 100% rename from src/main.ts rename to frontend/src/main.ts diff --git a/src/polyfills.ts b/frontend/src/polyfills.ts similarity index 100% rename from src/polyfills.ts rename to frontend/src/polyfills.ts diff --git a/src/styles.scss b/frontend/src/styles.scss similarity index 100% rename from src/styles.scss rename to frontend/src/styles.scss diff --git a/src/test.ts b/frontend/src/test.ts similarity index 100% rename from src/test.ts rename to frontend/src/test.ts diff --git a/tsconfig.app.json b/frontend/tsconfig.app.json similarity index 100% rename from tsconfig.app.json rename to frontend/tsconfig.app.json diff --git a/tsconfig.json b/frontend/tsconfig.json similarity index 100% rename from tsconfig.json rename to frontend/tsconfig.json diff --git a/tsconfig.spec.json b/frontend/tsconfig.spec.json similarity index 100% rename from tsconfig.spec.json rename to frontend/tsconfig.spec.json diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1449498 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +Flask==2.0.2 +Flask-Testing==0.8.1 +Flask-WTF==0.15.1 +PyJWT==2.3.0 +pytest==6.2.5 +psycopg2==2.9.2 +Flask-Cors==3.0.10 diff --git a/backend/application/responses.py b/responses.py similarity index 100% rename from backend/application/responses.py rename to responses.py diff --git a/backend/application/routes.py b/routes.py similarity index 94% rename from backend/application/routes.py rename to routes.py index c101915..476d4fe 100644 --- a/backend/application/routes.py +++ b/routes.py @@ -1,28 +1,29 @@ -from flask import request, Blueprint, render_template, current_app as app +from flask import request, Blueprint, send_from_directory, current_app as app +import requests +import os from werkzeug.exceptions import HTTPException from .responses import send_message, send_error -import requests from .sessionJWT import create_auth_token, check_auth_token # Request Post def request_post(url, data_json): - return requests.post(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) + return requests.post(app.config['API_URL'] + url, json=data_json) # Request Put def request_put(url, data_json): - return requests.put(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) + return requests.put(app.config['API_URL'] + url, json=data_json) # Request Get def request_get(url): - return requests.get(app.config['SQLALCHEMY_BINDS'] + url) + return requests.get(app.config['API_URL'] + url) # Request Delete def request_delete(url, data_json): - return requests.delete(app.config['SQLALCHEMY_BINDS'] + url, json=data_json) + return requests.delete(app.config['API_URL'] + url, json=data_json) bp = Blueprint('myapp', __name__) @@ -35,7 +36,17 @@ def handle_exception(e): @bp.route('/', methods=['GET']) def root(): - return render_template('index.html') + return send_from_directory("frontend/dist", "index.html") + + +@bp.route('/frontend/dist/', methods=['GET']) +def static(path): + return send_from_directory("frontend/dist", path) + + +@bp.route('/assets/', methods=['GET']) +def assets(path): + return send_from_directory("frontend/dist/assets", path) # Login diff --git a/backend/application/sessionJWT.py b/sessionJWT.py similarity index 100% rename from backend/application/sessionJWT.py rename to sessionJWT.py From 7a787ec562a4c129d6262909365fa8924d4f2d2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Mon, 31 Jan 2022 16:16:36 +0100 Subject: [PATCH 09/31] / added for the baseHref of the build --- frontend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index d95a55b..4337554 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -4,7 +4,7 @@ "scripts": { "ng": "ng", "start": "ng build && python flask run", - "build": "ng build --build-optimizer --baseHref=frontend/dist", + "build": "ng build --build-optimizer --baseHref=frontend/dist/", "watch": "ng build --watch --configuration development", "test": "ng test" }, From 676f564656813d32d2dc2a902e5f5569a7469e1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Mon, 31 Jan 2022 16:17:47 +0100 Subject: [PATCH 10/31] Changed: Origin Port --- __init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__init__.py b/__init__.py index ce09789..85e3463 100644 --- a/__init__.py +++ b/__init__.py @@ -6,7 +6,7 @@ def create_app(flask_env='development'): app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['http://127.0.0.1:5000', 'http://localhost:5000'] + origin = ['http://127.0.0.1:4200', 'http://localhost:4200'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") From 886f22ac8534451d0aa8bf4f2abb5fcea15d4d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Mon, 31 Jan 2022 17:27:31 +0100 Subject: [PATCH 11/31] Changed: Origin Port --- routes.py | 69 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/routes.py b/routes.py index 476d4fe..e53ae17 100644 --- a/routes.py +++ b/routes.py @@ -60,11 +60,11 @@ def login(): ip = request.remote_addr # res = db_login(ip, post_email, post_password) res = request_post('login', {'ip': ip, 'email': post_email, 'password': post_password}).json() - if res['status'] == 0: + if res['status'] == 'success': user = res['data'] token = create_auth_token(user) return send_message(res['message'], user, token) - elif res['status'] == 1: + elif res['status'] == 'error': user = None token = create_auth_token(user) return send_error(400, res['message'], token) @@ -87,9 +87,9 @@ def register(): # res = db_register(ip, post_email, post_nickname, post_password) res = request_post('register', {'ip': ip, 'email': post_email, 'nickname': post_nickname, 'password': post_password}).json() - if res['status'] == 1: + if res['status'] == 'error': return send_error(500, res['message']) - elif res['status'] == 0: + elif res['status'] == 'success': return send_message(res['message'], res['data']) else: return send_error(400, 'Empty email and/or password and/or nickname fields.') @@ -104,9 +104,8 @@ def logout(): if token['success']: ip = request.remote_addr user_id = token['payload']['id'] - request_post('logout', {'ip': ip, 'user_id': user_id}).json() - message = 'User disconnected.' - return send_message(message, None, token_delete=True) + res = request_delete('logout', {'ip': ip, 'user_id': user_id}).json() + return send_message(res['message'], None, token_delete=True) else: return send_error(500, token['message']) @@ -135,11 +134,11 @@ def user_update(): ip = request.remote_addr user_id = token['payload']['id'] # res = db_user_update(ip, user_id, post_nickname, post_password) - res = request_post('user/update', {'ip': ip, 'user_id': user_id, 'nickname': post_nickname, + res = request_put('user/update', {'ip': ip, 'user_id': user_id, 'nickname': post_nickname, 'password': post_password}).json() - if res['status'] == 1: + if res['status'] == 'error': return send_error(500, res['message']) - elif res['status'] == 0: + elif res['status'] == 'success': return send_message(res['message'], res['data']) else: return send_error(400, 'Empty nickname and/or password fields.') @@ -157,8 +156,8 @@ def user_delete(): ip = request.remote_addr user_id = token['payload']['id'] # res = db_user_delete(ip, user_id) - res = request_post('user/delete', {'ip': ip, 'user_id': user_id}).json() - if res['status'] != 0: + res = request_delete('user/delete', {'ip': ip, 'user_id': user_id}).json() + if res['status'] != 'success': return send_error(500, res['message']) else: return send_message(res['message'], None, token_delete=True) @@ -212,10 +211,10 @@ def admin_create_user(): 'nickname': post_nickname, 'password': post_password, 'is_admin': post_is_admin - }) - if res['status'] == 1: + }).json() + if res['status'] == 'error': return send_error(500, res['message']) - elif res['status'] == 0: + elif res['status'] == 'success': return send_message(res['message'], res['data']) else: return send_error(400, 'Empty email and/or nickname and/or password and/or is_admin fields.') @@ -263,13 +262,13 @@ def admin_update_user(): 'ip': ip, 'user_id': user_id, 'token_is_admin': is_admin, - 'user_id_delete': post_user_id_delete, + 'id': post_user_id_delete, 'is_admin': post_is_admin, 'password': post_password - }) - if res['status'] == 1: + }).json() + if res['status'] == 'error': return send_error(500, res['message']) - elif res['status'] == 0: + elif res['status'] == 'success': return send_message(res['message'], res['data']) else: return send_error(400, 'Empty is_admin and/or password fields.') @@ -304,9 +303,9 @@ def admin_delete_user(id): 'ip': ip, 'user_id': user_id, 'token_is_admin': is_admin, - 'user_id_delete': post_user_id_delete - }) - if res['status'] == 1: + 'id': post_user_id_delete + }).json() + if res['status'] == 'error': return send_error(500, res['message']) else: return send_message(res['message'], None) @@ -327,23 +326,35 @@ def users(): if token['success']: ip = request.remote_addr user_id = token['payload']['id'] + + filter = '' get_query = request.args.get('q') + if get_query is not None: + filter += f'&q={get_query}' + get_by = request.args.get('by') + if get_by is not None: + filter += f'&by={get_by}' + get_id = request.args.get('id') + if get_id is not None: + filter += f'&id={get_id}' + get_is_admin = request.args.get('is_admin') + if get_is_admin is not None: + filter += f'&is_admin={get_is_admin}' + get_order_by = request.args.get('order_by') + if get_order_by is not None: + filter += f'&order_by={get_order_by}' # res = db_users(ip, user_id, get_query, get_by, get_id, get_is_admin, get_order_by) res = request_get( 'users' f'?ip={ip}' f'&user_id={user_id}' - f'&q={get_query}' - f'&by={get_by}' - f'&id={get_id}' - f'&is_admin={get_is_admin}' - f'&order_by={get_order_by}' - ) - if res['status'] == 1: + f'{filter}' + ).json() + if res['status'] == 'error': return send_error(500, res['message']) else: return send_message(res['message'], res['data']) From 1a3bee1846e5108ba13b72f9125f53f677d6f98c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Tue, 1 Feb 2022 16:27:57 +0100 Subject: [PATCH 12/31] Docker Test with Nginx --- docker-compose.yml | 41 ++++++++++++++----- frontend/.gitignore | 2 + frontend/angular.json | 10 ++--- app.py => frontend/app.py | 4 +- Dockerfile => frontend/backend/Dockerfile | 5 ++- __init__.py => frontend/backend/__init__.py | 0 .../backend/requirements.txt | 1 + responses.py => frontend/backend/responses.py | 0 routes.py => frontend/backend/routes.py | 9 ++-- .../backend/sessionJWT.py | 0 frontend/conf/nginx.conf | 14 +++---- config.py => frontend/config.py | 0 frontend/logs/nginx/access.log | 14 +++++++ frontend/package.json | 4 +- 14 files changed, 70 insertions(+), 34 deletions(-) rename app.py => frontend/app.py (50%) rename Dockerfile => frontend/backend/Dockerfile (66%) rename __init__.py => frontend/backend/__init__.py (100%) rename requirements.txt => frontend/backend/requirements.txt (87%) rename responses.py => frontend/backend/responses.py (100%) rename routes.py => frontend/backend/routes.py (98%) rename sessionJWT.py => frontend/backend/sessionJWT.py (100%) rename config.py => frontend/config.py (100%) diff --git a/docker-compose.yml b/docker-compose.yml index fcb4319..6e0db76 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,27 +4,46 @@ services: nginx: image: nginx:latest volumes: - - ./conf/nginx.conf:/etc/nginx/nginx.conf - - ./logs/nginx:/etc/nginx/logs - - ./cert:/etc/nginx/cert + - ./frontend/conf/nginx.conf:/etc/nginx/nginx.conf + - ./frontend/logs/nginx:/etc/nginx/logs + - ./frontend/cert:/etc/nginx/cert networks: - net ports: - 80:80 + depends_on: + - server + + server: + container_name: server + build: frontend/backend + command: python -m flask run + ports: + - "4200:4200" + volumes: + - ./frontend/backend:/data/frontend/backend + - ./frontend/app.py:/data/frontend/app.py + - ./frontend/config.py:/data/frontend/config.py + environment: + - FLASK_APP=app.py + - FLASK_ENV=production + - FLASK_DEBUG=1 + - FLASK_RUN_PORT=4200 + - PYTHONUNBUFFERED=1 + networks: + - net + depends_on: + - frontend frontend: container_name: frontend - build: . - command: npm start - # ports: - # - "4200:4200" + build: frontend + command: npm run build volumes: - - ./src:/data/frontend - - ./node_modules:/data/frontend/node_modules + - ./frontend/src:/data/frontend + - ./frontend/node_modules:/data/frontend/node_modules environment: - NODE_ENV=production - networks: - - net networks: net: diff --git a/frontend/.gitignore b/frontend/.gitignore index bac05b4..350e08c 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -47,3 +47,5 @@ testem.log Thumbs.db package-lock.json + +backend/dist diff --git a/frontend/angular.json b/frontend/angular.json index 6dd4c96..9877372 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -20,7 +20,7 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "outputPath": "dist/", + "outputPath": "backend/dist/", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", @@ -42,13 +42,13 @@ "budgets": [ { "type": "initial", - "maximumWarning": "500kb", - "maximumError": "1mb" + "maximumWarning": "1mb", + "maximumError": "2mb" }, { "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" + "maximumWarning": "4kb", + "maximumError": "8kb" } ], "fileReplacements": [ diff --git a/app.py b/frontend/app.py similarity index 50% rename from app.py rename to frontend/app.py index 2faec63..3f85513 100644 --- a/app.py +++ b/frontend/app.py @@ -1,7 +1,7 @@ -from . import create_app +from backend import create_app import os -app = create_app(os.environ.get('FLASK_ENV', None)) +app = create_app(os.environ.get('FLASK_ENV')) if __name__ == "__main__": app.run(host='0.0.0.0', DEBUG=True) diff --git a/Dockerfile b/frontend/backend/Dockerfile similarity index 66% rename from Dockerfile rename to frontend/backend/Dockerfile index 2987276..041b46d 100644 --- a/Dockerfile +++ b/frontend/backend/Dockerfile @@ -1,6 +1,7 @@ FROM python:latest -WORKDIR /data/backend +WORKDIR /data/frontend/backend COPY requirements.txt requirements.txt RUN pip install --upgrade pip RUN pip install -r requirements.txt -COPY . . \ No newline at end of file +COPY . . +WORKDIR /data/frontend diff --git a/__init__.py b/frontend/backend/__init__.py similarity index 100% rename from __init__.py rename to frontend/backend/__init__.py diff --git a/requirements.txt b/frontend/backend/requirements.txt similarity index 87% rename from requirements.txt rename to frontend/backend/requirements.txt index 1449498..887af13 100644 --- a/requirements.txt +++ b/frontend/backend/requirements.txt @@ -5,3 +5,4 @@ PyJWT==2.3.0 pytest==6.2.5 psycopg2==2.9.2 Flask-Cors==3.0.10 +requests==2.22.0 diff --git a/responses.py b/frontend/backend/responses.py similarity index 100% rename from responses.py rename to frontend/backend/responses.py diff --git a/routes.py b/frontend/backend/routes.py similarity index 98% rename from routes.py rename to frontend/backend/routes.py index e53ae17..cba8040 100644 --- a/routes.py +++ b/frontend/backend/routes.py @@ -1,6 +1,5 @@ from flask import request, Blueprint, send_from_directory, current_app as app import requests -import os from werkzeug.exceptions import HTTPException from .responses import send_message, send_error from .sessionJWT import create_auth_token, check_auth_token @@ -36,17 +35,17 @@ def handle_exception(e): @bp.route('/', methods=['GET']) def root(): - return send_from_directory("frontend/dist", "index.html") + return send_from_directory("dist", "index.html") -@bp.route('/frontend/dist/', methods=['GET']) +@bp.route('/frontend/backend/dist/', methods=['GET']) def static(path): - return send_from_directory("frontend/dist", path) + return send_from_directory("dist", path) @bp.route('/assets/', methods=['GET']) def assets(path): - return send_from_directory("frontend/dist/assets", path) + return send_from_directory("dist/assets", path) # Login diff --git a/sessionJWT.py b/frontend/backend/sessionJWT.py similarity index 100% rename from sessionJWT.py rename to frontend/backend/sessionJWT.py diff --git a/frontend/conf/nginx.conf b/frontend/conf/nginx.conf index 375380c..315d874 100644 --- a/frontend/conf/nginx.conf +++ b/frontend/conf/nginx.conf @@ -16,21 +16,21 @@ http { proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffers 32 4k; - - upstream frontend { - server frontend:4200; + + upstream server { + server server:4200; } server { listen 80; - server_name wordpress; + server_name flask-aled; access_log logs/access.log; location / { - proxy_pass http://frontend; + proxy_pass http://server; } } - -} \ No newline at end of file + +} diff --git a/config.py b/frontend/config.py similarity index 100% rename from config.py rename to frontend/config.py diff --git a/frontend/logs/nginx/access.log b/frontend/logs/nginx/access.log index 98ba7b7..7926e49 100644 --- a/frontend/logs/nginx/access.log +++ b/frontend/logs/nginx/access.log @@ -19,3 +19,17 @@ 192.168.16.1 - - [28/Jan/2022:11:04:23 +0000] "GET /styles.f64087845b474dd2.css HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" 192.168.16.1 - - [28/Jan/2022:11:04:23 +0000] "GET /assets/logo.png HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" 192.168.16.1 - - [28/Jan/2022:11:04:23 +0000] "GET /favicon.ico HTTP/1.1" 200 948 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.21.0.1 - - [01/Feb/2022:14:58:24 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.21.0.1 - - [01/Feb/2022:14:58:25 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.21.0.1 - - [01/Feb/2022:14:58:30 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.21.0.1 - - [01/Feb/2022:14:58:30 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://127.0.0.1/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.21.0.1 - - [01/Feb/2022:15:01:07 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.21.0.1 - - [01/Feb/2022:15:01:07 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://127.0.0.1/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.22.0.1 - - [01/Feb/2022:15:14:43 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.22.0.1 - - [01/Feb/2022:15:14:43 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://127.0.0.1/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.22.0.1 - - [01/Feb/2022:15:19:49 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.22.0.1 - - [01/Feb/2022:15:19:52 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.22.0.1 - - [01/Feb/2022:15:22:17 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.22.0.1 - - [01/Feb/2022:15:22:18 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.22.0.1 - - [01/Feb/2022:15:22:19 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.22.0.1 - - [01/Feb/2022:15:22:19 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" diff --git a/frontend/package.json b/frontend/package.json index 4337554..b347ace 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -3,8 +3,8 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "ng build && python flask run", - "build": "ng build --build-optimizer --baseHref=frontend/dist/", + "start": "ng build --build-optimizer --baseHref=frontend/backend/dist/ && cd .. && python -m flask run", + "build": "ng build --build-optimizer --baseHref=frontend/backend/dist/", "watch": "ng build --watch --configuration development", "test": "ng test" }, From fcedd7534c1d7dc042297a1e24a9db57089bd8fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Tue, 1 Feb 2022 19:38:39 +0100 Subject: [PATCH 13/31] Update: save Docker nginx Angular Node Flask --- docker-compose.yml | 50 ------------------- frontend/angular.json | 2 +- frontend/app.py | 7 --- frontend/backend/Dockerfile | 2 - frontend/backend/app.py | 9 ++++ .../backend/{ => application}/__init__.py | 3 ++ .../backend/{ => application}/responses.py | 2 + frontend/backend/{ => application}/routes.py | 18 ++----- .../backend/{ => application}/sessionJWT.py | 3 ++ frontend/{ => backend}/config.py | 5 +- frontend/conf/nginx.conf | 6 +-- frontend/docker-compose.yml | 45 +++++++++++++++++ frontend/package.json | 4 +- frontend/server.js | 13 +++++ frontend/src/environments/environment.prod.ts | 2 +- frontend/src/environments/environment.ts | 2 +- 16 files changed, 89 insertions(+), 84 deletions(-) delete mode 100644 docker-compose.yml delete mode 100644 frontend/app.py create mode 100644 frontend/backend/app.py rename frontend/backend/{ => application}/__init__.py (91%) rename frontend/backend/{ => application}/responses.py (94%) rename frontend/backend/{ => application}/routes.py (97%) rename frontend/backend/{ => application}/sessionJWT.py (93%) rename frontend/{ => backend}/config.py (81%) create mode 100644 frontend/docker-compose.yml create mode 100644 frontend/server.js diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 6e0db76..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,50 +0,0 @@ -version: '3.8' - -services: - nginx: - image: nginx:latest - volumes: - - ./frontend/conf/nginx.conf:/etc/nginx/nginx.conf - - ./frontend/logs/nginx:/etc/nginx/logs - - ./frontend/cert:/etc/nginx/cert - networks: - - net - ports: - - 80:80 - depends_on: - - server - - server: - container_name: server - build: frontend/backend - command: python -m flask run - ports: - - "4200:4200" - volumes: - - ./frontend/backend:/data/frontend/backend - - ./frontend/app.py:/data/frontend/app.py - - ./frontend/config.py:/data/frontend/config.py - environment: - - FLASK_APP=app.py - - FLASK_ENV=production - - FLASK_DEBUG=1 - - FLASK_RUN_PORT=4200 - - PYTHONUNBUFFERED=1 - networks: - - net - depends_on: - - frontend - - frontend: - container_name: frontend - build: frontend - command: npm run build - volumes: - - ./frontend/src:/data/frontend - - ./frontend/node_modules:/data/frontend/node_modules - environment: - - NODE_ENV=production - -networks: - net: - driver: bridge diff --git a/frontend/angular.json b/frontend/angular.json index 9877372..c961521 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -20,7 +20,7 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "outputPath": "backend/dist/", + "outputPath": "dist/frontend", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", diff --git a/frontend/app.py b/frontend/app.py deleted file mode 100644 index 3f85513..0000000 --- a/frontend/app.py +++ /dev/null @@ -1,7 +0,0 @@ -from backend import create_app -import os - -app = create_app(os.environ.get('FLASK_ENV')) - -if __name__ == "__main__": - app.run(host='0.0.0.0', DEBUG=True) diff --git a/frontend/backend/Dockerfile b/frontend/backend/Dockerfile index 041b46d..0b0cc90 100644 --- a/frontend/backend/Dockerfile +++ b/frontend/backend/Dockerfile @@ -1,7 +1,5 @@ FROM python:latest -WORKDIR /data/frontend/backend COPY requirements.txt requirements.txt RUN pip install --upgrade pip RUN pip install -r requirements.txt COPY . . -WORKDIR /data/frontend diff --git a/frontend/backend/app.py b/frontend/backend/app.py new file mode 100644 index 0000000..1f5e483 --- /dev/null +++ b/frontend/backend/app.py @@ -0,0 +1,9 @@ +print("Import backend") +from application import create_app +print("Import os") +import os + +app = create_app(os.environ.get('FLASK_ENV')) + +if __name__ == "__main__": + app.run(host='0.0.0.0', DEBUG=True) diff --git a/frontend/backend/__init__.py b/frontend/backend/application/__init__.py similarity index 91% rename from frontend/backend/__init__.py rename to frontend/backend/application/__init__.py index 85e3463..ef08a90 100644 --- a/frontend/backend/__init__.py +++ b/frontend/backend/application/__init__.py @@ -1,8 +1,11 @@ +print("Import Flask") from flask import Flask +print("Import Flask-Cors") from flask_cors import CORS def create_app(flask_env='development'): + print("create app") app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: diff --git a/frontend/backend/responses.py b/frontend/backend/application/responses.py similarity index 94% rename from frontend/backend/responses.py rename to frontend/backend/application/responses.py index 03e11a6..32453c8 100644 --- a/frontend/backend/responses.py +++ b/frontend/backend/application/responses.py @@ -1,4 +1,6 @@ +print("Import responses Flask") from flask import current_app as app +print("Import Json") import json diff --git a/frontend/backend/routes.py b/frontend/backend/application/routes.py similarity index 97% rename from frontend/backend/routes.py rename to frontend/backend/application/routes.py index cba8040..b510218 100644 --- a/frontend/backend/routes.py +++ b/frontend/backend/application/routes.py @@ -1,5 +1,8 @@ +print("Import Flask") from flask import request, Blueprint, send_from_directory, current_app as app +print("Import Requests") import requests +print("Import werkzeug") from werkzeug.exceptions import HTTPException from .responses import send_message, send_error from .sessionJWT import create_auth_token, check_auth_token @@ -33,21 +36,6 @@ def handle_exception(e): return send_error(e.code, e.name) -@bp.route('/', methods=['GET']) -def root(): - return send_from_directory("dist", "index.html") - - -@bp.route('/frontend/backend/dist/', methods=['GET']) -def static(path): - return send_from_directory("dist", path) - - -@bp.route('/assets/', methods=['GET']) -def assets(path): - return send_from_directory("dist/assets", path) - - # Login @bp.route('/api/login', methods=['POST']) def login(): diff --git a/frontend/backend/sessionJWT.py b/frontend/backend/application/sessionJWT.py similarity index 93% rename from frontend/backend/sessionJWT.py rename to frontend/backend/application/sessionJWT.py index ef228fb..2722453 100644 --- a/frontend/backend/sessionJWT.py +++ b/frontend/backend/application/sessionJWT.py @@ -1,5 +1,8 @@ +print("Import datetime") from datetime import datetime, timedelta +print("Import sessionJWT Flask") from flask import current_app as app +print("Import jwt") import jwt diff --git a/frontend/config.py b/frontend/backend/config.py similarity index 81% rename from frontend/config.py rename to frontend/backend/config.py index c689319..3242208 100644 --- a/frontend/config.py +++ b/frontend/backend/config.py @@ -1,3 +1,4 @@ +print("Import os") import os basedir = os.path.abspath(os.path.dirname(__file__)) @@ -10,9 +11,9 @@ class Config(object): FLASK_APP = os.environ.get('FLASK_APP', None) FLASK_ENV = os.environ.get('FLASK_ENV', None) - FLASK_RUN_PORT = os.environ.get('FLASK_RUN_PORT', 4200) + FLASK_RUN_PORT = os.environ.get('FLASK_RUN_PORT', 5000) - API_URL = os.environ.get('API_URL', 'http://127.0.0.1:5000/api/') + API_URL = os.environ.get('API_URL', 'http://127.0.0.1:5001/api/') SECRET_KEY = os.environ.get('SECRET_KEY', 'default_secret_key') ALLOW_ORIGIN = os.environ.get('ALLOW_ORIGIN', None) diff --git a/frontend/conf/nginx.conf b/frontend/conf/nginx.conf index 315d874..3e7fc19 100644 --- a/frontend/conf/nginx.conf +++ b/frontend/conf/nginx.conf @@ -17,8 +17,8 @@ http { proxy_read_timeout 90; proxy_buffers 32 4k; - upstream server { - server server:4200; + upstream frontend { + server frontend:4200; } @@ -28,7 +28,7 @@ http { access_log logs/access.log; location / { - proxy_pass http://server; + proxy_pass http://frontend; } } diff --git a/frontend/docker-compose.yml b/frontend/docker-compose.yml new file mode 100644 index 0000000..b5ffa7c --- /dev/null +++ b/frontend/docker-compose.yml @@ -0,0 +1,45 @@ +version: '3.8' + +services: + nginx: + image: nginx:latest + volumes: + - ./conf/nginx.conf:/etc/nginx/nginx.conf + - ./logs/nginx:/etc/nginx/logs + - ./cert:/etc/nginx/cert + networks: + - net + ports: + - 80:80 + depends_on: + - frontend + + flask-frontend: + container_name: flask-frontend + build: backend + command: python -m flask run + volumes: + - ./backend:/data/backend + environment: + - FLASK_APP=app.py + - FLASK_ENV=development + - FLASK_DEBUG=0 + - FLASK_RUN_PORT=5000 + depends_on: + - frontend + + frontend: + container_name: frontend + build: . + command: npm start + volumes: + - ./src:/data/frontend + - ./node_modules:/data/frontend/node_modules + environment: + - NODE_ENV=production + networks: + - net + +networks: + net: + driver: bridge diff --git a/frontend/package.json b/frontend/package.json index b347ace..2f177c9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -3,8 +3,8 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "ng build --build-optimizer --baseHref=frontend/backend/dist/ && cd .. && python -m flask run", - "build": "ng build --build-optimizer --baseHref=frontend/backend/dist/", + "start": "ng build && node server.js", + "build": "ng build", "watch": "ng build --watch --configuration development", "test": "ng test" }, diff --git a/frontend/server.js b/frontend/server.js new file mode 100644 index 0000000..7398651 --- /dev/null +++ b/frontend/server.js @@ -0,0 +1,13 @@ +const path = require('path'); +const express = require('express'); +const app = express(); +const port = process.env.PORT || 4200; + +app.use(express.static(__dirname + '/dist/frontend')); +app.get('/*', function(req,res) { + res.sendFile(path.join(__dirname+ '/dist/frontend/index.html')); +}); + +app.listen(port, '0.0.0.0',() => { + console.log (`listening on port ${port}`); +}); diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts index dc660af..b5bca68 100644 --- a/frontend/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - debutUrl: 'http://127.0.0.1:4200/api/' + debutUrl: 'http://127.0.0.1:5000/api/' }; diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts index ab9ef5a..0dfd866 100644 --- a/frontend/src/environments/environment.ts +++ b/frontend/src/environments/environment.ts @@ -5,7 +5,7 @@ export const environment = { production: false, - debutUrl: 'http://127.0.0.1:4200/api/' + debutUrl: 'http://127.0.0.1:5000/api/' }; /* From 33b71bed0c73c38adc7d9c6153c2c0e34bc14492 Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Tue, 1 Feb 2022 19:54:48 +0100 Subject: [PATCH 14/31] Update nginx.conf --- frontend/conf/nginx.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/conf/nginx.conf b/frontend/conf/nginx.conf index 3e7fc19..2966393 100644 --- a/frontend/conf/nginx.conf +++ b/frontend/conf/nginx.conf @@ -24,7 +24,6 @@ http { server { listen 80; - server_name flask-aled; access_log logs/access.log; location / { From 14e0775213ccfea7a5d2323e665c41e55efa8ad5 Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Wed, 2 Feb 2022 09:32:09 +0100 Subject: [PATCH 15/31] Update nginx.conf --- frontend/conf/nginx.conf | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/conf/nginx.conf b/frontend/conf/nginx.conf index 2966393..4659260 100644 --- a/frontend/conf/nginx.conf +++ b/frontend/conf/nginx.conf @@ -21,6 +21,10 @@ http { server frontend:4200; } + upstream flask-frontend { + server flask-frontend:5000; + } + server { listen 80; @@ -30,6 +34,10 @@ http { proxy_pass http://frontend; } + location /api { + proxy_pass http://flask-frontend; + } + } } From 06962388a53a9a2ef19a058822f63806d822d4eb Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Wed, 2 Feb 2022 09:36:29 +0100 Subject: [PATCH 16/31] Update nginx.conf --- frontend/conf/nginx.conf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/conf/nginx.conf b/frontend/conf/nginx.conf index 4659260..a022b5c 100644 --- a/frontend/conf/nginx.conf +++ b/frontend/conf/nginx.conf @@ -33,11 +33,15 @@ http { location / { proxy_pass http://frontend; } + } + + server { + listen 80; + access_log logs/access.log; location /api { proxy_pass http://flask-frontend; } - } } From c4a6ff131244735f59b02b244e9be5876bc63678 Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Wed, 2 Feb 2022 09:46:23 +0100 Subject: [PATCH 17/31] update rp --- frontend/conf/nginx.conf | 14 ++++++---- frontend/docker-compose.yml | 49 ++++++++++++++++++---------------- frontend/logs/nginx/access.log | 14 ++++++++++ 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/frontend/conf/nginx.conf b/frontend/conf/nginx.conf index a022b5c..0d5f437 100644 --- a/frontend/conf/nginx.conf +++ b/frontend/conf/nginx.conf @@ -33,15 +33,19 @@ http { location / { proxy_pass http://frontend; } - } - - server { - listen 80; - access_log logs/access.log; location /api { proxy_pass http://flask-frontend; } } + # server { + # listen 80; + # access_log logs/access.log; + + # location /api { + # proxy_pass http://flask-frontend; + # } + # } + } diff --git a/frontend/docker-compose.yml b/frontend/docker-compose.yml index b5ffa7c..6c07a23 100644 --- a/frontend/docker-compose.yml +++ b/frontend/docker-compose.yml @@ -1,32 +1,19 @@ version: '3.8' services: - nginx: - image: nginx:latest - volumes: - - ./conf/nginx.conf:/etc/nginx/nginx.conf - - ./logs/nginx:/etc/nginx/logs - - ./cert:/etc/nginx/cert - networks: - - net - ports: - - 80:80 - depends_on: - - frontend - - flask-frontend: - container_name: flask-frontend - build: backend - command: python -m flask run + nginx-front: + image: nginx:latest volumes: - - ./backend:/data/backend - environment: - - FLASK_APP=app.py - - FLASK_ENV=development - - FLASK_DEBUG=0 - - FLASK_RUN_PORT=5000 + - ./conf/nginx.conf:/etc/nginx/nginx.conf + - ./logs/nginx:/etc/nginx/logs + - ./cert:/etc/nginx/cert + networks: + - net + ports: + - 80:80 depends_on: - frontend + - flask-frontend frontend: container_name: frontend @@ -40,6 +27,22 @@ services: networks: - net + flask-frontend: + container_name: flask-frontend + build: backend + command: python -m flask run + volumes: + - ./backend:/data/backend + environment: + - FLASK_APP=app.py + - FLASK_ENV=development + - FLASK_DEBUG=0 + - FLASK_RUN_PORT=5000 + networks: + - net + depends_on: + - frontend + networks: net: driver: bridge diff --git a/frontend/logs/nginx/access.log b/frontend/logs/nginx/access.log index 7926e49..b657bb1 100644 --- a/frontend/logs/nginx/access.log +++ b/frontend/logs/nginx/access.log @@ -33,3 +33,17 @@ 172.22.0.1 - - [01/Feb/2022:15:22:18 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" 172.22.0.1 - - [01/Feb/2022:15:22:19 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" 172.22.0.1 - - [01/Feb/2022:15:22:19 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" +172.28.0.1 - - [02/Feb/2022:08:44:58 +0000] "GET / HTTP/1.1" 200 2713 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:44:59 +0000] "GET /runtime.aaedba49815d2ab0.js HTTP/1.1" 200 1066 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:44:59 +0000] "GET /polyfills.0cf80192f5858f6f.js HTTP/1.1" 200 37090 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:44:59 +0000] "GET /styles.f64087845b474dd2.css HTTP/1.1" 200 235504 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:44:59 +0000] "GET /main.100f2196b68e9ba2.js HTTP/1.1" 200 694159 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:44:59 +0000] "GET /assets/logo.png HTTP/1.1" 200 201990 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:45:01 +0000] "GET /styles.f64087845b474dd2.css HTTP/1.1" 304 0 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:45:52 +0000] "GET / HTTP/1.1" 200 2713 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:45:52 +0000] "GET /runtime.aaedba49815d2ab0.js HTTP/1.1" 200 1066 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:45:52 +0000] "GET /polyfills.0cf80192f5858f6f.js HTTP/1.1" 200 37090 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:45:52 +0000] "GET /main.100f2196b68e9ba2.js HTTP/1.1" 200 694159 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:45:52 +0000] "GET /styles.f64087845b474dd2.css HTTP/1.1" 200 235504 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:45:52 +0000] "GET /assets/logo.png HTTP/1.1" 200 201990 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" +172.28.0.1 - - [02/Feb/2022:08:45:52 +0000] "GET /favicon.ico HTTP/1.1" 200 948 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" From aaa526756b1fb90b806b50c6de059fe1cdba5a37 Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Wed, 2 Feb 2022 10:02:04 +0100 Subject: [PATCH 18/31] update cors ???? --- frontend/backend/app.py | 2 -- frontend/backend/config.py | 2 +- frontend/conf/nginx.conf | 9 --------- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/frontend/backend/app.py b/frontend/backend/app.py index 1f5e483..62d5d48 100644 --- a/frontend/backend/app.py +++ b/frontend/backend/app.py @@ -1,6 +1,4 @@ -print("Import backend") from application import create_app -print("Import os") import os app = create_app(os.environ.get('FLASK_ENV')) diff --git a/frontend/backend/config.py b/frontend/backend/config.py index 3242208..75fbce5 100644 --- a/frontend/backend/config.py +++ b/frontend/backend/config.py @@ -13,7 +13,7 @@ class Config(object): FLASK_ENV = os.environ.get('FLASK_ENV', None) FLASK_RUN_PORT = os.environ.get('FLASK_RUN_PORT', 5000) - API_URL = os.environ.get('API_URL', 'http://127.0.0.1:5001/api/') + API_URL = os.environ.get('API_URL', 'http://127.0.0.1:5000/api/') SECRET_KEY = os.environ.get('SECRET_KEY', 'default_secret_key') ALLOW_ORIGIN = os.environ.get('ALLOW_ORIGIN', None) diff --git a/frontend/conf/nginx.conf b/frontend/conf/nginx.conf index 0d5f437..e1ee6c3 100644 --- a/frontend/conf/nginx.conf +++ b/frontend/conf/nginx.conf @@ -39,13 +39,4 @@ http { } } - # server { - # listen 80; - # access_log logs/access.log; - - # location /api { - # proxy_pass http://flask-frontend; - # } - # } - } From fb5e65c9cbe4dae072b296152a7b0efce41fefc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Wed, 2 Feb 2022 12:25:38 +0100 Subject: [PATCH 19/31] Update: Cors Origin --- frontend/backend/application/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/backend/application/__init__.py b/frontend/backend/application/__init__.py index ef08a90..04ac354 100644 --- a/frontend/backend/application/__init__.py +++ b/frontend/backend/application/__init__.py @@ -9,7 +9,7 @@ def create_app(flask_env='development'): app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['http://127.0.0.1:4200', 'http://localhost:4200'] + origin = ['http://127.0.0.1:5000', 'http://localhost:5000'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") From 54530fe7b5b6ca3b2ea872bb8967f1b4613643d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Wed, 2 Feb 2022 12:27:00 +0100 Subject: [PATCH 20/31] Update: Cors Origin --- frontend/backend/application/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/backend/application/__init__.py b/frontend/backend/application/__init__.py index 04ac354..4443684 100644 --- a/frontend/backend/application/__init__.py +++ b/frontend/backend/application/__init__.py @@ -9,7 +9,7 @@ def create_app(flask_env='development'): app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['http://127.0.0.1:5000', 'http://localhost:5000'] + origin = ['http://127.0.0.1', 'http://localhost'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") From a4403f2694d98a7c7608505b1718316aafa6bfe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Wed, 2 Feb 2022 12:28:41 +0100 Subject: [PATCH 21/31] Update: Cors Origin --- frontend/backend/application/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/backend/application/__init__.py b/frontend/backend/application/__init__.py index 4443684..04ac354 100644 --- a/frontend/backend/application/__init__.py +++ b/frontend/backend/application/__init__.py @@ -9,7 +9,7 @@ def create_app(flask_env='development'): app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['http://127.0.0.1', 'http://localhost'] + origin = ['http://127.0.0.1:5000', 'http://localhost:5000'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") From 27063e37df4789f15a15ffb268cb7e6dbcc50868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Wed, 2 Feb 2022 12:39:51 +0100 Subject: [PATCH 22/31] Update: Cors Origin --- frontend/backend/application/__init__.py | 2 +- frontend/src/environments/environment.prod.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/backend/application/__init__.py b/frontend/backend/application/__init__.py index 04ac354..c1f1630 100644 --- a/frontend/backend/application/__init__.py +++ b/frontend/backend/application/__init__.py @@ -9,7 +9,7 @@ def create_app(flask_env='development'): app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['http://127.0.0.1:5000', 'http://localhost:5000'] + origin = ['*'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts index b5bca68..63d553f 100644 --- a/frontend/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - debutUrl: 'http://127.0.0.1:5000/api/' + debutUrl: 'http://10.1.1.10:5000/api/' }; From 79c4043edfdc2700f6bf5a86000d83c8e25c1473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Wed, 2 Feb 2022 12:48:31 +0100 Subject: [PATCH 23/31] Update: Cors Origin --- frontend/backend/application/__init__.py | 2 +- frontend/src/environments/environment.prod.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/backend/application/__init__.py b/frontend/backend/application/__init__.py index c1f1630..18638d6 100644 --- a/frontend/backend/application/__init__.py +++ b/frontend/backend/application/__init__.py @@ -9,7 +9,7 @@ def create_app(flask_env='development'): app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['*'] + origin = ['http://10.1.1.10', 'http://10.1.5.10'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts index 63d553f..e664d27 100644 --- a/frontend/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - debutUrl: 'http://10.1.1.10:5000/api/' + debutUrl: 'http://10.1.1.10/api/' }; From a010524e7571f1b9097a0346290d2290a9f927cb Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Wed, 2 Feb 2022 13:03:32 +0100 Subject: [PATCH 24/31] Update docker-compose.yml --- frontend/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/docker-compose.yml b/frontend/docker-compose.yml index 6c07a23..f29551a 100644 --- a/frontend/docker-compose.yml +++ b/frontend/docker-compose.yml @@ -35,7 +35,7 @@ services: - ./backend:/data/backend environment: - FLASK_APP=app.py - - FLASK_ENV=development + - FLASK_ENV=production - FLASK_DEBUG=0 - FLASK_RUN_PORT=5000 networks: From cbba65f4502539d3e0c86c68a6bc60ba83072ccd Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Wed, 2 Feb 2022 13:10:30 +0100 Subject: [PATCH 25/31] update ports --- frontend/conf/nginx.conf | 12 ++++++------ frontend/docker-compose.yml | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/frontend/conf/nginx.conf b/frontend/conf/nginx.conf index e1ee6c3..2a7b0ab 100644 --- a/frontend/conf/nginx.conf +++ b/frontend/conf/nginx.conf @@ -21,9 +21,9 @@ http { server frontend:4200; } - upstream flask-frontend { - server flask-frontend:5000; - } + # upstream flask-frontend { + # server flask-frontend:5000; + # } server { @@ -34,9 +34,9 @@ http { proxy_pass http://frontend; } - location /api { - proxy_pass http://flask-frontend; - } + # location /api { + # proxy_pass http://flask-frontend; + # } } } diff --git a/frontend/docker-compose.yml b/frontend/docker-compose.yml index f29551a..46e015f 100644 --- a/frontend/docker-compose.yml +++ b/frontend/docker-compose.yml @@ -38,6 +38,8 @@ services: - FLASK_ENV=production - FLASK_DEBUG=0 - FLASK_RUN_PORT=5000 + ports: + - "5000:5000" networks: - net depends_on: From 4cd8c65524563e448fda7c6b7258536dfb250d84 Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Wed, 2 Feb 2022 13:18:09 +0100 Subject: [PATCH 26/31] ssss --- frontend/backend/application/__init__.py | 4 +--- frontend/conf/nginx.conf | 12 ++++++------ frontend/docker-compose.yml | 2 -- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/frontend/backend/application/__init__.py b/frontend/backend/application/__init__.py index 18638d6..1f773b6 100644 --- a/frontend/backend/application/__init__.py +++ b/frontend/backend/application/__init__.py @@ -1,6 +1,4 @@ -print("Import Flask") from flask import Flask -print("Import Flask-Cors") from flask_cors import CORS @@ -9,7 +7,7 @@ def create_app(flask_env='development'): app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['http://10.1.1.10', 'http://10.1.5.10'] + origin = ['http://10.1.1.10'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") diff --git a/frontend/conf/nginx.conf b/frontend/conf/nginx.conf index 2a7b0ab..e1ee6c3 100644 --- a/frontend/conf/nginx.conf +++ b/frontend/conf/nginx.conf @@ -21,9 +21,9 @@ http { server frontend:4200; } - # upstream flask-frontend { - # server flask-frontend:5000; - # } + upstream flask-frontend { + server flask-frontend:5000; + } server { @@ -34,9 +34,9 @@ http { proxy_pass http://frontend; } - # location /api { - # proxy_pass http://flask-frontend; - # } + location /api { + proxy_pass http://flask-frontend; + } } } diff --git a/frontend/docker-compose.yml b/frontend/docker-compose.yml index 46e015f..f29551a 100644 --- a/frontend/docker-compose.yml +++ b/frontend/docker-compose.yml @@ -38,8 +38,6 @@ services: - FLASK_ENV=production - FLASK_DEBUG=0 - FLASK_RUN_PORT=5000 - ports: - - "5000:5000" networks: - net depends_on: From 29307807668f2ca265af593eee396f1a6af76f6f Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Wed, 2 Feb 2022 13:29:25 +0100 Subject: [PATCH 27/31] aled --- frontend/backend/application/__init__.py | 2 +- frontend/docker-compose.yml | 30 ++++++++++++++---------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/frontend/backend/application/__init__.py b/frontend/backend/application/__init__.py index 1f773b6..5712059 100644 --- a/frontend/backend/application/__init__.py +++ b/frontend/backend/application/__init__.py @@ -7,7 +7,7 @@ def create_app(flask_env='development'): app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['http://10.1.1.10'] + origin = ['http://10.1.5.10'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") diff --git a/frontend/docker-compose.yml b/frontend/docker-compose.yml index f29551a..45362af 100644 --- a/frontend/docker-compose.yml +++ b/frontend/docker-compose.yml @@ -1,19 +1,19 @@ version: '3.8' services: - nginx-front: - image: nginx:latest - volumes: - - ./conf/nginx.conf:/etc/nginx/nginx.conf - - ./logs/nginx:/etc/nginx/logs - - ./cert:/etc/nginx/cert - networks: - - net - ports: - - 80:80 - depends_on: - - frontend - - flask-frontend + # nginx-front: + # image: nginx:latest + # volumes: + # - ./conf/nginx.conf:/etc/nginx/nginx.conf + # - ./logs/nginx:/etc/nginx/logs + # - ./cert:/etc/nginx/cert + # networks: + # - net + # ports: + # - 80:80 + # depends_on: + # - frontend + # - flask-frontend frontend: container_name: frontend @@ -22,6 +22,8 @@ services: volumes: - ./src:/data/frontend - ./node_modules:/data/frontend/node_modules + ports: + - "4200:4200" environment: - NODE_ENV=production networks: @@ -38,6 +40,8 @@ services: - FLASK_ENV=production - FLASK_DEBUG=0 - FLASK_RUN_PORT=5000 + ports: + - "5000:5000" networks: - net depends_on: From 40cf1c239a60e1ee59122824bbdfdb96e65d5f1e Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Wed, 2 Feb 2022 13:37:22 +0100 Subject: [PATCH 28/31] aled putain --- frontend/backend/application/__init__.py | 2 +- frontend/src/environments/environment.prod.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/backend/application/__init__.py b/frontend/backend/application/__init__.py index 5712059..74f0d52 100644 --- a/frontend/backend/application/__init__.py +++ b/frontend/backend/application/__init__.py @@ -7,7 +7,7 @@ def create_app(flask_env='development'): app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['http://10.1.5.10'] + origin = ['http://10.1.1.10', 'http://10.1.5.10', 'http://10.1.1.10:4200', 'http://10.1.5.10:4200'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts index e664d27..63d553f 100644 --- a/frontend/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - debutUrl: 'http://10.1.1.10/api/' + debutUrl: 'http://10.1.1.10:5000/api/' }; From f0417b49a3afc64bd36d9661d9c4c8e28bed5d2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20VACHOT?= Date: Wed, 2 Feb 2022 13:45:27 +0100 Subject: [PATCH 29/31] Update: Cors Origin --- frontend/backend/application/__init__.py | 2 +- frontend/src/environments/environment.prod.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/backend/application/__init__.py b/frontend/backend/application/__init__.py index 74f0d52..fa46fbb 100644 --- a/frontend/backend/application/__init__.py +++ b/frontend/backend/application/__init__.py @@ -7,7 +7,7 @@ def create_app(flask_env='development'): app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['http://10.1.1.10', 'http://10.1.5.10', 'http://10.1.1.10:4200', 'http://10.1.5.10:4200'] + origin = ['http://127.0.0.1', 'http://localhost', 'http://127.0.0.1:4200', 'http://localhost:4200', 'http://10.1.1.10', 'http://10.1.5.10', 'http://10.1.1.10:4200', 'http://10.1.5.10:4200'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts index 63d553f..b5bca68 100644 --- a/frontend/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - debutUrl: 'http://10.1.1.10:5000/api/' + debutUrl: 'http://127.0.0.1:5000/api/' }; From 4dc87f579ccfefa2d7170f9b9902c4ba6eb9556f Mon Sep 17 00:00:00 2001 From: Baptiste Peupier <60870677+BaptistePeupier@users.noreply.github.com> Date: Wed, 2 Feb 2022 14:00:50 +0100 Subject: [PATCH 30/31] =?UTF-8?q?voil=C3=A0voil=C3=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/backend/application/__init__.py | 2 +- frontend/docker-compose.yml | 30 ++++++++----------- frontend/src/environments/environment.prod.ts | 2 +- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/frontend/backend/application/__init__.py b/frontend/backend/application/__init__.py index 74f0d52..1f773b6 100644 --- a/frontend/backend/application/__init__.py +++ b/frontend/backend/application/__init__.py @@ -7,7 +7,7 @@ def create_app(flask_env='development'): app = Flask(__name__, instance_relative_config=False, static_url_path='') origin = app.config.get('ALLOW_ORIGIN') if origin is None: - origin = ['http://10.1.1.10', 'http://10.1.5.10', 'http://10.1.1.10:4200', 'http://10.1.5.10:4200'] + origin = ['http://10.1.1.10'] CORS(app, supports_credentials=True, origins=origin) if flask_env == 'production': app.config.from_object("config.ProductionConfig") diff --git a/frontend/docker-compose.yml b/frontend/docker-compose.yml index 45362af..f29551a 100644 --- a/frontend/docker-compose.yml +++ b/frontend/docker-compose.yml @@ -1,19 +1,19 @@ version: '3.8' services: - # nginx-front: - # image: nginx:latest - # volumes: - # - ./conf/nginx.conf:/etc/nginx/nginx.conf - # - ./logs/nginx:/etc/nginx/logs - # - ./cert:/etc/nginx/cert - # networks: - # - net - # ports: - # - 80:80 - # depends_on: - # - frontend - # - flask-frontend + nginx-front: + image: nginx:latest + volumes: + - ./conf/nginx.conf:/etc/nginx/nginx.conf + - ./logs/nginx:/etc/nginx/logs + - ./cert:/etc/nginx/cert + networks: + - net + ports: + - 80:80 + depends_on: + - frontend + - flask-frontend frontend: container_name: frontend @@ -22,8 +22,6 @@ services: volumes: - ./src:/data/frontend - ./node_modules:/data/frontend/node_modules - ports: - - "4200:4200" environment: - NODE_ENV=production networks: @@ -40,8 +38,6 @@ services: - FLASK_ENV=production - FLASK_DEBUG=0 - FLASK_RUN_PORT=5000 - ports: - - "5000:5000" networks: - net depends_on: diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts index 63d553f..e664d27 100644 --- a/frontend/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - debutUrl: 'http://10.1.1.10:5000/api/' + debutUrl: 'http://10.1.1.10/api/' }; From 3d5fc8afcd84e760997f780104348a36de8a9de5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C3=BBki=20Vachot?= Date: Wed, 2 Feb 2022 14:09:38 +0100 Subject: [PATCH 31/31] Delete backend directory --- backend/__pycache__/app.cpython-310.pyc | Bin 345 -> 0 bytes backend/__pycache__/app.cpython-38.pyc | Bin 352 -> 0 bytes backend/__pycache__/config.cpython-310.pyc | Bin 1367 -> 0 bytes backend/__pycache__/config.cpython-38.pyc | Bin 1403 -> 0 bytes backend/__pycache__/fictive_users.cpython-38.pyc | Bin 957 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 1070 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 1078 -> 0 bytes .../__pycache__/api_functions.cpython-310.pyc | Bin 5905 -> 0 bytes .../__pycache__/api_functions.cpython-38.pyc | Bin 5961 -> 0 bytes .../__pycache__/logs_model.cpython-310.pyc | Bin 1262 -> 0 bytes .../__pycache__/logs_model.cpython-38.pyc | Bin 1296 -> 0 bytes .../__pycache__/responses.cpython-310.pyc | Bin 995 -> 0 bytes .../__pycache__/responses.cpython-38.pyc | Bin 1031 -> 0 bytes .../__pycache__/routes.cpython-310.pyc | Bin 6571 -> 0 bytes .../__pycache__/routes.cpython-38.pyc | Bin 6685 -> 0 bytes .../__pycache__/sessionJWT.cpython-310.pyc | Bin 1288 -> 0 bytes .../__pycache__/sessionJWT.cpython-38.pyc | Bin 1330 -> 0 bytes .../__pycache__/users_model.cpython-310.pyc | Bin 1192 -> 0 bytes .../__pycache__/users_model.cpython-38.pyc | Bin 1226 -> 0 bytes 19 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 backend/__pycache__/app.cpython-310.pyc delete mode 100644 backend/__pycache__/app.cpython-38.pyc delete mode 100644 backend/__pycache__/config.cpython-310.pyc delete mode 100644 backend/__pycache__/config.cpython-38.pyc delete mode 100644 backend/__pycache__/fictive_users.cpython-38.pyc delete mode 100644 backend/application/__pycache__/__init__.cpython-310.pyc delete mode 100644 backend/application/__pycache__/__init__.cpython-38.pyc delete mode 100644 backend/application/__pycache__/api_functions.cpython-310.pyc delete mode 100644 backend/application/__pycache__/api_functions.cpython-38.pyc delete mode 100644 backend/application/__pycache__/logs_model.cpython-310.pyc delete mode 100644 backend/application/__pycache__/logs_model.cpython-38.pyc delete mode 100644 backend/application/__pycache__/responses.cpython-310.pyc delete mode 100644 backend/application/__pycache__/responses.cpython-38.pyc delete mode 100644 backend/application/__pycache__/routes.cpython-310.pyc delete mode 100644 backend/application/__pycache__/routes.cpython-38.pyc delete mode 100644 backend/application/__pycache__/sessionJWT.cpython-310.pyc delete mode 100644 backend/application/__pycache__/sessionJWT.cpython-38.pyc delete mode 100644 backend/application/__pycache__/users_model.cpython-310.pyc delete mode 100644 backend/application/__pycache__/users_model.cpython-38.pyc diff --git a/backend/__pycache__/app.cpython-310.pyc b/backend/__pycache__/app.cpython-310.pyc deleted file mode 100644 index 56671cd9e5fd0711581018cc324eaaa029b4db67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345 zcmYjMJ5Iwu5Z#X*JBCCEVa?vl)N) z6jyA;UTNm*j`HTr?fuPt)mgDD(Ecn`feuutx^Eo!*<=%O^o7bKrVve?mW>v&s>aYg zyF8v;h|%~CLLo|-8zI2EzPd^C^$Q`-!TxaLY0SZUv~>esWnBaQ>FDJ4Jnq64$`tuj zHn}y9;RRr}hCrLA+*t$sK{vpW)5;rJY9UN}nbU+!d*s;)q+ssMs9xLftWu&a;T$`h>E5}IL((H5KEQvGie2FV diff --git a/backend/__pycache__/config.cpython-310.pyc b/backend/__pycache__/config.cpython-310.pyc deleted file mode 100644 index 6ca6f0bdaf1fcf1955d00cd3cdb0824c4083f581..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1367 zcmb7DJ#W)M7`D%j?R++gT1o*`VnRWJ3TA}rBu*ODbwccddduPDt|4t27u%`S4lM99 z7}}A)bPEF$GaCcqJ;z0Xwg_z9+y5%1;t`cg6FjO*>_b*`Xb2UlL4{`EqV<= zB`QxOEHUXoK1T^EOudjVWSnVB6j9}aL=~pJSFjFTr5WHErUN&CYg7lWCp-(>pjqJA zgy*R2O10cq*hO-N0v8`pHdpZu0w!UZN*GZYE6`MmaE56I`nf?Bs$L+RO<5*kurkg= zE2LR1$re+lC#=MZtVE5E2rs4iEX~16<&@=V0a%5qps~ocMljtUk6IqjwrtbgCT6ea zT*j935?7n1XVy*EBD;N??7CLp#g*T3cDL=;(3wF8k7f}Iqca_%Nid3d&b1nS%Ol&? z9k zle8z(wCcNUu6vg2b(}UXG~9lRSdLk@ttLl7#C0}38Hd4?Dco9Of_M?=k z%E{O(MJB_%O|igjfGb4?B~B3>zrxGC5Ii2n<6xQ=f>YB%115!80pdc1c>!es6#>8W z&!bx+w+e6<+BY$EF4&Nh?0-l@^ZKU>NK<*yV^KVwj^?_&)-}QkV(Y&PTZ19@#V}z+ zDA>({?m_RhUddQX{i-zC37Z7RM{F9W!kn7^hhaG1v|d_vx3^Wo=pe3D2n?bN~PV diff --git a/backend/__pycache__/config.cpython-38.pyc b/backend/__pycache__/config.cpython-38.pyc deleted file mode 100644 index 6e1dae20edeb7a33534b33ebb93c6f91b7f4e559..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1403 zcmb7D%Wl&^6!j~%^CYc!3WUT81qm#W*a5;#oDkJ@O6-D|&ERCFZQ3L*;{>T)uz}BD z(JuL=*|1>6FR(z|>lhT;f?%RKzUNM6=FEL;RjVZh#$oky92$!916R1G7Gqs@gi`W6@eEs zUSevfG)iCL79|)WE)P()Q1K27t`LMpoHD-U*$c5ZrWFvucdK&p2dtJ0=)8c#T-vP9`5Ve>KC6-wXC z<8i)HXnAW}9ce{g7pLpnb0B70>dsZgwK7~ zZ$9%jUQw_4tS4_SIikMXT&EkoR=3@4x>2_mg!0TcniosZFog}9L=gd-PLvVq2rCG`-ng(Xqwfm9b(kq?UdYXS{~=6UbO_Ty zm?5hXPiLd)&O%kxK1WssFaEnMeEqFcve5TuSs3nfB3+mflY&LwLQXC wBGw>IIk=^n4EFeNmeod<2Z687PCGAs(tfmP$0t}fDJI?4F6#A5b+c~%0Di11)Bpeg diff --git a/backend/__pycache__/fictive_users.cpython-38.pyc b/backend/__pycache__/fictive_users.cpython-38.pyc deleted file mode 100644 index 477bdc3dbe61a6c9bc08dd615afc2e56216b0b36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 957 zcma)4OK%e~5VrS`Y_?7Mpbx?caSN5Q?aH>|T2lAxXxmVOIyle(_nQrKFb_>=-FgeK2urYh z>pg%KScNrM*T@sgcijs<=qpD@_Yt_;v6aC=*^x#lC*|R3%92PqcQnf3 zGGLJKbYfJ5Lq7b6a2I{$=%^-~m>RSQS;}IVxwqD@BECD_si4?!a=rkJ%kd1-?&|~VN3kyvs94+*B=-7V)e&fEW%91QDrU*+JnN;;suoSXH=%j>hPsdbdd6xUO zhHm=q{o&2;M64j-ci$UjN#rGb#KhR^XJMH{X(7GmJ#X;LlTlcDyD^iey>~l(?*j`@ zqZGU$4-5V&3QGOb-F&R(@RFd&s=x-)%4HOUy0k?NTEl5*eIwQ|+Hu7aDrL&CR94Q4 zk*eVjLSD5#^OL$2d5~lf#Z@hSdv=%QJQ$WK=8>hcDp;)@_Fe@?gPnum`0e4FV81sQ u9KS#4SC>}B&WKf=fwP6|WgNZK4=T4%IMku@de(Hp)x5Es|FC~qPyPTyu=WuE diff --git a/backend/application/__pycache__/__init__.cpython-310.pyc b/backend/application/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 4f97792e0b1678ad90599070ca4ed729509eee30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1070 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 diff --git a/backend/application/__pycache__/logs_model.cpython-310.pyc b/backend/application/__pycache__/logs_model.cpython-310.pyc deleted file mode 100644 index c317af2bc9ee6037f44edb6ac7bc1b5f7139b4c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1262 zcma)6y>1gh5Z=B2vwex<{7{gJ28=}9AS#4_2v8(qAvu+s)%tcZcRAmg-E)!XI@0n6 z6iMmV;4!vHL&XyyQ88mXjw7dFSNrYEcy4~a9l4028iDoV`kL>%g#1EfbvdBChNB+= z2qI`kMzl{U`9Opv> zNnJP|hWu{z{keV_ToK_27cAk52kNzjM}6thShGZHmW?&b=G>At7kRc8y0_32HfbgmCYOnyACQD;m&jWSo!1P@nr^@GJx21p2OzRWjo0jGfA}_n-&)B+K|9lX1Ah z1TI?psffdvm(af{kb_|(U a?H=P?&8+tYHo?m|1Fvv!G^S{fJ^LT5Q3XB# diff --git a/backend/application/__pycache__/logs_model.cpython-38.pyc b/backend/application/__pycache__/logs_model.cpython-38.pyc deleted file mode 100644 index f7aa63ae4fa8ec91e7e58fe4572cfd1025803697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1296 zcma)6OK;Oa5Z<*N+j+I=6A3tRB1qIi0!|1~`aqSM3Mu81%gXUCsa-$9u6=0b8@=)m zIJC$74SvQRdf~(`K;pzqlBOx?fnCkFGn2{e%(o+dYBp;G*6ZtQ|8a$opJ>c43ygOl z>IncRoW>-fJxa+3!VPX-5N-+@8DGtw$*nGFSAJ0lY*TIUegN8?HB0sb+=BEdCq0AH zo++%T0%BvzZ${6V*q81V;TErer#csbc5NC_pG7nlJk15q(t>As;)z<*dse2lJ+)W4 z&7BLs2dKw=84J@eXKV$ME4+bF`_4XZBIR2*aRH9o z%|aau9<%xkl#)a!z-9F3|#9{*ng z6{#$J3OQ6{@ZTZUV6o8!2nwx!9W=1K>rYV5r)t#;o``hSaKGiIw{ F{smfgc5ZzDPNt05_HwYvILb9Ob4^)V%P!v=-5;-8{5{!2n+&Xr&>j+hHZ(R8Y z9GYYQ34eggUODxK#H|vD8M~>j`^vA_ z0!FI@&My{#mHTQ;_fyfj6&v6W@T=Z%3$Cu#0l!`H)Me-QOw zg@NNh;#QZpj*~35)(K>DQq89`>%64M_tJ^u6J0w0la7@(*0rrJ$4OBfq&k#trI{TP zP(-nuEQnwYLEn zW7PXAL_it*yg%zQpdBixxd+9a1a(<14}uHpMsNV@NNrwYQ)8Z3P_#}-Fi)PF=Ye?= z%=0hIdt6B{FE}@ko2PINRIs36r35Qmk@M}mmObRPJB<(mzx4DwkQ*Gw_z3u%%?d&X zAZ(c~#;XWd5Y`Z`BCI1^L%0s$x=Lrd)Jx^Pn#0`3`c15NYT3t4m$`*`)T~y$fxC5E zt?T(iy8#*d005OmMFlAOzqW1E_aU@|GzwX?6M9bW!BaUf43f?C_2B41-FS%+9XB;? WusJQ%Jku{Iq-+4tApvdk)wO@oEA3(c diff --git a/backend/application/__pycache__/responses.cpython-38.pyc b/backend/application/__pycache__/responses.cpython-38.pyc deleted file mode 100644 index 7975ba1939268c2a586665073d7a9c7c81f60f5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmZ9KO>fgc5QcZXUfW3%DCL_9B#xFS76)z>B5E55iV}$kka7veyG`BrBieO@D!DhV z`~wcnvHyfWz-6zTdPCw?3B-)uR23`jtJ&H0%;aL40b~qJ>g2D<Ol|r6tI$p}M7g z;tIF4mM~grLwj#vxKt`vzGWO;gvCM|HLf}2d26WRX`GqHXm2#? z4F|nl-!lxFm}{%5lPC$bHa2!MTrASLHcpgh`|;GUsVt0pAVVRQHcc&yNtEZaSo++o z)w4qaF3~K*i+m=bmk5h+Qk7%SqhL3W7AbhIgXf)K^eoUa zS_EB~WY+2L?FOI12ug|IsvWC=_0#zg&XS2q67lPj17hz2F;nm1>!eU8{=yz*HP9{ZlG+S+(fwr zV%kC`vXCo2PSry_#QQsV->TqD>R0M6=Fzi?O)U?qXO*uPzvFGl=tm%xvz4R&du!7s zRgd9?PY1p===zS~`-o9lkgTV#21f?f!z&%}zfe_MZ#&J!B9SjBq%_*mq8@9m{{yPZ B`q}^h diff --git a/backend/application/__pycache__/routes.cpython-310.pyc b/backend/application/__pycache__/routes.cpython-310.pyc deleted file mode 100644 index d5552d74ddb96749c6a2204124d593908dbe6747..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6571 zcmbVQTaO$^74G|GZo50X-ivRUWF03%f|n$qge2tVYyu{+Exb`gD`GUB>e%C*TdI3w z?JyHXT6jTI|dNUVg+cTUyZ?IdDXU0qeDs;0Zo z_kHJ7b&JKEfxpAI{$Bsh(}wX+YE1t*XuN_edEPV(VF3uYpdChGI~V2J`6%BmM1^)SD)Jb&RcbFqOYP-o*)(EHc=5`S6_w-i ztySTR;D#x}Pb`rW`JWj_X0*org>ipTl(_!{_b-WMJ$^-$xqqGeSH+s{KOxq+e}nrs z#^X1|7WZ#*|H<+Cr^IRQ-{Sr=<8{u8hq(VF_gBX2JS-mJ{!`q)EzarReN>$1{?p>I zYex0)yYyA7R_4q2gM&Cpv+%XnLEMwgPI?!gmP~~t?uc4DPLleKILmP>ma;3Wein%9 zwO02=vydGJvUboD^)$|kXg6exDvh3)Mcj&EUW2(V+Rct0&vSWg zS|q_UtmxVGgY;%C?e52&Y`JkWZtT}4J(1f!toM5T+)lmM+)+>ET)lE_uWDv~J5FzQ zMbe&(N-`9wamySU{U4>)0Fc^(n};UXEv{PwQ`q~qygC5D=#KIB&`zC! zJunB>kv((Y>NqG6wFzJF?$3t{HlCfYEP@>5;w& z^;kXfU4Z}0M2iy7ZBS?pv*^%9YG)^w`4l|e0lgIev8z?->G7I=$Ha)%vW?+_4bNKH4x8Rn{ zbu;+bx+fpQ@P3gIIAX&L=IABInEMAB8go}3ggNfF8Gk^TaDcnF2e!Uj>drWHfJ29H zIIxeLAuuOgAkhQ1o=;ujqa9!s#*Vgyuw4Qw*@7}RvTL-tA}<(Ij5hzU3$%Ga+X~jp ziz1%PJ2E#6QQF{jHS)ZVJVqYwjJ&1GvW)l4f=;us->J7_xr(M-qv8Y=1hl*V0>*tHDKV$En4&>6{n~m`ZLND-cF-g_2n7r zJ&Ph!z#6SBA0k7AiifED?>XCG!!5 znQvlXKR;3}fH3o3-+gO$Z+8YcHb#ZGF5*h|P^3m`LRSo>RdPEuZ&^cASVJo%q}Wg? zN4Ua+9jZg#M*xFb04EkgrXzBn*w7UC5+e%adjtgNgr6KV8W4fw@;hKqMKqH}x6_Fm zX)G>e9+-hA+*6X_vOZ^iuYTC-)&~(e<7HzJi!85Xr`G6- z7!0jnZ^e<{6fFC9%&5Set*PK3t9VsjrRvEgs*{K)4-%0kVo|jveRt&}hSIEiB-j=C42}FY6=OM=IDK9Y&MP?> zul9gQBuTdA6DUCb32NpPfao+)0E}e(umU_uCZc?%L?ltD_6ZENrcfF%i?1xtMun8O zF*QNvI>wp9(V}DmcNUe)mWn2%33QcB=U&b(TfpASm^O_)MT8mHk!Fs?;4?JlV0Tf$ z4nRQaA`m{5C?H9(hBk!{^iq1P;x4G$AH<+o7mN&0H?J5+oZ1tfXmKh|vu%gSqG{#TtT>c2#G z*692CM}5r?Feo8pDjg`8Iqio2Y4F3mSCIUM$_t5jrNp8!Czoh z(n2vJG^OVh;79)fWOgLJN`h5cvCeTauZZs<9iR&(5`ltF4yJoa4swOEl_RNs13x$; z3QGMKMS;G^SQKbiH7D4=p9t*GoRR};V9DRHU?Ad8NrDSWfK-66Pa;#WN#ZrxeL*s6#3;BBn_I(pKHQ@ zjy~)HnBbq|IlW;3LIxnYgI%u!;Xnuhq4S{Xr)dD<7tm8gPf1&ri1tkJ5IF_gnBr<) z8S{QSGjDZaUQW$Ixi&@d5HwzA8dGg!;Dh3un&S8+v88P*_}X|LrufNuiYu1VUZrn0 zMMb`b+Jw-H^qq45*Q2k_XGVyB(9U|oP)V647&Qrs#K6qPfsK5fo^Ge&4~;Wa-D)R4J$O}OSq_BopboVU}z#x5Ep6VJk7*K9&TC{y*c{7 zIQRqn&Hy1hh^REodA5R5l7lGO4kog1$RK-9F#^?u&XkQKX$lG8D z&VQI861!~^qtQkpMp-sOxbT7T_c)9N=;8caTk;5h1s(p1%EqXrP&pb~S{NJZRa9mk zjI(yCtqi=WtQ}!ktn!Mefd}|)=E2&7d9aB2sn301%ySJ zOhKB{zBx4OjJ-mG<{ieqrp&p$vi!)y%xr#}P@k1kaCPAEz2&K@%0g;Lulh~27 zbd0!!MfIU1@hZveH+N?@kpxNtCs8~3HHx|5aAgsg1jJt=Px}?Nhq~^f?&!LWx~uCR z>YlFqsQUmU9}|&8Q#N+w4@sE$fB;Z@1KYbC+Ia;Al5?t)bn70nL((-^it}K}%nvf_ z`XOs)7T}~2TP8Hexz5z?j`En99U5i$nNycH@R@GJsVt&BwM7f(GKna}pc+oDC{4Dp;F;28D5(?-fXo3RLFZy3&|MLcob|{ytXEOKwRz2BQ2NE_t zc!-0?UbmCP$>dlfD&jc0_WnVK&qES*%t_vso;-+%AS8C|bx2}NB(F&rA&q9I+TQU_&y1^k zK|7ksWphGAiV%u8L?~Dshy*!s;*bO44?rAIUx)x9IcF5Xp7?!V_4GV;9I~sfuBxxP zx~9M1@ArLGH;YAI!{5QRzcqgMjHdmA8k2t(8W(Xz-_$itXhLsmpLhv8WN^C`#eqypXzWLUtnc?kBMy=x+D#dtN~6bS5wruCS7C05u+>S& z^RqlRO%h=ZOX<^%{dl(?clUx$ve?`WntSzePt6Vw8ogfMuQqzEs#=xx#`kV)SM zp&45PbD$55Lvv^iEMaYG!rn7v4|Qi#8``lwurZSpJLqvYwShfw4$U{U8(KQr!|30L z$&s$erDM~PokHvq^bQSr?oF-pl%>Vqo-Y$!8@jsIUuJvZ&~RY=fp*Wh0a^^*x81kU z>KJdK1$P&(Cw34vTJ6N^HKORpT`3YRaiX{p??;mSomg;KgT5ELTN2S)KZoW1dno$n zw!&U~Q06(xjgF{xWqCAH`Bp1vi|9iC^z|SRYRr?ztd*QJ_&s-`ZYMFLSSEQHgk3M|6qs~?$+K)PVr|Z$ zzOISVI%b~2r}MTmh0lfSav8ri@j9*MUZ)WTas^GfO2r8(2#)vv4J68SY7%1Q8WkHT z`p(s}2C!3N3>EY>g_*BmL_a^$Hoz}&u54Y~ z+TNN%j)_q@T$gc0Z=r~_Scm#(O3~!iSifTobzuyRn2=&Z%Pe6F2X<%^c^_d8iUOP% z2&|Uy-!*S&-YIZxFpcx0^LgIiISmm~o6`Pej zaeIw}cDErwQ1Ow=pD1w}O`;TgG%4;jqB>6-h(IKHB~A5aR|H^jW2YS?ZcA{0_(-o6 znAdd`Mq~v)muIOsa)Ih3G|GQOrm>(@Oi5o|d5D2TqA+%jd>YN?aixAC20P%dG4=2N z*U6O(9@}4JztC^2rXkOKMm zHjSl~>#~YZqlo?lYDc*dm&z;wN4b%-m*ulG^6OM&k}!7ttR$RQl90{zfS4t}Li2qU z1q5J>of#D%VvSV*BN;`k0#A~OXrCw{i4?Y7f<(O~lnzXzEXlJ`;pMw{Gbb+o_qhPEW@)Dkz#GfL=6!b_nGf{XSjTz{@qo4;cAkh&BBT5{Q z(ilUN!U%dPrMVg-r9m4)L9R?Kl)n57;6Z*&DT?q!VLX#4vY4b#K~VCdM1les&|D0^ zOj02K41+J>VPdGH@3k$lKhWfJRD25sWO?jA)@};T%4?YlRICXBxJY)^>AC(<-}5d8 zMI_uK{}gmT^}}&hfLC6|$o?9u0%x{WmB3cXX6{cw509_H|sEr`f13jCCiLMCj;L{7MniJX9(!1@kbDfA;zWowSD zK3ngxl>)y$blI9`D`v#Ae}wNj?S<82Yk{mt6-aIQVP^}RE{l44du6~SfS!Y6i2zy_;N*;6i>!V*k3vZHx7wcCuqWP z5=aAg#<|nwIl0pVRWnu5Y#C|hKUUGBvo|>-=mt@_(~Zl!jUNT&ULeC(6d~4MsQ9xi z&7?N5cDmiR%D9-Yv<2YUUCGa~mVbMeg~_o9t9)#{NDCv8Dm5NJU2JQMh-*n=b#&{srXDYY$-95D5BVoBMU`s&GLezHIHMQor{-$rXL|I-zZA|pz zw4MOQm!ox>|BRUMpgsGTxpE6j0Mo`nl$e>AI1rLoX?5dGQGuE>6!jHFFOq4@&R3|( z+0hE`(>d`$8lNWaOwTfn`2vorpU#>8UobSN-ZFjpU88bA){1B1QXz10C^}^ZL}1M~Ez>A+o4!gx0CCrDJ1r=`1Rvr+_!k z_^G}$a3(T-vKPfl$_muM3alYx#p;7uahw4YpMNd`w$)Ln@~7Ai`e^4BAV}z`PLiIAE^QcnKqeiL9zM+M z6cYVzV(c8SOA-&~n%H)sId6wZInUHCk9G-()sVOGv2F*kETTQJ&CAVX9km<=)p1%b z4{8oochY-H)C$xdiLGj7Ynh{MoRnQAEYOM4cxyq5rv6t61+>khUC#B&nZ&+D=aTAZ z!$e<_!!c*C+lhi`e87erbR5NJAG`tO{SN0bk_3}cs4~v+o{DSg?CXWFEB4#L mi}>YQL|Gf{Z67rj4c{v1{yMJJ^g4(82Cgk!FX4Kor2h|cgqZ~Z diff --git a/backend/application/__pycache__/sessionJWT.cpython-310.pyc b/backend/application/__pycache__/sessionJWT.cpython-310.pyc deleted file mode 100644 index 2b9734d55e332e5e150906e5464e5f03510ce463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1288 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