app/sattie_api.pyapp/core.pyapp/ui/index.html, app/ui/app.js, app/ui/styles.css비범위:
app/sattie_api.pyapp/core.pyapp/ui/*mock_store/randommock_store/osmCATALOG: 랜덤 기본 샘플 메타 목록OSM_SIM_CATALOG: request_id -> [ImageItem]OSM_SIM_SOURCE: request_id -> source metadataCATALOG_load_catalog()로 mock_store/random/catalog.json을 읽어 초기화한다./images 목록/상세 조회의 기준 데이터다./images/generate 단건 생성 결과는 CATALOG에 자동 추가되지 않는다(생성 파일만 저장).OSM_SIM_CATALOGrequest_id, 값은 해당 요청에서 생성된 ImageItem 배열(L0~L4 또는 단일 레벨)이다./osm/images, /osm/images/items, /osm/images/{request_id} 조회의 기준 데이터다.OSM_SIM_SOURCEprovider, tile_url, tile_x, tile_y, zoom, lat, lon, tile_sha256, tile_size_bytes.source 블록으로 노출되어, 생성 근거(어느 타일/좌표 기반인지) 추적에 사용된다.OSM_SIM_CATALOG, OSM_SIM_SOURCE)은 런타임 상태이며, 서버 재시작 시 메모리는 초기화된다._ensure_osm_catalog_loaded()가 mock_store/osm를 스캔해 요청을 복원하므로 재기동 후에도 상당수 요청 조회가 가능하다.404 Generated file missing이 발생할 수 있다._load_catalog()로 랜덤 카탈로그 로딩_ensure_osm_catalog_loaded()로 디스크의 OSM 결과 복원ImageItem (app/core.py)image_id: 이미지 식별자sensor: eo | sarlevel: L0~L4fmt: ceos | geotiff | tiled-geotiff | index-map | classified-rastersatellite: 위성명 또는 OSM-simulatedacquired_at_utc: UTC 시각 텍스트file_name: 저장 파일명file_size_bytes: 파일 크기path: 파일 절대경로summary: 요약 설명ceos -> .bin.tifSTORE_DIR: mock_storeRANDOM_STORE_DIR: mock_store/randomOSM_STORE_DIR: mock_store/osmRANDOM_GENERATED_DIR: mock_store/random/generatedCATALOG_PATH: mock_store/random/catalog.json/images에 노출/images/generate 결과는 generated/ 하위에 저장되며 CATALOG에 자동 편입되지 않음mock_store/osm/{request_id}GET /healthGET / (루트 안내)GET /ui (웹 UI)app.mount("/ui/static", ...)로 JS/CSS 제공GET /images: 카탈로그 목록 + 필터(sensor/level/fmt/q)GET /images/{image_id}: 상세 메타GET /images/{image_id}/download: 원본 다운로드GET /images/{image_id}/content: 미리보기 콘텐츠(TIFF는 BMP 변환)POST /images/generate: 단건 파일 즉시 생성/응답(attachment)POST /osm/images/generate: 단건 파일 즉시 생성/응답(attachment)lat, lon, zoom, sensor, level, fmtX-OSM-Request-ID 포함POST /osm/images/generate-all: 일괄 생성(JSON 메타){request_id, source, items} 응답GET /osm/images: 요청 단위 목록 + 최신 요청GET /osm/images/items: 아이템 평탄 목록 + 필터(sensor/level/fmt/q/request_id)GET /osm/images/{request_id}: 요청 상세GET /osm/images/{request_id}/{level}/download: 레벨 파일 다운로드GET /osm/images/{request_id}/{level}/content: 미리보기 콘텐츠(TIFF->BMP)GET /admin/mock-store/infoPOST /admin/mock-store/rebuildPOST /admin/mock-store/deleteGET /admin/osm-store/infoPOST /admin/osm-store/delete/images/generate)sensor/level/fmt)_validate_generate_combo().bin 또는 .tif 생성FileResponse로 attachment 응답/osm/images/generate)FileResponse로 attachment 응답 + X-OSM-Request-ID/osm/images/generate-all)OSM_SIM_CATALOG, OSM_SIM_SOURCE 갱신download_url, content_url 포함)_write_tiff_gray_u16(): 16-bit grayscale TIFF_write_tiff_rgb_u8(): 8-bit RGB TIFF_tiff_to_bmp_bytes(): TIFF를 BMP 바이트로 변환/content 경로에서 브라우저 표시 안정성 확보_rgb_to_gray_u16(), _rgb_to_classified_gray_u16() 적용/ui)/osm/images/generate-all 호출callOsmImages() 재조회로 목록 즉시 갱신sensor/level/fmt/q) 변경 즉시 API 재조회400: 포맷/레벨 조합 불일치, 필수 파라미터 조합 누락404: 조회 대상 없음, 파일 누락415: TIFF 미리보기 변환 실패422: FastAPI 쿼리 검증 실패(좌표/줌/정규식)502: OSM 타일 외부 조회 실패/health/docs, /openapi.json/, /ui, /docs, /redoc, /openapi.json no-cache 처리core.py 조합 검증/확장자 규칙 반영generate-all 내부 구현은 선택 파라미터(level/fmt) 경로도 포함하고 있어, 문서/코드 정합성을 유지해야 한다./images/generate, /osm/images/generate) 사용을 권장한다.app/ui/app.js 동시 수정이 필요하다.