✨ Added admin-option to delete an account
This commit is contained in:
@@ -31,6 +31,7 @@ from classquiz.routers import (
|
|||||||
community,
|
community,
|
||||||
avatar,
|
avatar,
|
||||||
results,
|
results,
|
||||||
|
admin,
|
||||||
)
|
)
|
||||||
from classquiz.socket_server import sio
|
from classquiz.socket_server import sio
|
||||||
from classquiz.helpers import meilisearch_init, telemetry_ping, bg_tasks
|
from classquiz.helpers import meilisearch_init, telemetry_ping, bg_tasks
|
||||||
@@ -104,5 +105,5 @@ app.include_router(eximport.router, tags=["export", "import"], prefix="/api/v1/e
|
|||||||
app.include_router(sitemap.router, tags=["sitemap"], prefix="/api/v1/sitemap", include_in_schema=True)
|
app.include_router(sitemap.router, tags=["sitemap"], prefix="/api/v1/sitemap", include_in_schema=True)
|
||||||
app.include_router(community.router, tags=["community"], prefix="/api/v1/community", include_in_schema=True)
|
app.include_router(community.router, tags=["community"], prefix="/api/v1/community", include_in_schema=True)
|
||||||
app.include_router(avatar.router, tags=["avatar"], prefix="/api/v1/avatar", include_in_schema=True)
|
app.include_router(avatar.router, tags=["avatar"], prefix="/api/v1/avatar", include_in_schema=True)
|
||||||
|
app.include_router(admin.router, tags=["admin"], prefix="/api/v1/admin", include_in_schema=True)
|
||||||
app.mount("/", ASGIApp(sio))
|
app.mount("/", ASGIApp(sio))
|
||||||
|
|||||||
@@ -127,6 +127,15 @@ async def get_current_user(token: str = Depends(oauth2_scheme)):
|
|||||||
return user
|
return user
|
||||||
|
|
||||||
|
|
||||||
|
async def get_admin_user(token: str = Depends(oauth2_scheme)) -> User:
|
||||||
|
user = await get_current_user(token)
|
||||||
|
admin_user = await User.objects.order_by(User.created_at.asc()).get()
|
||||||
|
if admin_user.id == user.id:
|
||||||
|
return user
|
||||||
|
else:
|
||||||
|
raise credentials_exception
|
||||||
|
|
||||||
|
|
||||||
async def get_current_user_optional(token: str = Depends(oauth2_scheme)) -> User | None:
|
async def get_current_user_optional(token: str = Depends(oauth2_scheme)) -> User | None:
|
||||||
try:
|
try:
|
||||||
payload = jwt.decode(token, settings.secret_key, algorithms=[ALGORITHM])
|
payload = jwt.decode(token, settings.secret_key, algorithms=[ALGORITHM])
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
from uuid import UUID
|
||||||
|
|
||||||
|
from fastapi import APIRouter, Depends
|
||||||
|
|
||||||
|
from classquiz.auth import get_admin_user
|
||||||
|
from classquiz.db.models import User
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
|
@router.delete("/user/id")
|
||||||
|
async def delete_user_by_id(user_id: UUID, user: User = Depends(get_admin_user)):
|
||||||
|
return {"deleted": await User.objects.delete(id=user_id)}
|
||||||
|
|
||||||
|
|
||||||
|
@router.delete("/user/username")
|
||||||
|
async def delete_user_by_username(username: str, user: User = Depends(get_admin_user)):
|
||||||
|
return {"deleted": await User.objects.delete(username=username)}
|
||||||
|
|
||||||
|
|
||||||
|
@router.delete("/user/email")
|
||||||
|
async def delete_user_by_email(email: str, user: User = Depends(get_admin_user)):
|
||||||
|
return {"deleted": await User.objects.delete(email=email)}
|
||||||
@@ -271,7 +271,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{/each}
|
{/each}
|
||||||
<div
|
<div
|
||||||
class="bg-white shadow rounded-lg h-40 p-2 mb-6 hover:cursor-pointer drop-shadow-2xl border border-gray-500 dark:bg-gray-600 grid grid-cols-2"
|
class="bg-white shadow rounded-lg h-40 p-2 hover:cursor-pointer drop-shadow-2xl border border-gray-500 dark:bg-gray-600 grid grid-cols-2"
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@@ -282,7 +282,7 @@
|
|||||||
>
|
>
|
||||||
<span class="w-full text-center">Question</span>
|
<span class="w-full text-center">Question</span>
|
||||||
<svg
|
<svg
|
||||||
class="h-full"
|
class="w-5/6 m-auto"
|
||||||
fill="none"
|
fill="none"
|
||||||
stroke="currentColor"
|
stroke="currentColor"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
@@ -305,7 +305,7 @@
|
|||||||
>
|
>
|
||||||
<span class="w-full text-center">Slide</span>
|
<span class="w-full text-center">Slide</span>
|
||||||
<svg
|
<svg
|
||||||
class="h-full"
|
class="w-5/6 m-auto"
|
||||||
fill="none"
|
fill="none"
|
||||||
stroke="currentColor"
|
stroke="currentColor"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
"""Added custom_openid
|
||||||
|
|
||||||
|
Revision ID: 7afe98d04169
|
||||||
|
Revises: 438516c09cf3
|
||||||
|
Create Date: 2023-02-17 15:10:00.158320
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
import ormar
|
||||||
|
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = "7afe98d04169"
|
||||||
|
down_revision = "438516c09cf3"
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade() -> None:
|
||||||
|
op.execute("ALTER TYPE userauthtypes ADD VALUE 'CUSTOM';")
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade() -> None:
|
||||||
|
op.execute("ALTER TYPE userauthtypes DROP VALUE 'CUSTOM';")
|
||||||
Reference in New Issue
Block a user