Skip to content

Commit 57098fc

Browse files
authored
Merge pull request #21 from akirachix/feature/fixes
Authentication changes
2 parents 807bc63 + 2265a62 commit 57098fc

File tree

5 files changed

+53
-9
lines changed

5 files changed

+53
-9
lines changed

.github/workflows/postman.yml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
name: Automated API tests using Postman CLI
2+
on:
3+
push:
4+
branches:
5+
- main
6+
- develop
7+
pull_request:
8+
branches:
9+
- main
10+
- develop
11+
workflow_dispatch:
12+
jobs:
13+
automated-api-tests:
14+
runs-on: ubuntu-latest
15+
env:
16+
COL_UID: ${{ secrets.COL_UID }}
17+
ENV_UID: ${{ secrets.ENV_UID }}
18+
POSTMAN_API_KEY: ${{ secrets.POSTMAN_API_KEY }}
19+
20+
steps:
21+
- uses: actions/checkout@v4
22+
- name: Install Postman CLI
23+
run: |
24+
curl -o- "https://dl-cli.pstmn.io/install/linux64.sh" | sh
25+
- name: Login to Postman CLI
26+
run: postman login --with-api-key "$POSTMAN_API_KEY"
27+
- name: Run API tests
28+
run: |
29+
mkdir -p reports
30+
postman collection run "$COL_UID" -e "$ENV_UID" \
31+
--reporters cli,junit \
32+
--reporter-junit-export reports/junit.xml
33+
- name: Upload JUnit report
34+
uses: actions/upload-artifact@v4
35+
with:
36+
name: postman-junit
37+
path: reports/junit.xml

api/serializers.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,7 @@ def validate(self, data):
166166
class SetPasswordSerializer(serializers.Serializer):
167167
email = serializers.EmailField()
168168
password = serializers.CharField(write_only=True, min_length=8)
169-
confirm_password = serializers.CharField(write_only=True, min_length=8)
170169
def validate(self, data):
171-
if data["password"] != data["confirm_password"]:
172-
raise serializers.ValidationError("Passwords do not match")
173170
try:
174171
user = User.objects.get(email=data["email"])
175172
except User.DoesNotExist:
@@ -182,6 +179,7 @@ def save(self, **kwargs):
182179
user.set_password(self.validated_data["password"])
183180
user.save()
184181
return user
182+
185183
class ForgotPasswordSerializer(serializers.Serializer):
186184
email = serializers.EmailField()
187185
def validate_email(self, value):
@@ -192,6 +190,7 @@ def validate_email(self, value):
192190
otp = random.randint(1000, 9999)
193191
cache.set(f"otp_{user.id}", otp, timeout=600)
194192
return value
193+
195194
class VerifyCodeSerializer(serializers.Serializer):
196195
email = serializers.EmailField()
197196
otp = serializers.CharField(max_length=4)
@@ -205,13 +204,11 @@ def validate(self, data):
205204
raise serializers.ValidationError("Invalid or expired OTP")
206205
cache.set(f"otp_verified_{user.id}", True, timeout=600)
207206
return data
207+
208208
class ResetPasswordSerializer(serializers.Serializer):
209209
email = serializers.EmailField()
210210
password = serializers.CharField(write_only=True, min_length=8)
211-
confirm_password = serializers.CharField(write_only=True, min_length=8)
212211
def validate(self, data):
213-
if data["password"] != data["confirm_password"]:
214-
raise serializers.ValidationError("Passwords do not match")
215212
try:
216213
user = User.objects.get(email=data["email"])
217214
except User.DoesNotExist:
@@ -227,6 +224,7 @@ def save(self, **kwargs):
227224
cache.delete(f"otp_{user.id}")
228225
cache.delete(f"otp_verified_{user.id}")
229226
return user
227+
230228
class ThresholdSerializer(serializers.ModelSerializer):
231229
class Meta:
232230
model = MCU

api/views.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,12 @@ def post(self, request, *args, **kwargs):
8585
serializer.is_valid(raise_exception=True)
8686
serializer.save()
8787
return Response(serializer.data, status=status.HTTP_201_CREATED)
88+
8889
class UserDetailView(generics.RetrieveUpdateDestroyAPIView):
8990
queryset = User.objects.all()
9091
serializer_class = UserSerializer
9192
permission_classes = [AllowAny]
93+
9294
class SetPasswordView(generics.GenericAPIView):
9395
serializer_class = SetPasswordSerializer
9496
permission_classes = [AllowAny]
@@ -97,6 +99,7 @@ def post(self, request, *args, **kwargs):
9799
serializer.is_valid(raise_exception=True)
98100
serializer.save()
99101
return Response({"message": "Password set successfully."})
102+
100103
class SignupView(generics.CreateAPIView):
101104
serializer_class = SignupSerializer
102105
permission_classes = [AllowAny]
@@ -105,6 +108,7 @@ def create(self, request, *args, **kwargs):
105108
serializer.is_valid(raise_exception=True)
106109
user = serializer.save()
107110
return Response({"message": "Registration successful."}, status=status.HTTP_201_CREATED)
111+
108112
class LoginView(generics.GenericAPIView):
109113
serializer_class = LoginSerializer
110114
permission_classes = [AllowAny]
@@ -113,9 +117,12 @@ def post(self, request, *args, **kwargs):
113117
serializer.is_valid(raise_exception=True)
114118
user = serializer.validated_data["user"]
115119
access = AccessToken.for_user(user)
120+
user_data = UserSerializer(user).data
116121
return Response({
117-
"token": str(access)
122+
"token": str(access),
123+
"user": user_data
118124
})
125+
119126
class ForgotPasswordView(generics.GenericAPIView):
120127
serializer_class = ForgotPasswordSerializer
121128
permission_classes = [AllowAny]
@@ -134,13 +141,15 @@ def post(self, request, *args, **kwargs):
134141
fail_silently=False,
135142
)
136143
return Response({"message": "OTP sent to your email"})
144+
137145
class VerifyCodeView(generics.GenericAPIView):
138146
serializer_class = VerifyCodeSerializer
139147
permission_classes = [AllowAny]
140148
def post(self, request, *args, **kwargs):
141149
serializer = self.get_serializer(data=request.data)
142150
serializer.is_valid(raise_exception=True)
143151
return Response({"message": "OTP verified successfully"})
152+
144153
class ResetPasswordView(generics.GenericAPIView):
145154
serializer_class = ResetPasswordSerializer
146155
permission_classes = [AllowAny]

db.sqlite3

0 Bytes
Binary file not shown.

kukukonnect/settings.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,10 @@
145145
'DESCRIPTION': 'API documentation for the KukuKonnect project',
146146
'VERSION': '1.0.0',
147147
'SERVE_INCLUDE_SCHEMA': True,
148-
'SWAGGER_UI_DIST': 'SIDECAR', # shorthand to use the sidecar instead
148+
'SWAGGER_UI_DIST': 'SIDECAR',
149149
'SWAGGER_UI_FAVICON_HREF': 'SIDECAR',
150150
'REDOC_DIST': 'SIDECAR',
151-
# OTHER SETTINGS
151+
152152

153153

154154
}

0 commit comments

Comments
 (0)