Make User Promotion Demotion sync calls (#1448)

This commit is contained in:
Yuhong Sun 2024-05-11 16:25:56 -07:00 committed by GitHub
parent 5bf123da53
commit e89c81de76
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 37 additions and 42 deletions

View File

@ -29,8 +29,6 @@
"module": "uvicorn",
"cwd": "${workspaceFolder}/backend",
"env": {
"AUTH_TYPE": "disabled",
"LOG_ALL_MODEL_INTERACTIONS": "True",
"LOG_LEVEL": "DEBUG",
"PYTHONUNBUFFERED": "1"
},
@ -48,7 +46,6 @@
"module": "uvicorn",
"cwd": "${workspaceFolder}/backend",
"env": {
"AUTH_TYPE": "disabled",
"LOG_ALL_MODEL_INTERACTIONS": "True",
"LOG_LEVEL": "DEBUG",
"PYTHONUNBUFFERED": "1"

View File

@ -2,9 +2,6 @@ from fastapi import APIRouter
from fastapi import Depends
from fastapi import HTTPException
from fastapi import status
from fastapi_users.db import SQLAlchemyUserDatabase
from fastapi_users_db_sqlalchemy import UUID_ID
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import Session
from danswer.auth.schemas import UserRead
@ -14,8 +11,8 @@ from danswer.auth.users import current_user
from danswer.auth.users import get_display_email
from danswer.auth.users import optional_user
from danswer.db.engine import get_session
from danswer.db.engine import get_sqlalchemy_async_engine
from danswer.db.models import User
from danswer.db.users import get_user_by_email
from danswer.db.users import list_users
from danswer.server.manage.models import UserByEmail
from danswer.server.manage.models import UserInfo
@ -25,41 +22,42 @@ router = APIRouter(prefix="/manage")
@router.patch("/promote-user-to-admin")
async def promote_admin(
user_email: UserByEmail, user: User = Depends(current_admin_user)
def promote_admin(
user_email: UserByEmail,
_: User = Depends(current_admin_user),
db_session: Session = Depends(get_session),
) -> None:
if user.role != UserRole.ADMIN:
raise HTTPException(status_code=401, detail="Unauthorized")
async with AsyncSession(get_sqlalchemy_async_engine()) as asession:
user_db = SQLAlchemyUserDatabase[User, UUID_ID](asession, User)
user_to_promote = await user_db.get_by_email(user_email.user_email)
if not user_to_promote:
raise HTTPException(status_code=404, detail="User not found")
user_to_promote.role = UserRole.ADMIN
asession.add(user_to_promote)
await asession.commit()
return
user_to_promote = get_user_by_email(
email=user_email.user_email, db_session=db_session
)
if not user_to_promote:
raise HTTPException(status_code=404, detail="User not found")
user_to_promote.role = UserRole.ADMIN
db_session.add(user_to_promote)
db_session.commit()
@router.patch("/demote-admin-to-user")
@router.patch("/demote-admin-to-basic")
async def demote_admin(
user_email: UserByEmail, user: User = Depends(current_admin_user)
user_email: UserByEmail,
user: User = Depends(current_admin_user),
db_session: Session = Depends(get_session),
) -> None:
if user.role != UserRole.ADMIN:
raise HTTPException(status_code=401, detail="Unauthorized")
async with AsyncSession(get_sqlalchemy_async_engine()) as asession:
user_db = SQLAlchemyUserDatabase[User, UUID_ID](asession, User)
user_to_demote = await user_db.get_by_email(user_email.user_email)
if not user_to_demote:
raise HTTPException(status_code=404, detail="User not found")
if user_to_demote.id == user.id:
raise HTTPException(
status_code=400, detail="Cannot demote yourself from admin role"
)
user_to_demote.role = UserRole.BASIC
asession.add(user_to_demote)
await asession.commit()
return
user_to_demote = get_user_by_email(
email=user_email.user_email, db_session=db_session
)
if not user_to_demote:
raise HTTPException(status_code=404, detail="User not found")
if user_to_demote.id == user.id:
raise HTTPException(
status_code=400, detail="Cannot demote yourself from admin role!"
)
user_to_demote.role = UserRole.BASIC
db_session.add(user_to_demote)
db_session.commit()
@router.get("/users")

View File

@ -83,20 +83,20 @@ const UsersTable = () => {
} else {
mutate("/api/manage/users");
setPopup({
message: "User promoted to admin!",
message: "User promoted to admin user!",
type: "success",
});
}
}}
>
Promote to Admin!
Promote to Admin User
</Button>
)}
{user.role === "admin" && (
<Button
onClick={async () => {
const res = await fetch(
"/api/manage/demote-admin-to-user",
"/api/manage/demote-admin-to-basic",
{
method: "PATCH",
headers: {
@ -116,13 +116,13 @@ const UsersTable = () => {
} else {
mutate("/api/manage/users");
setPopup({
message: "Admin demoted to user!",
message: "Admin demoted to basic user!",
type: "success",
});
}
}}
>
Demote to User
Demote to Basic User
</Button>
)}
</div>