15 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
Kirill ce48859079 fix(api/auth/loginapi.py, app.py, utils/PostgressConnect.py, utils/createLogger.py, utils/loadDotEnv.py): Review fix
https://g.codrs.ru/Hackaton/Backend/pulls/2#issuecomment-23
https://g.codrs.ru/Hackaton/Backend/pulls/2#issuecomment-31
2025-10-26 14:10:10 +03:00
Kirill f93b94531c fix(utils/token.py): Code review fix
https://g.codrs.ru/Hackaton/Backend/pulls/2#issuecomment-24
2025-10-25 21:01:45 +03:00
Kirill 22da586aec fix(app.py): Code review fix
https://g.codrs.ru/Hackaton/Backend/pulls/2#issuecomment-30
2025-10-25 20:59:41 +03:00
Kirill 5058df8b7d fix(model/user.py): Code review fix
https://g.codrs.ru/Hackaton/Backend/pulls/2#issuecomment-20
https://g.codrs.ru/Hackaton/Backend/pulls/2#issuecomment-25
https://g.codrs.ru/Hackaton/Backend/pulls/2#issuecomment-21
2025-10-25 20:57:23 +03:00
Kirill 3a118c51b5 fix(api/auth/loginapi.py): Pull request review
https://g.codrs.ru/Hackaton/Backend/pulls/2#issuecomment-26
https://g.codrs.ru/Hackaton/Backend/pulls/2#issuecomment-20
https://g.codrs.ru/Hackaton/Backend/pulls/2#issuecomment-35
2025-10-25 20:53:48 +03:00
11 changed files with 117 additions and 37 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
-12
View File
@@ -1,12 +0,0 @@
from flask import Blueprint, request
from model.user import user
loginBP = Blueprint("loginapi", __name__)
@loginBP.route('/api/login', methods = ['POST'])
def login():
email = request.form['email']
password = request.form['password']
#if(isvalid(email, password)):
us = user.initialize(email, password)
return us.toJSON()
+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()}})
+11 -2
View File
@@ -1,6 +1,15 @@
from sys import exit
from flask import Flask from flask import Flask
from api.loginapi import loginBP 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 = 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
+8 -10
View File
@@ -3,20 +3,18 @@ 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
token: str token: str
@classmethod def __init__(self, email: str, passwd: str):
def initialize(cls, email:str, passwd:str):
#us = getUsModel() #возвращает словарь #us = getUsModel() #возвращает словарь
id = 1#us['id'] self.id = 1#us['id']
name = 'Bob'#us['name'] self.name = 'Bob'#us['name']
role = 'Backend'#us['role'] self.role = 'Backend'#us['role']
token = generateKey(email, passwd) self.token = generateKey(email, passwd)
return cls(id=id, name=name, role=role, token=token)
def toJSON(self): def toJson(self):
return json.dumps({"token": f'{self.token}', "user": {"id": self.id, "role": f'{self.role}', "name": f'{self.name}'}}) return {"user": {"id": self.id, "name": self.name, "role": self.role}, "token": self.token}
+3 -3
View File
@@ -1,10 +1,10 @@
import psycopg import psycopg2
import os import os
def PSQLConnect(): def PSQLConnect():
conn = psycopg.connect(os.getenv('POSTDRESS_CONNECTION')) conn = psycopg2.connect(os.getenv('POSTGRES_URL'))
return conn return conn
def PSQLCursor(conn): def PSQLCursor(conn):
cur = conn.cursor() cur = conn.cursor()
return cur return cur
+10 -8
View File
@@ -1,12 +1,14 @@
import os import os
from dotenv import load_dotenv from dotenv import load_dotenv
from loguru import logger as log
def initializeENV(): DOTENV_PATH = '.env'
dotenv_path = '../.env'
if os.path.exists(dotenv_path): def initializeENV() -> bool:
load_dotenv(dotenv_path) if os.path.exists(DOTENV_PATH):
print('.env is loaded') load_dotenv(DOTENV_PATH)
return 1 log.info('.env is loaded')
return True
else: else:
print('.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({f"{email}": f"{passwd}"}, key, algorithm="HS256") encoded = jwt.encode({email: passwd, 'iat': time()}, key, algorithm="HS256")
return encoded return encoded