기존에 만든 SynopsisAPIView를 삭제하고 해당 기능을 BookListAPIView의 post method로 조정
Synopsis는 책의 뼈대가 되는 배경과 소설책의 제목을 반환하기 때문에 책의 제목을 저장하는 Book table에 넣는 것이 올바르다고 판단하여 BookListAPIView의 API endpoint를 사용
class BookListAPIView(ListAPIView):
# 전체 목록 조회
queryset = Book.objects.all().order_by("-created_at")
serializer_class = BookSerializer
# 새 소설 책 생성
def post(self, request):
user_prompt = request.data.get("prompt")
if not user_prompt:
return Response(
{"error": "Missing prompt"}, status=status.HTTP_400_BAD_REQUEST
)
content = synopsis_generator(user_prompt) # ai로 title, synopsis 생성
title = content["title"]
synopsis = content["synopsis"]
serializer = BookSerializer(
data={"title": title, "user_id": request.user.pk}
) # db에 title, user_id 저장
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(
data={'book_id':serializer.data['id'],"content": synopsis}, # FE에 content 응답
status=status.HTTP_201_CREATED,
)
소설책의 내용을 생성하는 SummaryAPIView는 생성하는 소설의 내용이 Book table의 소설과 같은 book_id를 가져야하기 때문에 이를 url에서 받는 BookDetailView의 post method에 구현하는 것으로 조정
def post(self, request, book_id):
summary = request.data.get("summary")
if not summary:
return Response(
{"error": "Missing summary prompt"}, status=status.HTTP_400_BAD_REQUEST
)
result = summary_generator(summary)
book=get_object_or_404(Book, id=book_id)
serializer = ChapterSerializer(
data={"content": result["final_summary"], "book_id": book.pk}
)
if serializer.is_valid(raise_exception=True):
serializer.save()
result['book_id']=book.pk
return Response(data=result, status=status.HTTP_201_CREATED)