Implement login API, closes #1 #2

Open
BlackCorbeau wants to merge 25 commits from dev into main
Owner
No description provided.
BlackCorbeau added this to the v1.0.0 milestone 2025-10-25 08:31:09 +00:00
BlackCorbeau added the
Роль
Backend
Приоритет
Обычный
1
labels 2025-10-25 08:31:09 +00:00
BlackCorbeau added 10 commits 2025-10-25 08:31:09 +00:00
Added libs for working with PSQL and dot-env
Function for download enviroment variables from .env to Enviroment
Added Functions with connect to postgress db by link from enviroment
Add script with is connected to db and initialize it
Added function with is creating jvt tocken for user
User Dataclass with is get all user respons data
Blueprint with api login page with is get respons (form-data) and send JVT token and user id name and role
BlackCorbeau requested review from Nitro 2025-10-25 08:31:09 +00:00
BlackCorbeau requested review from Sweetbread 2025-10-25 08:31:09 +00:00
Author
Owner

image.png

![image.png](/attachments/497f3dfe-7f17-44c0-8c76-fa70864adada)
Sweetbread requested changes 2025-10-25 10:14:10 +00:00
Sweetbread left a comment
Owner
  1. Не по ТЗ
  2. Есть лишние пустые файлы
  3. Есть просто лишние файлы, которые пока задачи никакой не выполняют
1. Не по ТЗ 2. Есть лишние пустые файлы 3. Есть просто лишние файлы, которые пока задачи никакой не выполняют
api/loginapi.py Outdated
@@ -0,0 +1,12 @@
from flask import Blueprint, request
from model.user import user
loginBP = Blueprint("loginapi", __name__)
Owner

Что это и зачем?

Что это и зачем?
Author
Owner

Зачем отдельный роутер? Может потому что это правильная MVC структура?

Зачем отдельный роутер? Может потому что это правильная MVC структура?
api/loginapi.py Outdated
@@ -0,0 +3,4 @@
loginBP = Blueprint("loginapi", __name__)
@loginBP.route('/api/login', methods = ['POST'])
Owner

-> /api/auth/login

-> `/api/auth/login`
Author
Owner

-> /api/auth/login

Зачем?

> -> `/api/auth/login` Зачем?
Owner

ТЗ

ТЗ
api/loginapi.py Outdated
@@ -0,0 +6,4 @@
@loginBP.route('/api/login', methods = ['POST'])
def login():
email = request.form['email']
password = request.form['password']
Owner

Данные в запросе приходят в JSON, а не в форме

Данные в запросе приходят в JSON, а не в форме
@@ -0,0 +10,4 @@
token: str
@classmethod
def initialize(cls, email:str, passwd:str):
Owner
  1. Отдели имя и аннотацию пробелами (email: str, ...)
  2. Зачем initialize (user.initialize(...)), когда уже есть __init__ (user(...))?
1. Отдели имя и аннотацию пробелами (`email: str`, ...) 2. Зачем `initialize` (`user.initialize(...)`), когда уже есть `__init__` (`user(...)`)?
Sweetbread marked this conversation as resolved
model/user.py Outdated
@@ -0,0 +14,4 @@
#us = getUsModel() #возвращает словарь
id = 1#us['id']
name = 'Bob'#us['name']
role = 'Backend'#us['role']
Owner

Выглядит, как что-то недоработанное

Выглядит, как что-то недоработанное
Author
Owner

Может потому что нет бд?)

Может потому что нет бд?)
Owner

Так а зачем PR отправил?

Так а зачем PR отправил?
model/user.py Outdated
@@ -0,0 +16,4 @@
name = 'Bob'#us['name']
role = 'Backend'#us['role']
token = generateKey(email, passwd)
return cls(id=id, name=name, role=role, token=token)
Owner

Попробуй просто по порядку перечислять аргументы, а то x=x так себе выглядит

