diff --git a/.env.tmp b/.env.tmp new file mode 100644 index 0000000..d121f85 --- /dev/null +++ b/.env.tmp @@ -0,0 +1,2 @@ +KEY= # Key for JWT token +POSTGRES_URL=postgresql:// diff --git a/api/auth.py b/api/auth.py new file mode 100644 index 0000000..0c357e8 --- /dev/null +++ b/api/auth.py @@ -0,0 +1,28 @@ +from flask import Blueprint, request, jsonify +from model.user import User + +auth = Blueprint("auth", __name__) + + +@auth.route('/login', methods = ['POST']) +def login(): + if request.is_json: + req = request.json + + email = req.get('email') + password = req.get('password') + + if not email or not password: + return "Request must have email and password", 400 + + if len(email.strip()) < 4 or '@' not in email or '.' not in email: + return "Email is incorrect", 400 + + if len(password.strip()) < 8: + return "Password is too short", 400 + + user = User(email, password) + return jsonify(user.toJson()) + + else: + return "Request is not a json", 400 diff --git a/api/robots.py b/api/robots.py new file mode 100644 index 0000000..2325dee --- /dev/null +++ b/api/robots.py @@ -0,0 +1,24 @@ +from flask import Blueprint, request, jsonify +from model.user import User +#from module.db.repositories.robot_reposytory import update_robot get_by_id +from loguru import logger as log +robots = Blueprint("robots", __name__) + +robots.route('/data', methods = ['POST']) +def data(): + if request.headers.get("Authorization"): + if request.is_json: + req = request.json + + id = req.get('robot_id') + tms = req.get('timestamp') + loc = req.get('location') + scanRes = req.get('scan_results') + battery = req.get('battery_level') + + if update_robot(id, "received", battery, loc["zone"], loc["row"], loc["self"]): + res = {"status": "received", "message_id": "123"} #for that moment i don`t now what is message + return jsonify(res) + else: + log.error('failed to update robot data') + return("Server error") diff --git a/api/ws.py b/api/ws.py new file mode 100644 index 0000000..a6c87a3 --- /dev/null +++ b/api/ws.py @@ -0,0 +1,26 @@ +from app import app +from flask_socketio import SocketIO, emit +from loguru import logger as log +#from module.db.repositories.robot_reposytory import update_robot get_by_id get_all +#from module.db.repositories.inventory_repository import get_all as getRecords +ws = socketIO(app) + +@ws.on('connect') +def is_connect(): + log.info('client is connected') + +@ws.on('disconnect') +def is_disconnect(): + log.info('client is disconnected') + +@ws.on('robot_update') +def robotUpdate(): + robots = get_all() + emit('response', jsonify({"type": "robot_update", "data": {robots.toJSON()}}) + +@ws.on('inventory_alert') +def robotUpdate(): + records = getRecords() + emit('response', jsonify({"type": "inventory_alert", "data": {records.toJSON()}}) + + diff --git a/app.py b/app.py index 811f514..b7752b6 100644 --- a/app.py +++ b/app.py @@ -1,4 +1,15 @@ +from sys import exit from flask import Flask +from api.auth import auth +from utils.loadDotEnv import initializeENV +from utils.PostgressConnect import PSQLConnect, PSQLCursor + +if not initializeENV(): + exit(-1) + +#conn = PSQLConnect() +#cur = PSQLCursor(conn) app = Flask(__name__) +app.register_blueprint(auth, url_prefix='/api/auth') diff --git a/controllers/controller.py b/controllers/controller.py deleted file mode 100644 index e69de29..0000000 diff --git a/dependencies.txt b/dependencies.txt index eabd61c..c0a8c31 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -1 +1,6 @@ flask==3.1.2 +flask-socketio +python-dotenv +psycopg2-binary +pyjwt +loguru diff --git a/model/example.py b/model/example.py deleted file mode 100644 index e69de29..0000000 diff --git a/model/user.py b/model/user.py new file mode 100644 index 0000000..03d51fa --- /dev/null +++ b/model/user.py @@ -0,0 +1,20 @@ +from dataclasses import dataclass +import json +from utils.token import generateKey + +@dataclass +class User: + id: int + name: str + role: str + token: str + + def __init__(self, email: str, passwd: str): + #us = getUsModel() #возвращает словарь + self.id = 1#us['id'] + self.name = 'Bob'#us['name'] + self.role = 'Backend'#us['role'] + self.token = generateKey(email, passwd) + + def toJson(self): + return {"user": {"id": self.id, "name": self.name, "role": self.role}, "token": self.token} diff --git a/utils/PostgressConnect.py b/utils/PostgressConnect.py new file mode 100644 index 0000000..ea6a485 --- /dev/null +++ b/utils/PostgressConnect.py @@ -0,0 +1,10 @@ +import psycopg2 +import os + +def PSQLConnect(): + conn = psycopg2.connect(os.getenv('POSTGRES_URL')) + return conn + +def PSQLCursor(conn): + cur = conn.cursor() + return cur diff --git a/utils/loadDotEnv.py b/utils/loadDotEnv.py new file mode 100644 index 0000000..0d6c510 --- /dev/null +++ b/utils/loadDotEnv.py @@ -0,0 +1,14 @@ +import os +from dotenv import load_dotenv +from loguru import logger as log + +DOTENV_PATH = '.env' + +def initializeENV() -> bool: + if os.path.exists(DOTENV_PATH): + load_dotenv(DOTENV_PATH) + log.info('.env is loaded') + return True + else: + log.error('.env isn`t loaded') + return False diff --git a/utils/token.py b/utils/token.py new file mode 100644 index 0000000..d20cea4 --- /dev/null +++ b/utils/token.py @@ -0,0 +1,8 @@ +import jwt +import os +from time import time + +def generateKey(email, passwd): + key = os.getenv('KEY') + encoded = jwt.encode({email: passwd, 'iat': time()}, key, algorithm="HS256") + return encoded