from fastapi import APIRouter, Depends, HTTPException, Request, Form from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from model.database import get_async_session, User, hash_password from fastapi.templating import Jinja2Templates from fastapi.responses import RedirectResponse from routers.auth import get_current_user router = APIRouter() templates = Jinja2Templates(directory="templates") # 🔹 Список пользователей (доступно только авторизованным) @router.get("/users") async def users_list( request: Request, db: AsyncSession = Depends(get_async_session), username: dict = Depends(get_current_user) ): result = await db.execute(select(User)) users = result.scalars().all() username = username size = "Users" if username["role"] != "admin": raise HTTPException(status_code=403, detail="Access forbidden") return templates.TemplateResponse("users.html", {"request": request, "users":users, "role": username["role"], "username": username["username"], "size": size, "current_path": request.url.path}) # 🔹 Создание пользователя (доступно только администраторам) @router.post("/users/create") async def create_user( request: Request, username: str = Form(...), password: str = Form(...), role: str = Form("user"), db: AsyncSession = Depends(get_async_session), current_user: dict = Depends(get_current_user) # Проверяем авторизацию ): # Проверяем, является ли пользователь администратором result = await db.execute(select(User).filter(User.username == current_user['username'])) user = result.scalars().first() if not user or user.role != "admin": raise HTTPException(status_code=403, detail="Доступ запрещен") # Проверяем, есть ли уже такой пользователь result = await db.execute(select(User).filter(User.username == username)) existing_user = result.scalars().first() if existing_user: raise HTTPException(status_code=400, detail="Пользователь уже существует") hashed_password = hash_password(password) new_user = User(username=username, hashed_password=hashed_password, role=role) db.add(new_user) await db.commit() return RedirectResponse(url="/users", status_code=303) # 🔹 Обновление пароля (доступно только для администраторов или самого пользователя) @router.post("/users/update_password") async def update_password( request: Request, user_id: int = Form(...), new_password: str = Form(...), db: AsyncSession = Depends(get_async_session), current_user: dict = Depends(get_current_user) # Проверяем авторизацию ): result = await db.execute(select(User).filter(User.id == user_id)) user = result.scalars().first() if not user: raise HTTPException(status_code=404, detail="Пользователь не найден") # Получаем данные текущего пользователя result = await db.execute(select(User).filter(User.username == current_user['username'])) current_user_obj = result.scalars().first() # Только админ или сам пользователь могут менять пароль if not current_user_obj or (current_user_obj.role != "admin" and current_user_obj.id != user.id): raise HTTPException(status_code=403, detail="Доступ запрещен") user.hashed_password = hash_password(new_password) await db.commit() return RedirectResponse(url="/users", status_code=303)