10 Commits
Author SHA1 Message Date
Kirill 12be29340b feat(api/ws.py): WebSoket 2025-10-31 13:47:55 +03:00
Kirill 9d01ead120 feat(dependencies.txt): Update libs
Added Libs for work with webSockets
2025-10-31 13:46:23 +03:00
Kirill 5bac4c720b feat(api/robots.py): Robots Api 2025-10-31 13:45:30 +03:00
Sweetbread cdf195306e feat(jwt): add iat field 2025-10-26 17:27:24 +03:00
Sweetbread 90f1a6245c feat(log): use loguru 2025-10-26 16:23:37 +03:00
Sweetbread 532266c98e refactor(auth): remove /api/auth/* handlers to api/auth.py 2025-10-26 16:23:37 +03:00
Sweetbread f99c0e8148 refactor(user): rename to toJson back 2025-10-26 16:23:37 +03:00
Sweetbread 2a7c74286c feat(auth): add data validation 2025-10-26 16:23:37 +03:00
Sweetbread 920c51b4f0 refactor(user): change class name to uppercase 2025-10-26 16:23:37 +03:00
Sweetbread 2b7fecb248 fix(env): ensure the .env is loaded 2025-10-26 14:55:43 +03:00
12 changed files with 101 additions and 41 deletions
+2
View File
@@ -0,0 +1,2 @@
KEY= # Key for JWT token
POSTGRES_URL=postgresql://
+28
View File
@@ -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
-19
View File
@@ -1,19 +0,0 @@
from flask import Blueprint, request, jsonify
from model.user import user
from utils.createLogger import createLogger
loginBP = Blueprint("loginapi", __name__)
log = createLogger("LoginAPI")
@loginBP.route('/api/login', methods = ['POST'])
def login():
if request.is_json:
req = request.json
email = req['email']
password = req['password']
#if(isvalid(email, password)):
us = user(email, password)
log.debug("Respons is sended")
return jsonify(us.toDictionary())
else:
log.error("Request is not a JSON")
return "Request is not a json", 500
+24
View File
@@ -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")
+26
View File
@@ -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()}})
+6 -3
View File
@@ -1,12 +1,15 @@
from sys import exit
from flask import Flask from flask import Flask
from api.auth.loginapi import loginBP from api.auth import auth
from utils.loadDotEnv import initializeENV from utils.loadDotEnv import initializeENV
from utils.PostgressConnect import PSQLConnect, PSQLCursor from utils.PostgressConnect import PSQLConnect, PSQLCursor
state = initializeENV() if not initializeENV():
exit(-1)
#conn = PSQLConnect() #conn = PSQLConnect()
#cur = PSQLCursor(conn) #cur = PSQLCursor(conn)
app = Flask(__name__) app = Flask(__name__)
app.register_blueprint(loginBP) app.register_blueprint(auth, url_prefix='/api/auth')
+3 -1
View File
@@ -1,4 +1,6 @@
flask==3.1.2 flask==3.1.2
flask-socketio
python-dotenv python-dotenv
psycopg-binary psycopg2-binary
pyjwt pyjwt
loguru
+2 -2
View File
@@ -3,7 +3,7 @@ import json
from utils.token import generateKey from utils.token import generateKey
@dataclass @dataclass
class user: class User:
id: int id: int
name: str name: str
role: str role: str
@@ -16,5 +16,5 @@ class user:
self.role = 'Backend'#us['role'] self.role = 'Backend'#us['role']
self.token = generateKey(email, passwd) self.token = generateKey(email, passwd)
def toDictionary(self): def toJson(self):
return {"user": {"id": self.id, "name": self.name, "role": self.role}, "token": self.token} return {"user": {"id": self.id, "name": self.name, "role": self.role}, "token": self.token}
+1 -1
View File
@@ -2,7 +2,7 @@ import psycopg2
import os import os
def PSQLConnect(): def PSQLConnect():
conn = psycopg2.connect(os.getenv('POSTDRESS_CONNECTION')) conn = psycopg2.connect(os.getenv('POSTGRES_URL'))
return conn return conn
def PSQLCursor(conn): def PSQLCursor(conn):
-6
View File
@@ -1,6 +0,0 @@
import logging
def createLogger(name: str):
logger = logging.getLogger()
logger.propagate = False
return logger
+7 -8
View File
@@ -1,15 +1,14 @@
import os import os
from dotenv import load_dotenv from dotenv import load_dotenv
from .createLogger import createLogger from loguru import logger as log
log = createLogger("ENV") DOTENV_PATH = '.env'
def initializeENV(): def initializeENV() -> bool:
dotenv_path = '../.env' if os.path.exists(DOTENV_PATH):
if os.path.exists(dotenv_path): load_dotenv(DOTENV_PATH)
load_dotenv(dotenv_path)
log.info('.env is loaded') log.info('.env is loaded')
return 1 return True
else: else:
log.error('.env isn`t loaded') log.error('.env isn`t loaded')
return 0 return False
+2 -1
View File
@@ -1,7 +1,8 @@
import jwt import jwt
import os import os
from time import time
def generateKey(email, passwd): def generateKey(email, passwd):
key = os.getenv('KEY') key = os.getenv('KEY')
encoded = jwt.encode({email: passwd}, key, algorithm="HS256") encoded = jwt.encode({email: passwd, 'iat': time()}, key, algorithm="HS256")
return encoded return encoded