From 9ab99aa7e4b44f17df5b2859cf024444f9e29961 Mon Sep 17 00:00:00 2001 From: DIKER0K Date: Sun, 13 Jul 2025 17:32:08 +0500 Subject: [PATCH] fix main --- main.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/main.py b/main.py index 31eae99..6a0f0ec 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,9 @@ from typing import List, Optional import uvicorn from utils import save_image, delete_image import json +from datetime import timedelta +import auth +from fastapi.middleware.cors import CORSMiddleware # Создание таблиц в БД models.Base.metadata.create_all(bind=engine) @@ -27,6 +30,33 @@ app.add_middleware( # Добавляем обработку статических файлов app.mount("/static", StaticFiles(directory="static"), name="static") +# Эндпоинты для авторизации +@app.post("/token", response_model=schemas.Token) +async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)): + admin = auth.authenticate_admin(db, form_data.username, form_data.password) + if not admin: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Неверное имя пользователя или пароль", + headers={"WWW-Authenticate": "Bearer"}, + ) + access_token_expires = timedelta(minutes=auth.ACCESS_TOKEN_EXPIRE_MINUTES) + access_token = auth.create_access_token( + data={"sub": admin.username}, expires_delta=access_token_expires + ) + return {"access_token": access_token, "token_type": "bearer"} + +@app.post("/admins", response_model=schemas.Admin, status_code=status.HTTP_201_CREATED) +def create_admin(admin: schemas.AdminCreate, db: Session = Depends(get_db), current_admin: models.Admin = Depends(auth.get_current_admin)): + # Проверка, что создать админа может только существующий админ + db_admin = crud.get_admin_by_username(db, username=admin.username) + if db_admin: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Пользователь с таким именем уже существует" + ) + return crud.create_admin(db=db, admin=admin) + # Эндпоинты для авторизации @app.post("/token", response_model=schemas.Token) async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)): @@ -190,6 +220,11 @@ def delete_car( def read_users_me(current_admin: models.Admin = Depends(auth.get_current_admin)): return current_admin +# Эндпоинт для проверки текущего пользователя (только для отладки) +@app.get("/users/me", response_model=schemas.Admin) +def read_users_me(current_admin: models.Admin = Depends(auth.get_current_admin)): + return current_admin + if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=3000)