Skip to content

Commit b583e0c

Browse files
committed
feat: 본인 비밀번호 재설정 API 추가
1 parent 25264bf commit b583e0c

2 files changed

Lines changed: 52 additions & 1 deletion

File tree

app/admin_api/serializers/user.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,38 @@ def validate(self, attrs: UserAdminSignInSerializerData) -> UserAdminSignInSeria
5757
raise serializers.PermissionDenied("Only permissioned users can sign in using this route.")
5858

5959
return attrs
60+
61+
62+
class UserAdminPasswordChangeSerializerData(typing.TypedDict):
63+
old_password: str
64+
new_password: str
65+
new_password_confirm: str
66+
67+
68+
class UserAdminPasswordChangeSerializer(JsonSchemaSerializer, ReadOnlyModelSerializer):
69+
old_password = serializers.CharField(write_only=True, required=True)
70+
new_password = serializers.CharField(write_only=True, required=True)
71+
new_password_confirm = serializers.CharField(write_only=True, required=True)
72+
73+
class Meta:
74+
model = UserExt
75+
fields = ("old_password", "new_password", "new_password_confirm")
76+
77+
def validate(self, attrs: UserAdminPasswordChangeSerializerData) -> UserAdminPasswordChangeSerializerData:
78+
user: UserExt = self.instance
79+
if not user.check_password(attrs["old_password"]):
80+
raise serializers.ValidationError("Old password is incorrect.")
81+
82+
if attrs["old_password"] == attrs["new_password"]:
83+
raise serializers.ValidationError("New password cannot be the same as the old password.")
84+
85+
if attrs["new_password"] != attrs["new_password_confirm"]:
86+
raise serializers.ValidationError("New password and confirmation do not match.")
87+
88+
return attrs
89+
90+
def save(self, **kwargs: typing.Any) -> UserExt:
91+
user: UserExt = self.instance
92+
user.set_password(self.validated_data["new_password"])
93+
user.save(update_fields=["password"])
94+
return user

app/admin_api/views/user.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
from admin_api.serializers.user import UserAdminSerializer, UserAdminSignInSerializer
1+
from admin_api.serializers.user import (
2+
UserAdminPasswordChangeSerializer,
3+
UserAdminSerializer,
4+
UserAdminSignInSerializer,
5+
)
26
from core.const.account import INITIAL_ADMIN_PASSWORD
37
from core.const.tag import OpenAPITag
48
from core.permissions import IsSuperUser
@@ -59,3 +63,15 @@ def reset_password(self, *args: tuple, **kwargs: dict) -> response.Response:
5963
user.set_password(INITIAL_ADMIN_PASSWORD)
6064
user.save(update_fields=["password"])
6165
return response.Response(status=status.HTTP_204_NO_CONTENT)
66+
67+
@extend_schema(
68+
tags=[OpenAPITag.ADMIN_ACCOUNT],
69+
request=UserAdminPasswordChangeSerializer,
70+
responses={status.HTTP_200_OK: UserAdminSerializer},
71+
)
72+
@decorators.action(detail=False, methods=["POST"], url_path="password", permission_classes=[IsSuperUser])
73+
def change_password(self, request: request.Request, *args: tuple, **kwargs: dict) -> response.Response:
74+
serializer = UserAdminPasswordChangeSerializer(data=request.data, instance=request.user)
75+
serializer.is_valid(raise_exception=True)
76+
serializer.save()
77+
return response.Response(data=UserAdminSerializer(serializer.instance).data)

0 commit comments

Comments
 (0)