feat: removed entire API

This commit is contained in:
2025-01-19 14:13:50 +01:00
parent 53bdf739b0
commit 97d0d27c97
31 changed files with 0 additions and 1880 deletions
View File
View File
-88
View File
@@ -1,88 +0,0 @@
from typing import List
from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.password_validation import (
get_password_validators,
validate_password,
)
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
User = get_user_model()
AUTH_PASSWORD_VALIDATORS = getattr(settings, "AUTH_PASSWORD_VALIDATORS")
class UserSerializer(serializers.ModelSerializer):
permissions = serializers.SerializerMethodField()
def get_permissions(self, obj: User) -> List[str]:
group_permissions = obj.get_group_permissions()
user_permissions = obj.get_user_permissions()
return sorted(user_permissions.union(group_permissions))
class Meta:
model = User
fields = (
"username",
"email",
"first_name",
"last_name",
"is_staff",
"is_superuser",
"permissions",
)
read_only_fields = (
"username",
"code",
"is_staff",
"is_superuser",
"permissions",
)
class UpdatePasswordSerializer(serializers.ModelSerializer):
old_password = serializers.CharField(write_only=True)
new_password = serializers.CharField(write_only=True)
new_password2 = serializers.CharField(write_only=True)
def validate_old_password(self, password):
user = self.context.get("request").user
if not user.check_password(password):
raise ValidationError("Wrong old password")
return password
def validate_new_password(self, password):
old_password = self.context.get("request").data.get("old_password")
if password == old_password:
raise ValidationError("Password can't be the same as the old one")
password2 = self.context.get("request").data.get("new_password2")
if password != password2:
raise ValidationError("Password mismatch")
validate_password(
password,
password_validators=get_password_validators(AUTH_PASSWORD_VALIDATORS),
)
return password
def save(self, *args, **kwargs):
new_password = self.validated_data.get("new_password")
self.instance.set_password(new_password)
self.instance.save()
class Meta:
model = User
fields = (
"old_password",
"new_password",
"new_password2",
)
-19
View File
@@ -1,19 +0,0 @@
from django.urls import path
from rest_framework_simplejwt.views import (
token_obtain_pair,
token_refresh,
token_verify,
)
from users.api.v1.views import change_password, retrieve_update_me
app_name = "auth"
urlpatterns = [
path("login/", token_obtain_pair, name="login"),
path("refresh/", token_refresh, name="refresh_jwt"),
path("verify/", token_verify, name="verify_jwt"),
path("me/", retrieve_update_me, name="user_info"),
path("change-password/", change_password, name="change_password"),
]
-35
View File
@@ -1,35 +0,0 @@
from django.contrib.auth.models import User
from rest_framework.generics import RetrieveUpdateAPIView, UpdateAPIView
from rest_framework.permissions import IsAuthenticated
from users.api.v1.serializers import UpdatePasswordSerializer, UserSerializer
class RetrieveUpdateMe(RetrieveUpdateAPIView):
"""
get: Return user info
put: Update user info
"""
serializer_class = UserSerializer
def get_object(self):
return self.request.user
class ChangePassword(UpdateAPIView):
"""
put: Update user's password
"""
serializer_class = UpdatePasswordSerializer
permission_classes = (IsAuthenticated,)
queryset = User.objects.all()
def get_object(self):
return self.request.user
retrieve_update_me = RetrieveUpdateMe.as_view()
change_password = ChangePassword.as_view()
-110
View File
@@ -1,110 +0,0 @@
from django.contrib.auth import get_user_model
from django.shortcuts import reverse
from rest_framework import status
from rest_framework.test import APITestCase
User = get_user_model()
class TestChangePassword(APITestCase):
def setUp(self) -> None:
self.password = "theonering"
self.user = User.objects.create(
username="sauron",
email="sauron@mordor.middleearth",
)
self.user.set_password(self.password)
self.user.save()
def test_login_then_change_password(self):
response = self.client.post(
reverse("auth:login"),
{
"username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get("access")
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {jwt_token}")
response = self.client.put(
reverse("auth:change_password"),
{
"new_password": "barad-dur",
"new_password2": "barad-dur",
"old_password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK
def test_login_then_change_password_with_wrong_password(self):
response = self.client.post(
reverse("auth:login"),
{
"username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get("access")
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {jwt_token}")
response = self.client.put(
reverse("auth:change_password"),
{
"new_password": "barad-dur",
"new_password2": "barad-dur",
"old_password": "incorrectoldpassword",
},
)
assert response.status_code == status.HTTP_400_BAD_REQUEST
def test_login_then_change_password_mismatch_password(self):
response = self.client.post(
reverse("auth:login"),
{
"username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get("access")
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {jwt_token}")
response = self.client.put(
reverse("auth:change_password"),
{
"new_password": "barad-dur",
"new_password2": "mountdoom",
"old_password": self.password,
},
)
assert response.status_code == status.HTTP_400_BAD_REQUEST
def test_login_then_change_password_but_its_the_same(self):
response = self.client.post(
reverse("auth:login"),
{
"username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get("access")
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {jwt_token}")
response = self.client.put(
reverse("auth:change_password"),
{
"new_password": self.password,
"new_password2": self.password,
"old_password": self.password,
},
)
assert response.status_code == status.HTTP_400_BAD_REQUEST
-101
View File
@@ -1,101 +0,0 @@
from django.contrib.auth import get_user_model
from django.shortcuts import reverse
from rest_framework import status
from rest_framework.test import APITestCase
User = get_user_model()
class TestLogin(APITestCase):
def setUp(self) -> None:
self.password = "theonering"
self.user = User.objects.create(
username="sauron",
email="sauron@mordor.middleearth",
)
self.user.set_password(self.password)
self.user.save()
def test_login(self):
response = self.client.post(
reverse("auth:login"),
{
"username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK
assert response.data.get("access") is not None
assert response.data.get("refresh") is not None
def test_login_then_verify(self):
response = self.client.post(
reverse("auth:login"),
{
"username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get("access")
response = self.client.post(
reverse("auth:verify_jwt"),
{
"token": jwt_token,
},
)
assert response.status_code == status.HTTP_200_OK
def test_login_then_refresh(self):
response = self.client.post(
reverse("auth:login"),
{
"username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get("refresh")
response = self.client.post(
reverse("auth:refresh_jwt"),
{
"refresh": jwt_token,
},
)
assert response.status_code == status.HTTP_200_OK
assert response.data.get("access") is not None
assert response.data.get("access") != jwt_token
def test_login_then_get_user_info(self):
response = self.client.post(
reverse("auth:login"),
{
"username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get("access")
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {jwt_token}")
response = self.client.get(reverse("auth:user_info"))
assert response.status_code == status.HTTP_200_OK
assert response.data.get("email") == self.user.email
def test_login_failed(self):
response = self.client.post(
reverse("auth:login"),
{
"username": self.user.username,
"password": "wrongpassword",
},
)
assert response.status_code == status.HTTP_401_UNAUTHORIZED