from rest_framework import serializers from apps.annotations.models import Bookmark, Note class BookmarkSerializer(serializers.ModelSerializer): """Serialize Bookmark data with full details.""" book_title = serializers.CharField(source="book.title", read_only=True) class Meta: model = Bookmark fields = [ "id", "book", "book_title", "page", "location_text", "created_at", "updated_at", ] read_only_fields = ["id", "created_at", "updated_at", "book_title"] def validate_page(self, value: int) -> int: if value < 1: raise serializers.ValidationError("Page must be a positive integer.") return value class BookmarkCreateSerializer(serializers.ModelSerializer): """Serializer used for creating bookmarks. Sets user from request context.""" class Meta: model = Bookmark fields = ["book", "page", "location_text"] def validate_page(self, value: int) -> int: if value < 1: raise serializers.ValidationError("Page must be a positive integer.") return value def validate(self, attrs): user = self.context["request"].user if Bookmark.objects.filter( user=user, book=attrs["book"], page=attrs["page"] ).exists(): raise serializers.ValidationError( {"page": "A bookmark already exists at this page for this book."} ) return attrs def create(self, validated_data): validated_data["user"] = self.context["request"].user return super().create(validated_data) class NoteSerializer(serializers.ModelSerializer): """Serialize Note data with full details.""" book_title = serializers.CharField(source="book.title", read_only=True) class Meta: model = Note fields = [ "id", "book", "book_title", "page", "location_text", "content", "created_at", "updated_at", ] read_only_fields = ["id", "created_at", "updated_at", "book_title"] def validate_page(self, value: int) -> int: if value < 1: raise serializers.ValidationError("Page must be a positive integer.") return value def validate_content(self, value: str) -> str: stripped = value.strip() if not stripped: raise serializers.ValidationError("Note content cannot be empty.") return stripped class NoteCreateSerializer(serializers.ModelSerializer): """Serializer used for creating notes. Sets user from request context.""" class Meta: model = Note fields = ["book", "page", "location_text", "content"] def validate_page(self, value: int) -> int: if value < 1: raise serializers.ValidationError("Page must be a positive integer.") return value def validate_content(self, value: str) -> str: stripped = value.strip() if not stripped: raise serializers.ValidationError("Note content cannot be empty.") return stripped def create(self, validated_data): validated_data["user"] = self.context["request"].user return super().create(validated_data)