mirror of
https://github.com/ramvignesh-b/pi-ku.git
synced 2026-05-04 08:56:52 +00:00
feat: implement encrypted image support for letters with backend storage
This commit is contained in:
@@ -1,9 +1,20 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
from letters.models import LetterImage
|
||||||
|
|
||||||
from .models import Letter
|
from .models import Letter
|
||||||
|
|
||||||
|
|
||||||
|
class LetterImageSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = LetterImage
|
||||||
|
fields = ["public_id", "file", "file_name"]
|
||||||
|
read_only_fields = ["public_id"]
|
||||||
|
|
||||||
|
|
||||||
class LetterSerializer(serializers.ModelSerializer):
|
class LetterSerializer(serializers.ModelSerializer):
|
||||||
|
images = LetterImageSerializer(many=True, read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Letter
|
model = Letter
|
||||||
fields = [
|
fields = [
|
||||||
@@ -17,13 +28,10 @@ class LetterSerializer(serializers.ModelSerializer):
|
|||||||
"sealed_at",
|
"sealed_at",
|
||||||
"created_at",
|
"created_at",
|
||||||
"updated_at",
|
"updated_at",
|
||||||
|
"images",
|
||||||
] # user to be fetched from request
|
] # user to be fetched from request
|
||||||
read_only_fields = ["public_id", "created_at", "updated_at"]
|
read_only_fields = ["public_id", "created_at", "updated_at"]
|
||||||
|
|
||||||
def create(self, validated_data):
|
|
||||||
user = self.context["request"].user # get user from access token
|
|
||||||
return Letter.objects.create(user=user, **validated_data)
|
|
||||||
|
|
||||||
def validate(self, data):
|
def validate(self, data):
|
||||||
if (data.get("encrypted_content") or data.get("encrypted_metadata")) and not data.get("encrypted_dek"):
|
if (data.get("encrypted_content") or data.get("encrypted_metadata")) and not data.get("encrypted_dek"):
|
||||||
raise serializers.ValidationError(
|
raise serializers.ValidationError(
|
||||||
|
|||||||
@@ -79,6 +79,29 @@ class LetterAPITest(APITestCase):
|
|||||||
["encrypted_dek is required when encrypted_content and encrypted_metadata are present"],
|
["encrypted_dek is required when encrypted_content and encrypted_metadata are present"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_create_letter_with_images_api(self):
|
||||||
|
"""Test API can create a letter and attach encrypted images in one request"""
|
||||||
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||||
|
|
||||||
|
# Simulate local encryption files
|
||||||
|
image1 = SimpleUploadedFile("enc_img1.bin", b"encrypted_bytes_1", content_type="application/octet-stream")
|
||||||
|
image2 = SimpleUploadedFile("enc_img2.bin", b"encrypted_bytes_2", content_type="application/octet-stream")
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
"type": "SENT",
|
||||||
|
"status": "SEALED",
|
||||||
|
"encrypted_content": "enc_content==",
|
||||||
|
"encrypted_metadata": "enc_metadata==",
|
||||||
|
"encrypted_dek": "enc_dek==",
|
||||||
|
"image_files": [image1, image2],
|
||||||
|
}
|
||||||
|
|
||||||
|
response = self.client.post(self.url, payload, format="multipart")
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 201)
|
||||||
|
self.assertEqual(Letter.objects.count(), 1)
|
||||||
|
self.assertEqual(LetterImage.objects.count(), 2)
|
||||||
|
|
||||||
|
|
||||||
class LetterImageModelTest(TestCase):
|
class LetterImageModelTest(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from rest_framework import generics
|
from rest_framework import generics
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
|
||||||
from letters.models import Letter
|
from letters.models import Letter, LetterImage
|
||||||
from letters.serializers import LetterSerializer
|
from letters.serializers import LetterSerializer
|
||||||
|
|
||||||
|
|
||||||
@@ -13,3 +13,9 @@ class LetterView(generics.ListCreateAPIView):
|
|||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
"""return only letters of the authenticated user"""
|
"""return only letters of the authenticated user"""
|
||||||
return Letter.objects.filter(user=self.request.user)
|
return Letter.objects.filter(user=self.request.user)
|
||||||
|
|
||||||
|
def perform_create(self, serializer):
|
||||||
|
letter = serializer.save(user=self.request.user)
|
||||||
|
image_files = self.request.FILES.getlist("image_files")
|
||||||
|
for image_file in image_files:
|
||||||
|
LetterImage.objects.create(letter=letter, file=image_file, file_name=image_file.name)
|
||||||
|
|||||||
Reference in New Issue
Block a user