749줄 한 파일을 셋으로 나눔 (동작 불변, 순수 이동). - `B03_FileInput_Router_Temp.py` 478줄 — 묶음 생성·목록·삭제·파일 업로드·프로젝트 연결 - `B03_FileInput_Router_Temp_Chunks.py` 294줄 — 세션·조각·진행·마무리 (prefix 없는 APIRouter 를 본체가 `include_router` 로 붙여 `/api/temp-uploads/...` 경로 불변) - `B03_FileInput_Router_Temp_Support.py` 46줄 — 조각 수·묶음 폴더·상태 갱신 (순환 방지) 검증: 라우트 10개(temp 9 + attach 1) 경로·메서드 동일, 공용 브라우저에서 실제 청크 흐름 create 200 → upload-sessions 200 → chunks 200 → finalize 200 → delete 200, ruff check 통과, tmp/tests 378 passed Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
47 lines
1.7 KiB
Python
47 lines
1.7 KiB
Python
"""임시 보관함 라우터 보조 — 조각 수 계산·묶음 폴더 확인·상태 갱신.
|
|
|
|
라우터가 700줄을 넘어 떼어냈다(2026-09-04). 본체와 청크 모듈이 함께 쓰는 것만 둔다.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
from B03_FileInput.B03_FileInput_Repository_Temp import (
|
|
get_temp_batch,
|
|
get_temp_batch_file_types,
|
|
is_batch_required_complete,
|
|
mark_temp_batch_completed,
|
|
mark_temp_batch_incomplete,
|
|
)
|
|
from common_util.common_util_storage import (
|
|
resolve_temp_batch_path,
|
|
)
|
|
|
|
_POINT_CLOUD_FILE_TYPES = frozenset({"las", "laz"})
|
|
|
|
|
|
def _total_chunks(size_bytes: int, chunk_size_bytes: int) -> int:
|
|
return max(1, (size_bytes + chunk_size_bytes - 1) // chunk_size_bytes)
|
|
|
|
|
|
def _iso(value: Any) -> str | None:
|
|
return value.isoformat() if value is not None and hasattr(value, "isoformat") else None
|
|
|
|
|
|
async def _batch_root(connection: Any, *, batch_id: str, user_id: int) -> Path:
|
|
"""소유권을 확인하고 묶음 폴더를 돌려준다."""
|
|
await get_temp_batch(connection, batch_id=batch_id, user_id=user_id)
|
|
return Path(resolve_temp_batch_path(user_id, batch_id))
|
|
|
|
|
|
async def _refresh_batch_status(connection: Any, *, batch_id: str) -> bool:
|
|
"""필수 파일 충족 여부에 맞춰 상태를 맞춘다. 완료 여부를 돌려준다."""
|
|
file_types = await get_temp_batch_file_types(connection, batch_id=batch_id)
|
|
complete = is_batch_required_complete(file_types)
|
|
if complete:
|
|
await mark_temp_batch_completed(connection, batch_id=batch_id)
|
|
else:
|
|
# 파일을 지워 필수 조건이 깨진 경우 — 프로젝트 연결 대상에서 빠져야 한다.
|
|
await mark_temp_batch_incomplete(connection, batch_id=batch_id)
|
|
return complete
|