formaptix-server/routes/user.py

53 lines
1.5 KiB
Python
Raw Permalink Normal View History

2024-08-10 17:01:34 +03:00
import secrets
2024-08-10 17:01:34 +03:00
import jwt
from fastapi import APIRouter, HTTPException
from sqlalchemy import select
import database
2024-08-10 17:01:34 +03:00
import models
from models import settings
from .utils import hash_password, User
router = APIRouter(prefix="/user")
2024-08-10 17:01:34 +03:00
@router.post("/login")
2024-08-12 16:57:40 +03:00
async def login(auth: models.Auth) -> models.Token:
2024-08-10 17:01:34 +03:00
async with database.sessions.begin() as session:
stmt = select(database.User).where(
database.User.username == auth.username.strip()
)
request = await session.execute(stmt)
user = request.scalar_one_or_none()
if (
user is None
or hash_password(auth.password.strip(), user.salt) != user.password
):
raise HTTPException(403, "Forbidden")
return models.Token(
id=user.id,
username=user.username,
token=jwt.encode(
2024-09-22 11:34:48 +03:00
{"sub": user.id}, settings.SECRET + user.password, "HS256"
2024-08-10 17:01:34 +03:00
),
)
2024-08-23 09:57:42 +03:00
@router.post("/get")
async def get(user: User) -> models.User:
return models.User(id=user.id, username=user.username)
2024-08-10 17:01:34 +03:00
@router.put("/update/password")
async def update_password(user: User, new: models.UpdatePassword):
if len(new.password.strip()) == 0:
raise HTTPException(400, "Password must not be empty")
async with database.sessions.begin() as session:
session.add(user)
user.salt = secrets.token_hex(8)
user.password = hash_password(new.password.strip(), user.salt)