diff --git a/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobController.java b/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobController.java index d83c620..30956e8 100644 --- a/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobController.java +++ b/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobController.java @@ -55,4 +55,13 @@ public class RenderJobController { guard.requireEventAccess(principal, eventId); return ApiResponse.ok(service.listByBooth(boothId, shot)); } + + /** GET /booths/{boothId}/render-history — 완료(DONE) 렌더 이력 갤러리(SCR-06, G-09). 최신순 영속 이력. */ + @GetMapping("/booths/{boothId}/render-history") + public ApiResponse> history(@AuthenticationPrincipal KintexPrincipal principal, + @PathVariable String eventId, + @PathVariable String boothId) { + guard.requireEventAccess(principal, eventId); + return ApiResponse.ok(service.listHistoryByBooth(boothId)); + } } diff --git a/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobService.java b/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobService.java index 2849b95..476cb94 100644 --- a/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobService.java +++ b/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobService.java @@ -26,6 +26,9 @@ public interface RenderJobService { /** 부스 단위 잡 목록(SCR-12 갤러리) — 내구 저장(DB) 기반. */ List listByBooth(String boothId, String shotPreset); + /** 부스 완료(DONE) 렌더 이력(SCR-06 이력 갤러리) — 내구 저장(DB) 기반, 최신순. */ + List listHistoryByBooth(String boothId); + /** 워커 완료/실패 콜백 처리 — 상태 갱신 + WebSocket 푸시(+ 성공 시 쿼터 차감). */ RenderJobDto handleWorkerCallback(WorkerCallbackRequest callback); } diff --git a/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobServiceImpl.java b/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobServiceImpl.java index be6e52d..43970f4 100644 --- a/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobServiceImpl.java +++ b/src/backend/src/main/java/com/zioinfo/kintex/module/m5/RenderJobServiceImpl.java @@ -155,6 +155,24 @@ public class RenderJobServiceImpl implements RenderJobService { return out; } + @Override + public List listHistoryByBooth(String boothId) { + List> rows = renderJobMapper.findHistoryByBooth(boothId); + List out = new java.util.ArrayList<>(); + if (rows == null) { + return out; + } + for (Map r : rows) { + out.add(new RenderJobDto( + str(r.get("jobId")), str(r.get("boothId")), str(r.get("shotPreset")), + str(r.get("status")), str(r.get("imageUrl")), + str(r.get("schemaHash")), str(r.get("modelVersion")), + true, RenderJobDto.WATERMARK_TEXT, RenderJobDto.NOTICE, + null, str(r.get("createdAt")))); + } + return out; + } + @Override public RenderJobDto handleWorkerCallback(WorkerCallbackRequest callback) { RenderJobDto prev = readState(callback.jobId()); diff --git a/src/backend/src/main/java/com/zioinfo/kintex/module/m5/mapper/RenderJobMapper.java b/src/backend/src/main/java/com/zioinfo/kintex/module/m5/mapper/RenderJobMapper.java index 72ce84b..8481293 100644 --- a/src/backend/src/main/java/com/zioinfo/kintex/module/m5/mapper/RenderJobMapper.java +++ b/src/backend/src/main/java/com/zioinfo/kintex/module/m5/mapper/RenderJobMapper.java @@ -27,6 +27,9 @@ public interface RenderJobMapper { List> findByBooth(@Param("boothId") String boothId, @Param("shotPreset") String shotPreset); + /** 부스 단위 완료(DONE) 렌더 이력(SCR-06 이력 갤러리) — 최신순. 이미지 URL 있는 성공 결과만. */ + List> findHistoryByBooth(@Param("boothId") String boothId); + /** 행사별 성공 생성 건수(쿼터 산정). */ int countSucceededByEvent(@Param("eventId") String eventId); } diff --git a/src/backend/src/main/resources/db/migration/V54__render_history_index.sql b/src/backend/src/main/resources/db/migration/V54__render_history_index.sql new file mode 100644 index 0000000..d1e3056 --- /dev/null +++ b/src/backend/src/main/resources/db/migration/V54__render_history_index.sql @@ -0,0 +1,6 @@ +-- V54 — 부스 렌더 이력(SCR-06 이력 갤러리, G-09) 조회 최적화. +-- findHistoryByBooth: WHERE booth_id = ? AND status = 'DONE' ORDER BY created_at DESC. +-- 기존 idx_render_job_booth(booth_id, shot_preset)는 status/정렬을 커버하지 못함 → 전용 커버링 인덱스 추가. +-- 멱등(IF NOT EXISTS) — 재적용/기존 데이터 무영향. 신규 테이블·컬럼 없음(render_job 재사용). +CREATE INDEX IF NOT EXISTS idx_render_job_history + ON render_job (booth_id, status, created_at DESC); diff --git a/src/backend/src/main/resources/mybatis/mapper/RenderJobMapper.xml b/src/backend/src/main/resources/mybatis/mapper/RenderJobMapper.xml index 2d341a8..3b8abb7 100644 --- a/src/backend/src/main/resources/mybatis/mapper/RenderJobMapper.xml +++ b/src/backend/src/main/resources/mybatis/mapper/RenderJobMapper.xml @@ -48,6 +48,23 @@ ORDER BY created_at DESC + + +