From 0b85aa9275dea43017105acbdbb227c617c1a2b3 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Mon, 18 Apr 2022 16:13:51 +0200 Subject: [PATCH] :sparkles: Added delete-user route --- classquiz/routers/users.py | 24 ++++++++++++------- classquiz/tests/test_kahoot_get.py | 2 +- classquiz/tests/test_kahoot_search.py | 2 +- classquiz/tests/test_server.py | 13 ++++++++++ .../src/routes/docs/privacy-policy.svelte | 4 ++-- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/classquiz/routers/users.py b/classquiz/routers/users.py index afc820d..0d7d280 100644 --- a/classquiz/routers/users.py +++ b/classquiz/routers/users.py @@ -15,7 +15,7 @@ from classquiz.auth import ( get_current_user, ) from classquiz.cache import clear_cache_for_account -from classquiz.config import redis, settings +from classquiz.config import redis, settings, meilisearch import uuid import bleach from pydantic import BaseModel @@ -64,9 +64,9 @@ async def create_user(user: route_user, background_task: BackgroundTasks) -> Use @router.post("/token/cookie", response_model=Token) async def login_for_cookie_access_token( - request: Request, - response: Response, - form_data: OAuth2PasswordRequestForm = Depends(), + request: Request, + response: Response, + form_data: OAuth2PasswordRequestForm = Depends(), ): user = await authenticate_user(form_data.username, form_data.password) if not user: @@ -168,9 +168,9 @@ async def verify_user(verify_key: str): @router.put("/password/update") async def change_password( - password_data: UpdatePassword, - response: Response, - user: User = Depends(get_current_user), + password_data: UpdatePassword, + response: Response, + user: User = Depends(get_current_user), ): if not verify_password(password_data.old_password, user.password): raise HTTPException(status_code=400, detail="Incorrect password") @@ -268,6 +268,14 @@ class DeleteUserInput(BaseModel): async def delete_user_account(input_data: DeleteUserInput, user: User = Depends(get_current_user)): if not verify_password(input_data.password, user.password): raise HTTPException(status_code=400, detail="Incorrect password") + user = await User.objects.filter(id=user.id).get_or_none() await UserSession.objects.filter(user=user).delete() - await Quiz.objects.filter(user=user).delete() + quizzes = await Quiz.objects.filter(user_id=user).all() + quizzes_to_delete = [] + for quiz in quizzes: + if quiz.is_public: + quizzes_to_delete.append(quiz.id) + if len(quizzes_to_delete) > 0: + meilisearch.index(settings.meilisearch_index).delete_documents(quizzes_to_delete) + await User.objects.filter(id=user.id).delete() await user.delete() diff --git a/classquiz/tests/test_kahoot_get.py b/classquiz/tests/test_kahoot_get.py index 9d1f068..cbd4d41 100644 --- a/classquiz/tests/test_kahoot_get.py +++ b/classquiz/tests/test_kahoot_get.py @@ -3,7 +3,7 @@ import pytest from classquiz.kahoot_importer.get import get -@pytest.mark.order("last") +@pytest.mark.order(-2) @pytest.mark.asyncio async def test_get(): await get("1f95eb0b-fcf4-4db2-879b-5418ef75116b") diff --git a/classquiz/tests/test_kahoot_search.py b/classquiz/tests/test_kahoot_search.py index 7104d46..dc045bb 100644 --- a/classquiz/tests/test_kahoot_search.py +++ b/classquiz/tests/test_kahoot_search.py @@ -4,7 +4,7 @@ from classquiz.kahoot_importer.search import search @pytest.mark.asyncio -@pytest.mark.order("last") +@pytest.mark.order(-2) async def test_search(): res = await search(query="Python", limit=100) assert len(res.entities) == 100 diff --git a/classquiz/tests/test_server.py b/classquiz/tests/test_server.py index cc4b69d..351e0c8 100644 --- a/classquiz/tests/test_server.py +++ b/classquiz/tests/test_server.py @@ -359,3 +359,16 @@ class TestQuiz: ValueStorage.imported_quizzes.append(resp.json()["id"]) resp = test_client.post("/api/v1/quiz/import/1f95eb0bdassdadasdas", cookies={"access_token": token}) assert resp.text == '"quiz not found"' + + +class TestDeleteUser: + @pytest.mark.asyncio + async def test_delete_user(self, test_client): + resp = test_client.post( + "/api/v1/users/token/cookie", data={"username": test_user_email, "password": test_user_password} + ) + token = resp.cookies["access_token"] + resp = test_client.delete( + "/api/v1/users/me", cookies={"access_token": token}, json={"password": test_user_password} + ) + assert resp.status_code == 200 diff --git a/frontend/src/routes/docs/privacy-policy.svelte b/frontend/src/routes/docs/privacy-policy.svelte index 73979af..e6d437b 100644 --- a/frontend/src/routes/docs/privacy-policy.svelte +++ b/frontend/src/routes/docs/privacy-policy.svelte @@ -45,13 +45,13 @@ On my server, by Netcup, in Germany. - The data you enter (quizzes, email, username) + The data the user enters (quizzes, email, username) Self-explaining Maximum of 30 days after you've deleted your account On my server, by Netcup, in Germany. - Your hashed password + The hashed password of the user Self-explaining Maximum of 30 days after you've deleted your account On my server, by Netcup, in Germany.