Compare commits

..
2 Commits
Author SHA1 Message Date
Sweetbread e44696ce04 wip 2025-10-26 23:19:51 +03:00
Sweetbread 72f766ab46 fix(log): replace logger with loguru (again!) 2025-10-26 23:09:42 +03:00
9 changed files with 39 additions and 59 deletions

No files matched your search

+9 -2
View File
@@ -1,5 +1,7 @@
from flask import Blueprint, request, jsonify from flask import Blueprint, request, jsonify
from model.user import User from model.user import User
from db.repositories.user_repository import UserRepository # FIXME: authenticate_user as get_user
from utils.token import generateKey as getToken
auth = Blueprint("auth", __name__) auth = Blueprint("auth", __name__)
@@ -21,8 +23,13 @@ def login():
if len(password.strip()) < 8: if len(password.strip()) < 8:
return "Password is too short", 400 return "Password is too short", 400
user = User(email, password) user = UserRepository().authenticate_user(email, password)
return jsonify(user.toJson()) if not user:
return "Wrong credentials", 400
token = getToken(user)
return jsonify({'token': token, 'user': {'id': user.id, 'name': user.name, 'role': user.role}})
else: else:
return "Request is not a json", 400 return "Request is not a json", 400
+10 -11
View File
@@ -1,6 +1,6 @@
import psycopg2 import psycopg2
import os import os
import logging from loguru import logger
from contextlib import contextmanager from contextlib import contextmanager
from typing import Generator from typing import Generator
@@ -8,10 +8,8 @@ from utils.loadDotEnv import initializeENV
initializeENV() initializeENV()
logger = logging.getLogger(__name__)
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):
@@ -24,16 +22,16 @@ def get_connection() -> Generator[psycopg2.extensions.connection, None, None]:
conn = None conn = None
try: try:
conn = PSQLConnect() conn = PSQLConnect()
logger.debug("Подключение к БД установлено") logger.info("Подключение к БД установлено")
yield conn yield conn
except psycopg2.OperationalError as e: except psycopg2.OperationalError as e:
logger.error(f"Ошибка подключения к БД: {e}") logger.error(f"Ошибка подключения к БД:\n{e}")
raise raise
except psycopg2.Error as e: except psycopg2.Error as e:
logger.error(f"Ошибка PostgreSQL: {e}") logger.error(f"Ошибка PostgreSQL:\n{e}")
raise raise
except Exception as e: except Exception as e:
logger.error(f"Неожиданная ошибка при работе с БД: {e}") logger.error(f"Неожиданная ошибка при работе с БД:\n{e}")
raise raise
finally: finally:
if conn: if conn:
@@ -41,7 +39,7 @@ def get_connection() -> Generator[psycopg2.extensions.connection, None, None]:
conn.close() conn.close()
logger.debug("Соединение с БД закрыто") logger.debug("Соединение с БД закрыто")
except Exception as e: except Exception as e:
logger.warning(f"Ошибка при закрытии соединения: {e}") logger.warning(f"Ошибка при закрытии соединения:\n{e}")
def test_connection() -> bool: def test_connection() -> bool:
try: try:
@@ -56,6 +54,7 @@ def test_connection() -> bool:
cur.close() cur.close()
logger.debug("Курсор закрыт") logger.debug("Курсор закрыт")
except Exception as e: except Exception as e:
logger.error(f"Тест подключения к БД провален: {e}") logger.error(f"Тест подключения к БД провален:\n{e}")
return False return False
print(test_connection())
logger.debug(test_connection())
+1 -3
View File
@@ -1,11 +1,9 @@
from typing import List, Optional from typing import List, Optional
from datetime import datetime, date from datetime import datetime, date
import logging from loguru import logger
from db.connection import get_connection from db.connection import get_connection
from model.ai_prediction import AIPrediction from model.ai_prediction import AIPrediction
logger = logging.getLogger(__name__)
class AIPredictionsRepository: class AIPredictionsRepository:
def get_all(self) -> List[AIPrediction]: def get_all(self) -> List[AIPrediction]:
try: try:
+1 -3
View File
@@ -1,12 +1,10 @@
# db/repositories/inventory_repository.py # db/repositories/inventory_repository.py
from typing import List, Optional, Tuple from typing import List, Optional, Tuple
from datetime import datetime from datetime import datetime
import logging from loguru import logger
from db.connection import get_connection from db.connection import get_connection
from model.inventory import InventoryRecord from model.inventory import InventoryRecord
logger = logging.getLogger(__name__)
class InventoryRepository: class InventoryRepository:
def get_all(self) -> List[InventoryRecord]: def get_all(self) -> List[InventoryRecord]:
try: try:
+1 -3
View File
@@ -1,10 +1,8 @@
from typing import List, Optional from typing import List, Optional
import logging from loguru import logger
from db.connection import get_connection from db.connection import get_connection
from model.product import Product from model.product import Product
logger = logging.getLogger(__name__)
class ProductRepository: class ProductRepository:
def get_all(self) -> List[Product]: def get_all(self) -> List[Product]:
try: try:
+1 -3
View File
@@ -1,10 +1,8 @@
from typing import List, Optional from typing import List, Optional
import logging from loguru import logger
from db.connection import get_connection from db.connection import get_connection
from model.robot import Robot from model.robot import Robot
logger = logging.getLogger(__name__)
class RobotRepository: class RobotRepository:
def get_all(self) -> List[Robot]: def get_all(self) -> List[Robot]:
try: try:
+4 -21
View File
@@ -1,10 +1,8 @@
from typing import List, Optional from typing import List, Optional
import logging from loguru import logger
from model.user import User from model.user import User
from db.connection import get_connection from db.connection import get_connection
logger = logging.getLogger(__name__)
class UserRepository: class UserRepository:
def get_all(self) -> List[User]: def get_all(self) -> List[User]:
try: try:
@@ -168,6 +166,9 @@ class UserRepository:
return False return False
def authenticate_user(self, email: str, password_hash: str) -> Optional[User]: def authenticate_user(self, email: str, password_hash: str) -> Optional[User]:
if not self.user_exists(email):
return
try: try:
with get_connection() as conn: with get_connection() as conn:
with conn.cursor() as cur: with conn.cursor() as cur:
@@ -185,24 +186,6 @@ class UserRepository:
logger.error(f"Ошибка аутентификации пользователя {email}: {e}") logger.error(f"Ошибка аутентификации пользователя {email}: {e}")
return None return None
def is_valid_authenticate(self, email: str, password_hash: str) -> bool:
try:
with get_connection() as conn:
with conn.cursor() as cur:
cur.execute("""
SELECT 1 FROM users
WHERE email = %s AND password_hash = %s
""", (email, password_hash))
is_valid = cur.fetchone() is not None
if is_valid:
logger.debug(f"Валидные учетные данные для пользователя {email}")
else:
logger.warning(f"Невалидные учетные данные для пользователя {email}")
return is_valid
except Exception as e:
logger.error(f"Ошибка проверки учетных данных пользователя {email}: {e}")
return False
def user_exists(self, email: str) -> bool: def user_exists(self, email: str) -> bool:
try: try:
with get_connection() as conn: with get_connection() as conn:
-11
View File
@@ -1,6 +1,5 @@
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime from datetime import datetime
from utils.token import generateKey
@dataclass @dataclass
@@ -11,13 +10,3 @@ class User:
name: str name: str
role: str role: str
created_at: datetime created_at: datetime
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}
+12 -2
View File
@@ -1,8 +1,18 @@
import jwt import jwt
import os import os
from time import time from time import time
from model.user import User
def generateKey(email, passwd): def generateKey(user: User) -> dict:
key = os.getenv('KEY') key = os.getenv('KEY')
encoded = jwt.encode({email: passwd, 'iat': time()}, key, algorithm="HS256") encoded = jwt.encode(
{
'id': user.id,
'name': user.name,
'role': user.role,
'iat': time()
},
key,
algorithm="HS256"
)
return encoded return encoded