add authorization and admin role
This commit is contained in:
44
main.py
44
main.py
@ -1,5 +1,6 @@
|
||||
from fastapi import FastAPI, Depends, HTTPException, status, Query, Path, UploadFile, File, Form
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from fastapi.security import OAuth2PasswordRequestForm
|
||||
from sqlalchemy.orm import Session
|
||||
import crud
|
||||
import models
|
||||
@ -9,6 +10,8 @@ from typing import List, Optional
|
||||
import uvicorn
|
||||
from utils import save_image, delete_image
|
||||
import json
|
||||
from datetime import timedelta
|
||||
import auth
|
||||
|
||||
# Создание таблиц в БД
|
||||
models.Base.metadata.create_all(bind=engine)
|
||||
@ -18,6 +21,33 @@ app = FastAPI(title="AutoBro API", description="API для управления
|
||||
# Добавляем обработку статических файлов
|
||||
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.get("/")
|
||||
def read_root():
|
||||
return {"message": "AutoBro API"}
|
||||
@ -49,7 +79,8 @@ def get_car(
|
||||
async def create_car(
|
||||
car_data: str = Form(..., description="Данные автомобиля в JSON формате"),
|
||||
image: UploadFile = File(None, description="Изображение автомобиля"),
|
||||
db: Session = Depends(get_db)
|
||||
db: Session = Depends(get_db),
|
||||
current_admin: models.Admin = Depends(auth.get_current_admin)
|
||||
):
|
||||
try:
|
||||
# Преобразуем строку JSON в словарь
|
||||
@ -82,7 +113,8 @@ async def update_car(
|
||||
car_id: int = Path(..., description="ID автомобиля", gt=0),
|
||||
car_data: str = Form(None, description="Данные автомобиля в JSON формате"),
|
||||
image: UploadFile = File(None, description="Изображение автомобиля"),
|
||||
db: Session = Depends(get_db)
|
||||
db: Session = Depends(get_db),
|
||||
current_admin: models.Admin = Depends(auth.get_current_admin)
|
||||
):
|
||||
# Проверяем существование автомобиля
|
||||
existing_car = crud.get_car(db, car_id=car_id)
|
||||
@ -128,7 +160,8 @@ async def update_car(
|
||||
@app.delete("/cars/{car_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
def delete_car(
|
||||
car_id: int = Path(..., description="ID автомобиля", gt=0),
|
||||
db: Session = Depends(get_db)
|
||||
db: Session = Depends(get_db),
|
||||
current_admin: models.Admin = Depends(auth.get_current_admin)
|
||||
):
|
||||
# Получаем автомобиль перед удалением
|
||||
car = crud.get_car(db, car_id=car_id)
|
||||
@ -146,5 +179,10 @@ def delete_car(
|
||||
crud.delete_car(db=db, car_id=car_id)
|
||||
return None
|
||||
|
||||
# Эндпоинт для проверки текущего пользователя (только для отладки)
|
||||
@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)
|
||||
|
Reference in New Issue
Block a user