diff --git a/apps/pre-processing-service/app/api/endpoints/blog.py b/apps/pre-processing-service/app/api/endpoints/blog.py index 68a23496..d0d078e8 100644 --- a/apps/pre-processing-service/app/api/endpoints/blog.py +++ b/apps/pre-processing-service/app/api/endpoints/blog.py @@ -8,6 +8,8 @@ BloggerBlogPostAdapter, ) # 수정된 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() @@ -21,7 +23,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( @@ -35,47 +40,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, - ) - - 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 - ) + publish_service = BlogPublishService() + response_data = publish_service.publish_content(request) - 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..56ad9f06 --- /dev/null +++ b/apps/pre-processing-service/app/service/blog/blog_publish_service.py @@ -0,0 +1,42 @@ +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 + ) 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..b6bc6883 --- /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())