O2Sound_ver2_final/backend/app/services/video_service.py

143 lines
5.8 KiB
Python

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)