Попробуй просто по порядку перечислять аргументы, а то `x=x` так себе выглядит
model/user.py Outdated
@@ -0,0 +19,4 @@
return cls(id=id, name=name, role=role, token=token)
def toJSON(self):
return json.dumps({"token": f'{self.token}', "user": {"id": self.id, "role": f'{self.role}', "name": f'{self.name}'}})
Owner
  1. Зачем f-строки? Если переменные и так строки, то просто вставляй их
  2. Стоит ли преобразовывать JSON в строку?
1. Зачем f-строки? Если переменные и так строки, то просто вставляй их 2. Стоит ли преобразовывать JSON в строку?
@@ -0,0 +1,10 @@
import psycopg
import os
def PSQLConnect():
Owner

Где используется?

Где используется?
Author
Owner

Вспомогательный модуль для работы с БД

Вспомогательный модуль для работы с БД
Owner

Я вижу что это. Где используется?

Я вижу что это. Где используется?
Author
Owner

./db/Initalizedb

./db/Initalizedb
Owner

Такого файла нет

Такого файла нет
Author
Owner

Он пока не готов я его дописываю

Он пока не готов я его дописываю
@@ -0,0 +5,4 @@
conn = psycopg.connect(os.getenv('POSTDRESS_CONNECTION'))
return conn
def PSQLCursor(conn):
Owner

Где используется?

Где используется?
Author
Owner

./db/Initalizedb

./db/Initalizedb
@@ -0,0 +6,4 @@
return conn
def PSQLCursor(conn):
cur = conn.cursor()
Owner

Пробел лишний

Пробел лишний
@@ -0,0 +1,12 @@
import os
from dotenv import load_dotenv
def initializeENV():
Owner

Где используется?

Где используется?
Author
Owner

Функция загружающая переменные окружения

Функция загружающая переменные окружения
Owner

Я вижу что это. Где используется?

Я вижу что это. Где используется?
Author
Owner

./db/Initalizedb, щас поставлю в другое место

./db/Initalizedb, щас поставлю в другое место
@@ -0,0 +8,4 @@
print('.env is loaded')
return 1
else:
print('.env isn`t loaded')
Owner

Пока ладно, но надо бы либы для логирования использовать

Пока ладно, но надо бы либы для логирования использовать
utils/token.py Outdated
@@ -0,0 +3,4 @@
def generateKey(email, passwd):
key = os.getenv('KEY')
encoded = jwt.encode({f"{email}": f"{passwd}"}, key, algorithm="HS256")
Owner

1. encoded = jwt.encode({email: passwd}, key, algorithm="HS256")
2. Добавь iat, на всякий случай

~~1. `encoded = jwt.encode({email: passwd}, key, algorithm="HS256")`~~ 2. Добавь [`iat`](https://pyjwt.readthedocs.io/en/latest/usage.html#issued-at-claim-iat), на всякий случай
Sweetbread changed title from Login Api to Implement login API, closes #1 2025-10-25 10:18:12 +00:00
Sweetbread reviewed 2025-10-25 10:21:26 +00:00
api/loginapi.py Outdated
@@ -0,0 +9,4 @@
password = request.form['password']
#if(isvalid(email, password)):
us = user.initialize(email, password)
return us.toJSON()
Owner

jsonify для корректных заголовков ответа и отсутствия костылей

[`jsonify`](https://flask.palletsprojects.com/en/stable/patterns/javascript/#return-json-from-views) для корректных заголовков ответа и отсутствия костылей
BlackCorbeau added 4 commits 2025-10-25 18:02:54 +00:00
BlackCorbeau added 1 commit 2025-10-26 11:12:37 +00:00
Sweetbread added 6 commits 2025-10-26 13:24:06 +00:00
Sweetbread added spent time 1 hour 2025-10-26 14:18:18 +00:00
Sweetbread started working 2025-10-26 14:23:03 +00:00
Sweetbread added 1 commit 2025-10-26 14:27:47 +00:00
Sweetbread worked for 4 minutes 2025-10-26 14:27:53 +00:00
BlackCorbeau added 3 commits 2025-10-31 10:48:48 +00:00
This pull request doesn't have enough required approvals yet. 0 of 1 official approvals granted.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin dev:dev
git checkout dev
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Total Time Spent: 1 hour 4 minutes
Sweetbread
1 hour 4 minutes
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Hackaton/Backend#2