Organize uploader storage and restore transfer readiness

This commit is contained in:
2026-10-14 19:15:46 +09:00
parent 69e7449ba7
commit c3573b605c
24 changed files with 966 additions and 449 deletions

View File

@@ -174,3 +174,10 @@
- 물리 파일명에 안전한 원래 확장자를 붙이며 확장자 없는 기존 파일은 앱 시작 시 DB와 함께 변경한다. 이동은 진행 중 다운로드·이미지 미리보기가 종료될 때까지 미룬다. DB 변경 실패 시 파일을 원래 경로로 돌리고, 이동 기록으로 재시작 중 경로 불일치를 복구한다. 기존 다운로드 완료 여부는 소급 추정하지 않는다. 두 폴더에 수동 삭제 감지·기존 만료 및 고아 파일 정리를 적용했다.
- API 총 112개 통과. 새 실제 파일 검사 10개로 로그인 발신→익명 수신 완료 분류·익명 발신→로그인 수신 보관함 유지·재다운로드·만료일과 체크섬 보존·권한 없는 읽기 및 발신자 읽기의 분류 제외·동시 읽기·HTTP 중도 종료·기존 확장자 이전·DB 실패 롤백·계정 삭제 실행 취소와 복원·재시작 복구·수동 삭제·자연 만료를 확인했다. 전체 빌드·타입 검사·포맷 및 셸 문법 검사도 통과했다.
- 기존 익명 파일/링크 전송 및 PC/모바일 보관함·파일 재전송·수동 원본 삭제 브라우저 검증을 통과했다. 새 운영 Docker 이미지와 격리한 임시 DB 볼륨·바인드 업로드에서 완료 폴더와 `.txt` 확장자, 재시작 후 기존 주소 다운로드, 8MiB 조각 이어 보내기, Unicode 텍스트·세션 보존, SQLite integrity, 완료 폴더의 호스트 수동 삭제를 확인했다. NAS 설정 검사도 통과했고 `docker-compose.yaml`은 변경하지 않았다. 실제 NAS 재배포는 수행하지 않았다.
## 2026-10-14 업로드 주체별 저장과 첫 전송 복구
- `completed` 분류를 업로드한 사람 기준의 `originals/user-계정ID`·`originals/guest-기기세션ID`로 변경했다. 로그인 기기 전송은 계정 폴더를 사용하되 기존 기기 업로드 권한·용량 정책은 유지한다. 기존 평면 및 completed 파일은 기록된 업로드 소유자를 기준으로 이전하며 ID·만료·원래 이름·다운로드 주소와 공유 원본을 유지한다. 원본 확장자, DB 실패 롤백과 재시작 복구, 읽기 보호, 사용자 폴더 안의 수동 삭제·만료·고아 정리를 검증했다.
- 네이티브 파일 선택창의 숨김/복귀 때 위치 재등록보다 POST가 먼저 나가던 상황을 수정 전 브라우저에서 재현했다. 위치 기반 대상은 위치 수신 확인까지 기다리며 같은 네트워크의 잠깐 끊긴 대상은 서버가 재접속 상태로 구분한다. 현재 연결을 최대 5초 기다리고 같은 요청 키로만 재시도해 첫 클릭의 초안·파일을 유지한다. 권한 없음·차단·다른 공간은 재시도하지 않는다. 연결 확인 중 버튼 안내를 적용했다. 개인정보 보호를 위해 숨김 시 좌표 제거는 유지한다.
- 로그아웃 후 메인 기기 화면을 표시한다. 사용자 폴더의 owner-info.json에는 검증된 기본 접속 IP·국가·지역·도시만 업로드 요청 시 기록하며 원문·좌표·인증 값은 기록하지 않는다. 제공되지 않은 지역과 과거 파일은 추정하지 않는다. 최대 20개·기본 7일의 기록만 유지하고 마지막 원본/대기 업로드가 사라지면 제거한다. 공개 URL·일반 보관함에서는 제공하지 않는다.
- API 114개·전체 빌드·타입 검사 통과. 실제 Chromium에서 파일 선택창 위치 복귀 대기와 단일 요청, 같은 네트워크의 재접속 중 자동 재시도·동일 키·파일 유지·모바일 수락 다운로드, 보관함 원본 재전송·수동 삭제·로그아웃 후 메인 화면을 확인했다. 운영 Docker의 사용자 폴더·확장자·호스트 파일 가시성·재시작 후 재다운로드·수동 삭제·8MiB 조각 재개·Unicode 텍스트와 인증 세션 보존·SQLite integrity도 통과했다. 실제 NAS 배포는 수행하지 않았다.