from sqlalchemy.orm import Session from app.presentation.schemas.uservideo_schema import GetVideosRequest, GetVideosResponse, DeleteVideoRequest, DeleteVideoResponse, GetVideoByOrderIdRequest, GetVideoResponse from app.shared.logger import setup_logger from app.repositories.order_repository import OrderRepository from app.repositories.user_repository import UserRepository from app.repositories.video_repository import VideoRepository from app.shared.exception.custom_exception import UserNotFoundError, OrderNotFoundError, VideoNotFoundError from app.presentation.schemas.uservideo_schema import Video from app.core.env_setting import EnvSetting logger = setup_logger(__name__) class VideoService: '''영상 서비스''' def __init__(self, db: Session): self.db = db self.user_repository = UserRepository(db) self.order_repository = OrderRepository(db) self.video_repository = VideoRepository(db) self.base_url = EnvSetting().CURRENT_BACKEND_URL def get_one_by_order_id(self, request: GetVideoByOrderIdRequest) -> GetVideoResponse: '''주문 ID로 비디오 1건 가져오기''' # 1. 사용자 존재 확인 user = self.user_repository.get_by_id(request.user_id) if not user: raise UserNotFoundError() # 2. 해당 주문이 사용자 소유인지 검증 order = self.order_repository.get_by_id(request.order_id) if not order or order.user_id != request.user_id: raise OrderNotFoundError() # 3. 해당 주문의 영상 1건 가져오기 video = self.video_repository.get_by_id(request.order_id) if not video: raise VideoNotFoundError() # 4. 스트리밍 가능한 URL 구성 (정적 URL로 가정) base_url = "http://localhost:8000/user/video/" # 또는 설정에서 불러오기 streaming_url = base_url + video.url # video.url == "sample.mp4" return GetVideoResponse( id=video.id, title=video.title, description=video.description, url=streaming_url, resolution=video.resolution, is_uploaded=video.is_uploaded, download_count=video.download_count ) def get_all_by_user_id(self, request: GetVideosRequest) -> GetVideosResponse: '''영상(Videos) 가져오기''' # 1. id 검증 user = self.user_repository.get_by_id(request.id) # ✅ request.id로 수정 if not user: raise UserNotFoundError() # 2. 업체 가져오기 orders = self.order_repository.get_all_by_user_id(request.id) # ✅ request.id로 수정 order_ids = [order.id for order in orders] videos = self.video_repository.get_all_by_order_id(order_ids) updated_videos = [ Video( id=video.id, title=video.title, description=video.description, url=self._convert_to_absolute_url(video.url) if video.url else "", is_uploaded=video.is_uploaded, download_count=video.download_count, resolution=video.resolution, status=video.status, thumbnail_url=self._convert_to_absolute_url(video.thumbnail_url) if video.thumbnail_url else "" ) for video in videos ] target_id = "4c247e94-69a2-4072-9f2e-063fa3e613bd" if str(request.id) == target_id: logger.info("임시 비디오 추가 중...") temp_video = { "id": "550e8400-e29b-41d4-a716-446655440001", "title": "스테이, 머뭄", "description": "스테이, 머뭄 영상", "url": self._convert_to_absolute_url("test-video/temp1.mp4"), "is_uploaded": False, "download_count": 0, "resolution": "1080p", "status": "완료됨", "thumbnail_url": self._convert_to_absolute_url("test-video/temp1.jpg") } updated_videos.insert(0, temp_video) test_video = { "id": "550e8400-e29b-41d4-a716-446655440000", "title": "선돌막국수", "description": "선돌막국수 영상", "url": self._convert_to_absolute_url("test-video/test.mp4"), "is_uploaded": False, "download_count": 0, "resolution": "1080p", "status": "완료됨", "thumbnail_url": self._convert_to_absolute_url("test-video/test-home.jpg") } updated_videos.insert(1, test_video) logger.info("임시 비디오 추가 완료!") return GetVideosResponse( total_count=len(updated_videos), videos=updated_videos ) def _convert_to_absolute_url(self, relative_url: str) -> str: """상대 경로를 절대 URL로 변환""" if relative_url.startswith('./'): return f"{self.base_url}/{relative_url[2:]}" elif relative_url.startswith('/'): return f"{self.base_url}{relative_url}" elif relative_url.startswith('http'): return relative_url # 이미 절대 URL인 경우 else: return f"{self.base_url}/{relative_url}" def delete_by_video_id(self, request: DeleteVideoRequest) -> DeleteVideoResponse: '''영상(Videos) 삭제하기''' # 1. id 검증 user = self.user_repository.get_by_id(request.user_id) if not user: raise UserNotFoundError() is_deleted = self.video_repository.delete_by_video_id(request.video_id) # 논리 수정 message = "삭제되었습니다." if is_deleted else "해당 ID의 영상을 찾을 수 없습니다." return DeleteVideoResponse(message=message)