From 306f0455f732266ef601ad1486f8a2d1089617d3 Mon Sep 17 00:00:00 2001 From: Oksamies Date: Fri, 8 Dec 2023 20:16:45 +0200 Subject: [PATCH] Add UserDeleteView --- .../thunderstore/api/cyberstorm/views/user.py | 40 +++++++++++++++++++ django/thunderstore/api/urls.py | 6 +++ django/thunderstore/social/views.py | 5 ++- 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 django/thunderstore/api/cyberstorm/views/user.py diff --git a/django/thunderstore/api/cyberstorm/views/user.py b/django/thunderstore/api/cyberstorm/views/user.py new file mode 100644 index 000000000..32a122790 --- /dev/null +++ b/django/thunderstore/api/cyberstorm/views/user.py @@ -0,0 +1,40 @@ +from django.http import HttpRequest +from rest_framework import serializers +from rest_framework.exceptions import ValidationError +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from rest_framework.views import APIView + +from thunderstore.api.utils import conditional_swagger_auto_schema +from thunderstore.social.views import DeleteAccountForm + + +class CyberstormUserDeleteRequestSerialiazer(serializers.Serializer): + verification = serializers.CharField() + + +class CyberstormUserDeleteResponseSerialiazer(serializers.Serializer): + username = serializers.CharField() + + +class UserDeleteAPIView(APIView): + permission_classes = [IsAuthenticated] + + @conditional_swagger_auto_schema( + request_body=CyberstormUserDeleteRequestSerialiazer, + responses={200: CyberstormUserDeleteResponseSerialiazer}, + operation_id="cyberstorm.current-user.delete", + tags=["cyberstorm"], + ) + def post(self, request: HttpRequest): + serializer = CyberstormUserDeleteRequestSerialiazer(data=request.data) + serializer.is_valid(raise_exception=True) + form = DeleteAccountForm( + user=request.user, + data=serializer.validated_data, + ) + if form.is_valid(): + form.delete_user() + return Response() + else: + raise ValidationError(form.errors) diff --git a/django/thunderstore/api/urls.py b/django/thunderstore/api/urls.py index 319882990..ae17b74e2 100644 --- a/django/thunderstore/api/urls.py +++ b/django/thunderstore/api/urls.py @@ -16,6 +16,7 @@ TeamMemberListAPIView, TeamServiceAccountListAPIView, ) +from thunderstore.api.cyberstorm.views.user import UserDeleteAPIView cyberstorm_urls = [ path( @@ -98,4 +99,9 @@ TeamServiceAccountListAPIView.as_view(), name="cyberstorm.team.service-account", ), + path( + "current-user/delete/", + UserDeleteAPIView.as_view(), + name="cyberstorm.current-user.delete", + ), ] diff --git a/django/thunderstore/social/views.py b/django/thunderstore/social/views.py index dcd2d4e8a..d79662d85 100644 --- a/django/thunderstore/social/views.py +++ b/django/thunderstore/social/views.py @@ -49,6 +49,9 @@ def clean_verification(self): raise forms.ValidationError("Invalid verification") return data + def delete_user(self): + self.user.delete() + class DeleteAccountView(SettingsViewMixin, RequireAuthenticationMixin, FormView): template_name = "settings/delete_account.html" @@ -66,5 +69,5 @@ def get_form_kwargs(self, *args, **kwargs): return kwargs def form_valid(self, form): - self.request.user.delete() + form.delete_user() return super().form_valid(form)