From b9525379fb04f9d9e14566cc9c65a3618f8b66e6 Mon Sep 17 00:00:00 2001 From: thkim7 Date: Wed, 17 Sep 2025 12:54:59 +0900 Subject: [PATCH 1/3] feat: blog rag create endpoint --- apps/pre-processing-service/app/api/endpoints/blog.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/pre-processing-service/app/api/endpoints/blog.py b/apps/pre-processing-service/app/api/endpoints/blog.py index 68a23496..79452e4a 100644 --- a/apps/pre-processing-service/app/api/endpoints/blog.py +++ b/apps/pre-processing-service/app/api/endpoints/blog.py @@ -8,6 +8,7 @@ BloggerBlogPostAdapter, ) # 수정된 import from app.utils.response import Response +from app.service.blog.blog_create_service import BlogContentService router = APIRouter() @@ -21,8 +22,10 @@ async def rag_create(request: RequestBlogCreate): """ RAG 기반 블로그 콘텐츠 생성 """ - return {"message": "blog API"} + blog_service = BlogContentService() + response_data = blog_service.generate_blog_content(request) + return Response.ok(response_data) @router.post( "/publish", From bb0eb2d5ddd4ee0935e2f2dd6e452364882ddd39 Mon Sep 17 00:00:00 2001 From: thkim7 Date: Wed, 17 Sep 2025 14:00:39 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor:=20blog=20service=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=201.=20endpoint=EC=97=90=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20if-else=20=EC=84=9C=EB=B9=84=EC=8A=A4?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99=202.=20=ED=98=84=EC=9E=AC=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=203=EA=B0=9C=EC=9D=98=20=EB=B8=94=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EB=AA=A8=EB=91=90=20=ED=8F=AC=EC=8A=A4=ED=8C=85=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=EC=9D=B4=20=EB=8F=99=EC=9D=BC=ED=95=B4?= =?UTF-8?q?=EC=84=9C=20factory=20method=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/api/endpoints/blog.py | 47 ++----------------- .../app/service/blog/blog_publish_service.py | 44 +++++++++++++++++ .../app/service/blog/blog_service_factory.py | 38 +++++++++++++++ 3 files changed, 86 insertions(+), 43 deletions(-) create mode 100644 apps/pre-processing-service/app/service/blog/blog_publish_service.py create mode 100644 apps/pre-processing-service/app/service/blog/blog_service_factory.py diff --git a/apps/pre-processing-service/app/api/endpoints/blog.py b/apps/pre-processing-service/app/api/endpoints/blog.py index 79452e4a..c4a206ff 100644 --- a/apps/pre-processing-service/app/api/endpoints/blog.py +++ b/apps/pre-processing-service/app/api/endpoints/blog.py @@ -9,6 +9,7 @@ ) # 수정된 import from app.utils.response import Response from app.service.blog.blog_create_service import BlogContentService +from app.service.blog.blog_publish_service import BlogPublishService router = APIRouter() @@ -38,47 +39,7 @@ async def publish(request: RequestBlogPublish): 네이버 블로그와 티스토리 블로그를 지원하며, 현재는 생성된 콘텐츠가 아닌 임의의 제목, 내용, 태그를 배포합니다. """ - if request.tag == "naver": - naver_service = NaverBlogPostService() - response_data = naver_service.post_content( - title=request.post_title, - content=request.post_content, - tags=request.post_tags, - ) + publish_service = BlogPublishService() + response_data = publish_service.publish_content(request) - if not response_data: - raise CustomException( - "네이버 블로그 포스팅에 실패했습니다.", status_code=500 - ) - - return Response.ok(response_data) - - elif request.tag == "tistory": - tistory_service = TistoryBlogPostService() - response_data = tistory_service.post_content( - title=request.post_title, - content=request.post_content, - tags=request.post_tags, - ) - - if not response_data: - raise CustomException( - "티스토리 블로그 포스팅에 실패했습니다.", status_code=500 - ) - - return Response.ok(response_data) - - elif request.tag == "blogger": - blogger_service = BloggerBlogPostAdapter() # 수정: Adapter 사용 - response_data = blogger_service.post_content( - title=request.post_title, - content=request.post_content, - tags=request.post_tags, - ) - - if not response_data: - raise CustomException( - "블로거 블로그 포스팅에 실패했습니다.", status_code=500 - ) - - return Response.ok(response_data) + return Response.ok(response_data) diff --git a/apps/pre-processing-service/app/service/blog/blog_publish_service.py b/apps/pre-processing-service/app/service/blog/blog_publish_service.py new file mode 100644 index 00000000..ee2831a4 --- /dev/null +++ b/apps/pre-processing-service/app/service/blog/blog_publish_service.py @@ -0,0 +1,44 @@ +from typing import Dict +from app.errors.CustomException import CustomException +from app.model.schemas import RequestBlogPublish +from app.service.blog.blog_service_factory import BlogServiceFactory + + +class BlogPublishService: + """블로그 발행을 담당하는 서비스 클래스""" + + def __init__(self): + self.factory = BlogServiceFactory() + + def publish_content(self, request: RequestBlogPublish) -> Dict: + """ + 생성된 블로그 콘텐츠를 배포합니다. + """ + try: + # 팩토리를 통해 적절한 서비스 생성 + blog_service = self.factory.create_service(request.tag) + + # 공통 인터페이스로 포스팅 실행 + response_data = blog_service.post_content( + title=request.post_title, + content=request.post_content, + tags=request.post_tags, + ) + + if not response_data: + raise CustomException( + f"{request.tag} 블로그 포스팅에 실패했습니다.", + status_code=500 + ) + + return response_data + + except CustomException: + # 이미 처리된 예외는 그대로 전달 + raise + except Exception as e: + # 예상치 못한 예외 처리 + raise CustomException( + f"블로그 포스팅 중 오류가 발생했습니다: {str(e)}", + status_code=500 + ) \ No newline at end of file diff --git a/apps/pre-processing-service/app/service/blog/blog_service_factory.py b/apps/pre-processing-service/app/service/blog/blog_service_factory.py new file mode 100644 index 00000000..087b24a4 --- /dev/null +++ b/apps/pre-processing-service/app/service/blog/blog_service_factory.py @@ -0,0 +1,38 @@ +from typing import Dict, Type +from app.service.blog.base_blog_post_service import BaseBlogPostService +from app.service.blog.naver_blog_post_service import NaverBlogPostService +from app.service.blog.tistory_blog_post_service import TistoryBlogPostService +from app.service.blog.blogger_blog_post_adapter import BloggerBlogPostAdapter +from app.errors.CustomException import CustomException + + +class BlogServiceFactory: + """블로그 서비스 객체 생성을 담당하는 팩토리""" + + # 서비스 타입별 클래스 매핑 + _services: Dict[str, Type[BaseBlogPostService]] = { + "naver": NaverBlogPostService, + "tistory": TistoryBlogPostService, + "blogger": BloggerBlogPostAdapter, + } + + @classmethod + def create_service(cls, platform: str) -> BaseBlogPostService: + """ + 플랫폼에 따른 블로그 서비스 인스턴스 생성 + """ + service_class = cls._services.get(platform.lower()) + + if not service_class: + raise CustomException( + f"지원하지 않는 플랫폼입니다: {platform}. " + f"지원 플랫폼: {list(cls._services.keys())}", + status_code=400 + ) + + return service_class() + + @classmethod + def get_supported_platforms(cls) -> list: + """지원하는 플랫폼 목록 반환""" + return list(cls._services.keys()) From 67209027dfee83f83f5c999da108ad142d228dc2 Mon Sep 17 00:00:00 2001 From: thkim7 Date: Wed, 17 Sep 2025 14:05:40 +0900 Subject: [PATCH 3/3] chore: poetry run black . --- apps/pre-processing-service/app/api/endpoints/blog.py | 1 + .../app/service/blog/blog_publish_service.py | 8 +++----- .../app/service/blog/blog_service_factory.py | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/pre-processing-service/app/api/endpoints/blog.py b/apps/pre-processing-service/app/api/endpoints/blog.py index c4a206ff..d0d078e8 100644 --- a/apps/pre-processing-service/app/api/endpoints/blog.py +++ b/apps/pre-processing-service/app/api/endpoints/blog.py @@ -28,6 +28,7 @@ async def rag_create(request: RequestBlogCreate): return Response.ok(response_data) + @router.post( "/publish", response_model=ResponseBlogPublish, diff --git a/apps/pre-processing-service/app/service/blog/blog_publish_service.py b/apps/pre-processing-service/app/service/blog/blog_publish_service.py index ee2831a4..56ad9f06 100644 --- a/apps/pre-processing-service/app/service/blog/blog_publish_service.py +++ b/apps/pre-processing-service/app/service/blog/blog_publish_service.py @@ -27,8 +27,7 @@ def publish_content(self, request: RequestBlogPublish) -> Dict: if not response_data: raise CustomException( - f"{request.tag} 블로그 포스팅에 실패했습니다.", - status_code=500 + f"{request.tag} 블로그 포스팅에 실패했습니다.", status_code=500 ) return response_data @@ -39,6 +38,5 @@ def publish_content(self, request: RequestBlogPublish) -> Dict: except Exception as e: # 예상치 못한 예외 처리 raise CustomException( - f"블로그 포스팅 중 오류가 발생했습니다: {str(e)}", - status_code=500 - ) \ No newline at end of file + f"블로그 포스팅 중 오류가 발생했습니다: {str(e)}", status_code=500 + ) diff --git a/apps/pre-processing-service/app/service/blog/blog_service_factory.py b/apps/pre-processing-service/app/service/blog/blog_service_factory.py index 087b24a4..b6bc6883 100644 --- a/apps/pre-processing-service/app/service/blog/blog_service_factory.py +++ b/apps/pre-processing-service/app/service/blog/blog_service_factory.py @@ -27,7 +27,7 @@ def create_service(cls, platform: str) -> BaseBlogPostService: raise CustomException( f"지원하지 않는 플랫폼입니다: {platform}. " f"지원 플랫폼: {list(cls._services.keys())}", - status_code=400 + status_code=400, ) return service_class()