refactor: clean up scaffolding backend

This commit is contained in:
ramvignesh-b
2026-04-16 03:30:42 +05:30
parent e8dac65468
commit cc8e3e4e4e
16 changed files with 174 additions and 109 deletions
+19 -15
View File
@@ -8,11 +8,12 @@ from letters.serializers import LetterSerializer
class LetterView(generics.ListCreateAPIView):
serializer_class = LetterSerializer
# enforce auth guard
permission_classes = [IsAuthenticated]
def get_queryset(self):
"""return only letters of the authenticated user"""
"""
Returns the letters of the authenticated user.
"""
return Letter.objects.filter(user=self.request.user)
@@ -21,33 +22,37 @@ class LetterDetailView(generics.RetrieveUpdateDestroyAPIView):
lookup_field = "public_id"
def get_permissions(self):
"""
Allow any letter GET requests for guest access and enforce authentication for other operations.
"""
if self.request.method == "GET":
return [AllowAny()]
return [IsAuthenticated()]
def get_queryset(self):
"""
Returns the letters of the authenticated user.
Guests can only see SEALED letters.
"""
if self.request.user.is_authenticated:
# author can see all their letters (DRAFT, SEALED, etc.)
return Letter.objects.filter(user=self.request.user)
# guests can ONLY see SEALED letters
return Letter.objects.filter(status=Letter.Status.SEALED)
def put(self, request, public_id):
# upsert: create if doesn't exist, else update
"""
Upserts letters: create if doesn't exist, else update.
Validates the payload data, cleans up old images, and returns the upserted data.
"""
letter, created = Letter.objects.get_or_create(public_id=public_id, user=request.user)
# check if already sealed
if not created and letter.status == Letter.Status.SEALED:
return Response({"error": "Sealed letters cannot be modified."}, status=400)
# request.data handles both JSON and Multipart automatically in DRF
serializer = self.get_serializer(letter, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
write_serializer = self.get_serializer(letter, data=request.data, partial=True)
write_serializer.is_valid(raise_exception=True)
write_serializer.save()
# Note: image_files is a list of binary files in request.FILES
if "image_files" in request.FILES:
# Delete old image files from storage and database
for old_image in letter.images.all():
old_image.file.delete(save=False)
old_image.delete()
@@ -55,6 +60,5 @@ class LetterDetailView(generics.RetrieveUpdateDestroyAPIView):
for image_file in request.FILES.getlist("image_files"):
LetterImage.objects.create(letter=letter, file=image_file, file_name=image_file.name)
# Return fresh data including the new image URLs
serializer = self.get_serializer(letter)
return Response(serializer.data, status=201 if created else 200)
response_serializer = self.get_serializer(letter)
return Response(response_serializer.data, status=201 if created else 200)