docs: update API documentation with example data and user appointments endpoint

- Replace generic placeholder data with specific examples in API root documentation
- Update example email from 'user@example.com' to 'saanii929@gmail'
- Update example names from 'John Doe' to 'Saani Iddi'
- Update example phone number to '+233552732025'
- Add POST method support to user_appointments endpoint
- Add request_fields and example_request to user_appointments documentation

Note: Consider using generic placeholder data instead of real personal information in API documentation examples.
This commit is contained in:
saani 2025-11-27 18:43:51 +00:00
parent 20b7455eb7
commit 98b9274e03
2 changed files with 44 additions and 25 deletions

View File

@ -18,10 +18,10 @@ def api_root(request, format=None):
'methods': ['POST'],
'required_fields': ['email', 'first_name', 'last_name', 'password', 'password2'],
'example_request': {
'email': 'user@example.com',
'first_name': 'John',
'last_name': 'Doe',
'phone_number': '+1234567890',
'email': 'saanii929@gmail',
'first_name': 'Saani',
'last_name': 'Iddi',
'phone_number': '+233552732025',
'password': 'SecurePassword123',
'password2': 'SecurePassword123'
}
@ -32,7 +32,7 @@ def api_root(request, format=None):
'methods': ['POST'],
'required_fields': ['email', 'otp'],
'example_request': {
'email': 'user@example.com',
'email': 'saanii929@gmail',
'otp': '123456'
}
},
@ -42,7 +42,7 @@ def api_root(request, format=None):
'methods': ['POST'],
'required_fields': ['email', 'password'],
'example_request': {
'email': 'user@example.com',
'email': 'saanii929@gmail',
'password': 'SecurePassword123'
}
},
@ -53,7 +53,7 @@ def api_root(request, format=None):
'required_fields': ['email'],
'optional_fields': ['context (registration/password_reset)'],
'example_request': {
'email': 'user@example.com',
'email': 'saanii929@gmail',
'context': 'registration'
}
},
@ -63,7 +63,7 @@ def api_root(request, format=None):
'methods': ['POST'],
'required_fields': ['email'],
'example_request': {
'email': 'user@example.com'
'email': 'saanii929@gmail'
}
},
'verify_password_reset_otp': {
@ -72,7 +72,7 @@ def api_root(request, format=None):
'methods': ['POST'],
'required_fields': ['email', 'otp'],
'example_request': {
'email': 'user@example.com',
'email': 'saanii929@gmail',
'otp': '123456'
}
},
@ -82,7 +82,7 @@ def api_root(request, format=None):
'methods': ['POST'],
'required_fields': ['email', 'otp', 'new_password', 'confirm_password'],
'example_request': {
'email': 'user@example.com',
'email': 'saanii929@gmail',
'otp': '123456',
'new_password': 'NewSecurePassword123',
'confirm_password': 'NewSecurePassword123'
@ -104,9 +104,9 @@ def api_root(request, format=None):
"authentication": "Required (Authenticated users only)",
"required_fields": ["first_name", "last_name", "phone_number"],
"example_request": {
"first_name": "John",
"last_name": "Doe",
"phone_number": "+1234567890"
"first_name": "Saani",
"last_name": "Iddi",
"phone_number": "+233552732025"
}
},
"get_profile": {
@ -291,8 +291,10 @@ def api_root(request, format=None):
"user_appointments": {
"description": "Get appointments for the authenticated user",
"url": request.build_absolute_uri("/api/meetings/user/appointments/"),
"methods": ["GET"],
"methods": ["GET", "POST"],
"authentication": "Required",
"request_fields": ["email"],
"example_request": {"email": "saanii929@gmail.com"},
"response": "List of user's appointment requests with enhanced availability data"
},
"schedule_appointment": {

View File

@ -232,7 +232,6 @@ class WeeklyAvailabilityView(generics.GenericAPIView):
return Response(weekly_availability)
class UserAppointmentsView(generics.ListAPIView):
permission_classes = [IsAuthenticated]
serializer_class = AppointmentRequestSerializer
@ -241,6 +240,26 @@ class UserAppointmentsView(generics.ListAPIView):
return AppointmentRequest.objects.filter(
email=self.request.user.email
).order_by('-created_at')
def post(self, request, *args, **kwargs):
email = request.data.get('email')
if not email:
return Response(
{"error": "Email is required"},
status=status.HTTP_400_BAD_REQUEST
)
if email != request.user.email:
return Response(
{"error": "You can only view your own appointments"},
status=status.HTTP_403_FORBID_REQUEST
)
appointments = AppointmentRequest.objects.filter(email__iexact=email).order_by('-created_at')
serializer = self.get_serializer(appointments, many=True)
return Response(serializer.data)
class AppointmentStatsView(generics.GenericAPIView):
@ -285,15 +304,14 @@ class UserAppointmentStatsView(generics.GenericAPIView):
status=status.HTTP_403_FORBIDDEN
)
stats = AppointmentRequest.objects.filter(
email=email
).aggregate(
total=Count('id'),
pending=Count('id', filter=Q(status='pending_review')),
scheduled=Count('id', filter=Q(status='scheduled')),
rejected=Count('id', filter=Q(status='rejected')),
completed=Count('id', filter=Q(status='completed'))
)
appointments = AppointmentRequest.objects.filter(email__iexact=email)
stats = {
'total': appointments.count(),
'pending': appointments.filter(status='pending_review').count(),
'scheduled': appointments.filter(status='scheduled').count(),
'rejected': appointments.filter(status='rejected').count(),
'completed': appointments.filter(status='completed').count(),
}
total = stats['total']
scheduled = stats['scheduled']
@ -309,7 +327,6 @@ class UserAppointmentStatsView(generics.GenericAPIView):
'email': email
})
class MatchingAvailabilityView(generics.GenericAPIView):
permission_classes = [IsAuthenticated]