This commit is contained in:
2025-07-13 17:32:08 +05:00
parent 296f2a91b2
commit 9ab99aa7e4

35
main.py
View File

@ -10,6 +10,9 @@ from typing import List, Optional
import uvicorn import uvicorn
from utils import save_image, delete_image from utils import save_image, delete_image
import json import json
from datetime import timedelta
import auth
from fastapi.middleware.cors import CORSMiddleware
# Создание таблиц в БД # Создание таблиц в БД
models.Base.metadata.create_all(bind=engine) models.Base.metadata.create_all(bind=engine)
@ -27,6 +30,33 @@ app.add_middleware(
# Добавляем обработку статических файлов # Добавляем обработку статических файлов
app.mount("/static", StaticFiles(directory="static"), name="static") 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) @app.post("/token", response_model=schemas.Token)
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)): 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)): def read_users_me(current_admin: models.Admin = Depends(auth.get_current_admin)):
return 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__": if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=3000) uvicorn.run(app, host="0.0.0.0", port=3000)