From 3989140a6e1ac43121b47e78abba6bdeb97bb223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=9A=B0=ED=98=81?= <93671010+mr6208@users.noreply.github.com> Date: Mon, 5 Jan 2026 21:38:25 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Mr6208/20251125=20#646=20=EB=8C=80=EB=A6=AC?= =?UTF-8?q?=EC=9D=B8=20=EB=B0=8F=20=EC=9D=98=EB=A2=B0=EC=9D=B8=EC=9D=98=20?= =?UTF-8?q?=ED=8B=B0=EC=BC=93=ED=8C=85=20=EC=84=B1=EA=B3=B5=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20(#700)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 --------- Co-authored-by: Baek Jihoon <133375485+Chuseok22@users.noreply.github.com> --- settings.gradle | 2 +- .../FulfillmentFormController.java | 10 +-- .../FulfillmentFormControllerDocs.java | 8 +-- .../SuccessHistoryController.java | 41 +++++++++++ .../SuccessHistoryControllerDocs.java | 60 ++++++++++++++++ .../schema/HibernateDdlGenerator.java | 69 +++++++++++++------ .../service/EnterChatRoomService.java | 2 +- ...0_114830__create_success_history_table.sql | 17 +++++ .../application/exception/ErrorCode.java | 10 ++- .../fulfillmentform/FulfillmentFormEvent.java | 7 ++ .../request/FulfillmentFormInfoRequest.java | 2 +- .../request/FulfillmentFormRejectRequest.java | 2 +- .../request/FulfillmentFormUpdateRequest.java | 6 +- .../response/FulfillmentFormImgResponse.java | 2 +- .../response/FulfillmentFormInfoResponse.java | 4 +- .../SuccessHistoryFilteredRequest.java | 57 +++++++++++++++ .../response/SuccessHistoryResponse.java | 27 ++++++++ .../FulfillmentFormMapper.java | 4 +- .../FulfillmentFormMapperImpl.java | 6 +- .../successhistory/SuccessHistoryMapper.java | 10 +++ .../SuccessHistoryMapperImpl.java | 33 +++++++++ .../FulfillmentFormImgService.java | 2 +- .../FulfillmentFormService.java | 38 ++++++---- .../SuccessHistoryEventHandler.java | 21 ++++++ .../successhistory/SuccessHistoryService.java | 55 +++++++++++++++ .../FulfillmentFormStatus.java | 2 +- .../SuccessHistorySortField.java | 28 ++++++++ .../successhistory/SuccessHistoryStatus.java | 14 ++++ .../constant/FulfillmentFormConstants.java | 3 +- .../entity/FulfillmentForm.java | 2 +- .../infrastructure/entity/SuccessHistory.java | 48 +++++++++++++ .../FulfillmentFormImgRepository.java | 3 +- .../FulfillmentFormRepository.java | 2 +- .../SuccessHistoryRepository.java | 33 +++++++++ .../successhistory/SuccessHistoryRow.java | 24 +++++++ .../application/service/ReviewService.java | 4 +- 36 files changed, 589 insertions(+), 69 deletions(-) create mode 100644 ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java create mode 100644 ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryControllerDocs.java create mode 100644 ticketmate-api/src/main/resources/db/migration/V20251220_114830__create_success_history_table.sql create mode 100644 ticketmate-common/src/main/java/com/ticketmate/backend/common/core/event/fulfillmentform/FulfillmentFormEvent.java rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/{ => fulfillmentform}/request/FulfillmentFormInfoRequest.java (93%) rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/{ => fulfillmentform}/request/FulfillmentFormRejectRequest.java (89%) rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/{ => fulfillmentform}/request/FulfillmentFormUpdateRequest.java (92%) rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/{ => fulfillmentform}/response/FulfillmentFormImgResponse.java (72%) rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/{ => fulfillmentform}/response/FulfillmentFormInfoResponse.java (78%) create mode 100644 ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/request/SuccessHistoryFilteredRequest.java create mode 100644 ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/response/SuccessHistoryResponse.java rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/{ => fulfillmentform}/FulfillmentFormMapper.java (71%) rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/{ => fulfillmentform}/FulfillmentFormMapperImpl.java (88%) create mode 100644 ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapper.java create mode 100644 ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapperImpl.java rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/{ => fulfillmentform}/FulfillmentFormImgService.java (99%) rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/{ => fulfillmentform}/FulfillmentFormService.java (89%) create mode 100644 ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryEventHandler.java create mode 100644 ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryService.java rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/{ => fulfillmentform}/FulfillmentFormStatus.java (83%) create mode 100644 ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistorySortField.java create mode 100644 ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistoryStatus.java create mode 100644 ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/SuccessHistory.java rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/{ => fulfillmentform}/FulfillmentFormImgRepository.java (92%) rename ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/{ => fulfillmentform}/FulfillmentFormRepository.java (95%) create mode 100644 ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRepository.java create mode 100644 ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRow.java diff --git a/settings.gradle b/settings.gradle index 8261dcf4..9ab69b09 100644 --- a/settings.gradle +++ b/settings.gradle @@ -25,4 +25,4 @@ include 'ticketmate-report' include 'ticketmate-review' include 'ticketmate-crypto' include 'ticketmate-concertagentavailability' -include 'ticketmate-fulfillmentform' +include 'ticketmate-fulfillmentform' \ No newline at end of file diff --git a/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormController.java b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormController.java index 03a8b863..4081e7fa 100644 --- a/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormController.java +++ b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormController.java @@ -2,11 +2,11 @@ import com.chuseok22.logging.annotation.LogMonitoring; import com.ticketmate.backend.auth.infrastructure.oauth2.CustomOAuth2User; -import com.ticketmate.backend.fulfillmentform.application.dto.request.FulfillmentFormInfoRequest; -import com.ticketmate.backend.fulfillmentform.application.dto.request.FulfillmentFormRejectRequest; -import com.ticketmate.backend.fulfillmentform.application.dto.request.FulfillmentFormUpdateRequest; -import com.ticketmate.backend.fulfillmentform.application.dto.response.FulfillmentFormInfoResponse; -import com.ticketmate.backend.fulfillmentform.application.service.FulfillmentFormService; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request.FulfillmentFormInfoRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request.FulfillmentFormRejectRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request.FulfillmentFormUpdateRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.response.FulfillmentFormInfoResponse; +import com.ticketmate.backend.fulfillmentform.application.service.fulfillmentform.FulfillmentFormService; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import java.util.UUID; diff --git a/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormControllerDocs.java b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormControllerDocs.java index c23e11d5..88af3fe3 100644 --- a/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormControllerDocs.java +++ b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/fulfillmentform/FulfillmentFormControllerDocs.java @@ -3,10 +3,10 @@ import com.chuseok22.apichangelog.annotation.ApiChangeLog; import com.chuseok22.apichangelog.annotation.ApiChangeLogs; import com.ticketmate.backend.auth.infrastructure.oauth2.CustomOAuth2User; -import com.ticketmate.backend.fulfillmentform.application.dto.request.FulfillmentFormInfoRequest; -import com.ticketmate.backend.fulfillmentform.application.dto.request.FulfillmentFormRejectRequest; -import com.ticketmate.backend.fulfillmentform.application.dto.request.FulfillmentFormUpdateRequest; -import com.ticketmate.backend.fulfillmentform.application.dto.response.FulfillmentFormInfoResponse; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request.FulfillmentFormInfoRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request.FulfillmentFormRejectRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request.FulfillmentFormUpdateRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.response.FulfillmentFormInfoResponse; import io.swagger.v3.oas.annotations.Operation; import java.util.UUID; import org.springframework.http.ResponseEntity; diff --git a/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java new file mode 100644 index 00000000..660221d5 --- /dev/null +++ b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryController.java @@ -0,0 +1,41 @@ +package com.ticketmate.backend.api.application.controller.successhistory; + +import com.chuseok22.logging.annotation.LogMonitoring; +import com.ticketmate.backend.fulfillmentform.application.dto.successhistory.request.SuccessHistoryFilteredRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.successhistory.response.SuccessHistoryResponse; +import com.ticketmate.backend.fulfillmentform.application.service.successhistory.SuccessHistoryService; +import com.ticketmate.backend.auth.infrastructure.oauth2.CustomOAuth2User; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.data.domain.Slice; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/success-history") +@RequiredArgsConstructor +@Tag( + name = "성공내역 API", + description = "성공내역 관련 API 제공" +) +public class SuccessHistoryController implements SuccessHistoryControllerDocs { + + private final SuccessHistoryService successHistoryService; + + @Override + @GetMapping("/{agent-id}") + @LogMonitoring + public ResponseEntity> getSuccessHistoryList( + @AuthenticationPrincipal CustomOAuth2User customOAuth2User, + @PathVariable(value = "agent-id") UUID agentId, + @ParameterObject @Valid SuccessHistoryFilteredRequest request) { + return ResponseEntity.ok(successHistoryService.getSuccessHistoryList(agentId, request)); + } +} diff --git a/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryControllerDocs.java b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryControllerDocs.java new file mode 100644 index 00000000..987e55f8 --- /dev/null +++ b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/controller/successhistory/SuccessHistoryControllerDocs.java @@ -0,0 +1,60 @@ +package com.ticketmate.backend.api.application.controller.successhistory; + +import com.chuseok22.apichangelog.annotation.ApiChangeLog; +import com.chuseok22.apichangelog.annotation.ApiChangeLogs; +import com.ticketmate.backend.fulfillmentform.application.dto.successhistory.request.SuccessHistoryFilteredRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.successhistory.response.SuccessHistoryResponse; +import com.ticketmate.backend.auth.infrastructure.oauth2.CustomOAuth2User; +import io.swagger.v3.oas.annotations.Operation; +import java.util.UUID; +import org.springframework.data.domain.Slice; +import org.springframework.http.ResponseEntity; + +public interface SuccessHistoryControllerDocs { + + @ApiChangeLogs({ + @ApiChangeLog( + date = "2025-12-30", + author = "mr6208", + description = "대리인 성공내역 조회 기능 개발", + issueUrl = "https://github.com/Team-TicketMate/ticketmate-server/issues/646" + ) + }) + @Operation( + summary = "성공내역 조회", + description = """ + 인증된 사용자 한정 자유롭게 성공내역을 조회하는 기능입니다. + + ### 요청 파라미터 + - **agent-id (String)** : 조회할 대리인 ID [필수] + + - [SuccessHistoryFilteredRequest] + - **pageNumber (int)** : 요청할 페이지 번호 [필수X] + - **pageSize (int)** : 요청할 페이지 사이즈 [필수X] + - **sortField (String)** : 정렬 필드 [필수X] + - **sortDirection (String)** : 정렬 방향 [필수X] + + ### 반환값 [LIST] + - **fulfillmentId** : 성공한 성공양식 ID + - **concertName** : 성공한 콘서트명 + - **concertThumbnailUrl** : 콘서트 썸네일 이미지 + - **concertType** : 공연 타입 + - **createDate** : 생성 시간(성공한 시간이라고 봐도 됩니다) + - **successHistoryStatus** : 성공내역 상태 [NOT_REVIEWED,REVIEWED] + - **reviewId** : 리뷰의 ID + - **reviewRating** : 리뷰의 평점 + - **clientNickname** : 의뢰인의 닉네임 + + ### 유의 사항 + - 성공내역 조회는 대리인/의뢰인 모두 사용 가능합니다. + - 성공내역은 성공양식 수락시 자동으로 생성됩니다. + - 성공내역의 상태는 [NOT_REVIEWED, REVIEWED] 두가지 입니다. + - NOT_REVIEWED 상태일시 리뷰 ID값 및 리뷰 평점은 모두 null값을 반환합니다. 반대로 REVIEWED 상태일시 모두 정상적으로 반환합니다. + """ + ) + ResponseEntity> getSuccessHistoryList + (CustomOAuth2User customOAuth2User, + UUID agentId, + SuccessHistoryFilteredRequest request + ); +} diff --git a/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/schema/HibernateDdlGenerator.java b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/schema/HibernateDdlGenerator.java index c678d308..00d5f481 100644 --- a/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/schema/HibernateDdlGenerator.java +++ b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/schema/HibernateDdlGenerator.java @@ -12,6 +12,7 @@ import com.ticketmate.backend.concerthall.infrastructure.entity.ConcertHall; import com.ticketmate.backend.fulfillmentform.infrastructure.entity.FulfillmentForm; import com.ticketmate.backend.fulfillmentform.infrastructure.entity.FulfillmentFormImg; +import com.ticketmate.backend.fulfillmentform.infrastructure.entity.SuccessHistory; import com.ticketmate.backend.member.infrastructure.entity.AgentBankAccount; import com.ticketmate.backend.member.infrastructure.entity.AgentPerformanceSummary; import com.ticketmate.backend.member.infrastructure.entity.Member; @@ -42,7 +43,10 @@ public final class HibernateDdlGenerator { // ======= Public API ======= - /** CI/로컬 어디서든 호출할 수 있는 진입점 */ + + /** + * CI/로컬 어디서든 호출할 수 있는 진입점 + */ public static Path generate(Path explicitOut) throws Exception { log("Hibernate 메타데이터를 기반으로 DDL 파일을 생성합니다. (스프링 미기동)"); StandardServiceRegistry registry = null; @@ -61,33 +65,41 @@ public static Path generate(Path explicitOut) throws Exception { return stable; // 고정 경로 파일 반환 } finally { - if (registry != null) StandardServiceRegistryBuilder.destroy(registry); + if (registry != null) { + StandardServiceRegistryBuilder.destroy(registry); + } } } - /** 선택: 단독 실행도 가능 (CI나 로컬에서 편하게) */ + /** + * 선택: 단독 실행도 가능 (CI나 로컬에서 편하게) + */ public static void main(String[] args) throws Exception { Path override = Optional - .ofNullable(System.getProperty("hibernate.ddl.out")) - .map(Paths::get) - .orElse(null); + .ofNullable(System.getProperty("hibernate.ddl.out")) + .map(Paths::get) + .orElse(null); Path result = generate(override); log("생성 완료. 경로: " + result.toAbsolutePath()); } // ======= Internals ======= - /** Hibernate ServiceRegistry 구성 (방언 등 최소 설정만) */ + /** + * Hibernate ServiceRegistry 구성 (방언 등 최소 설정만) + */ private static StandardServiceRegistry buildRegistry() { log("Hibernate Registry 생성 중..."); return new StandardServiceRegistryBuilder() - .applySetting(AvailableSettings.DIALECT, "org.hibernate.dialect.PostgreSQLDialect") - .applySetting("hibernate.boot.allow_jdbc_metadata_access", "false") // ✅ JDBC 메타데이터 접근 금지 - .applySetting("hibernate.temp.use_jdbc_metadata_defaults", "false") // ✅ 구버전 호환 옵션 - .build(); + .applySetting(AvailableSettings.DIALECT, "org.hibernate.dialect.PostgreSQLDialect") + .applySetting("hibernate.boot.allow_jdbc_metadata_access", "false") // ✅ JDBC 메타데이터 접근 금지 + .applySetting("hibernate.temp.use_jdbc_metadata_defaults", "false") // ✅ 구버전 호환 옵션 + .build(); } - /** 엔티티 등록 (필요시 스캐닝으로 교체 가능) */ + /** + * 엔티티 등록 (필요시 스캐닝으로 교체 가능) + */ private static void registerEntities(MetadataSources sources) { log("엔티티 등록 중..."); // === 여기에 엔티티 전부 추가 === @@ -114,10 +126,13 @@ private static void registerEntities(MetadataSources sources) { sources.addAnnotatedClass(PhoneBlock.class); sources.addAnnotatedClass(FulfillmentFormImg.class); sources.addAnnotatedClass(FulfillmentForm.class); + sources.addAnnotatedClass(SuccessHistory.class); // =============================== } - /** 출력 파일 경로 결정: 고유 파일 + 안정 파일(고정 이름) 모두 관리 */ + /** + * 출력 파일 경로 결정: 고유 파일 + 안정 파일(고정 이름) 모두 관리 + */ private static Path resolveOutputPath() { Path moduleRoot = resolveModuleRoot(); Path genDir = moduleRoot.resolve("build").resolve("generated"); @@ -128,7 +143,9 @@ private static Path resolveOutputPath() { return unique; } - /** 모놀리포(root)와 모듈 단독 실행 모두 안전하게 처리 */ + /** + * 모놀리포(root)와 모듈 단독 실행 모두 안전하게 처리 + */ private static Path resolveModuleRoot() { Path cwd = Paths.get("").toAbsolutePath(); if (Files.isDirectory(cwd.resolve("ticketmate-api"))) { @@ -139,7 +156,9 @@ private static Path resolveModuleRoot() { return cwd; } - /** 실제 DDL 내보내기 (SchemaExport 사용 → ExecutionOptions 불필요) */ + /** + * 실제 DDL 내보내기 (SchemaExport 사용 → ExecutionOptions 불필요) + */ private static void exportDdl(Metadata metadata, Path outFile) { log("DDL 파일 생성 중..."); SchemaExport export = new SchemaExport(); @@ -152,7 +171,9 @@ private static void exportDdl(Metadata metadata, Path outFile) { export.createOnly(EnumSet.of(TargetType.SCRIPT), metadata); } - /** 항상 고정 이름 파일도 유지 → CI가 이 파일만 보면 됨 */ + /** + * 항상 고정 이름 파일도 유지 → CI가 이 파일만 보면 됨 + */ private static Path writeStableCopy(Path uniqueFile) throws Exception { Path moduleRoot = resolveModuleRoot(); Path genDir = moduleRoot.resolve("build").resolve("generated"); @@ -163,7 +184,9 @@ private static Path writeStableCopy(Path uniqueFile) throws Exception { return stable; } - /** 부모 디렉터리 보장 */ + /** + * 부모 디렉터리 보장 + */ private static void ensureParentDir(Path p) { try { Files.createDirectories(p.getParent()); @@ -172,14 +195,18 @@ private static void ensureParentDir(Path p) { } } - /** 실행 태그: 타임스탬프 + Git SHA(있으면) */ + /** + * 실행 태그: 타임스탬프 + Git SHA(있으면) + */ private static String buildRunTag() { String ts = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")); String sha = Optional.ofNullable(System.getenv("GITHUB_SHA")) - .map(s -> s.substring(0, Math.min(8, s.length()))) - .orElse("local"); + .map(s -> s.substring(0, Math.min(8, s.length()))) + .orElse("local"); return ts + "_" + sha; } - private static void log(String msg) { System.out.println("[DDL] " + msg); } + private static void log(String msg) { + System.out.println("[DDL] " + msg); + } } \ No newline at end of file diff --git a/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/service/EnterChatRoomService.java b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/service/EnterChatRoomService.java index 9804538c..d03b6fac 100644 --- a/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/service/EnterChatRoomService.java +++ b/ticketmate-api/src/main/java/com/ticketmate/backend/api/application/service/EnterChatRoomService.java @@ -10,7 +10,7 @@ import com.ticketmate.backend.concert.application.dto.response.ConcertInfoResponse; import com.ticketmate.backend.concert.application.service.ConcertService; import com.ticketmate.backend.fulfillmentform.infrastructure.entity.FulfillmentForm; -import com.ticketmate.backend.fulfillmentform.infrastructure.repository.FulfillmentFormRepository; +import com.ticketmate.backend.fulfillmentform.infrastructure.repository.fulfillmentform.FulfillmentFormRepository; import com.ticketmate.backend.member.application.service.MemberService; import com.ticketmate.backend.member.infrastructure.entity.Member; import java.util.UUID; diff --git a/ticketmate-api/src/main/resources/db/migration/V20251220_114830__create_success_history_table.sql b/ticketmate-api/src/main/resources/db/migration/V20251220_114830__create_success_history_table.sql new file mode 100644 index 00000000..6fb0ac98 --- /dev/null +++ b/ticketmate-api/src/main/resources/db/migration/V20251220_114830__create_success_history_table.sql @@ -0,0 +1,17 @@ +CREATE TABLE public.success_history( + success_history_id UUID NOT NULL PRIMARY KEY, + fulfillment_form_fulfillment_form_id UUID NOT NULL REFERENCES fulfillment_form + CONSTRAINT uk_success_history_fulfillment_form UNIQUE, + + success_history_status VARCHAR(255) NOT NULL + CONSTRAINT success_history_status_check + CHECK (success_history_status IN ( + 'NOT_REVIEWED', + 'REVIEWED' + )), + + created_date TIMESTAMPTZ(0) NOT NULL, + updated_date TIMESTAMPTZ(0) NOT NULL, + deleted BOOLEAN NOT NULL DEFAULT FALSE, + deleted_date TIMESTAMPTZ(0) +); \ No newline at end of file diff --git a/ticketmate-common/src/main/java/com/ticketmate/backend/common/application/exception/ErrorCode.java b/ticketmate-common/src/main/java/com/ticketmate/backend/common/application/exception/ErrorCode.java index 69ac3db8..79198a2f 100644 --- a/ticketmate-common/src/main/java/com/ticketmate/backend/common/application/exception/ErrorCode.java +++ b/ticketmate-common/src/main/java/com/ticketmate/backend/common/application/exception/ErrorCode.java @@ -515,9 +515,15 @@ public enum ErrorCode { FULFILLMENT_IMAGE_NOT_OWNED_BY_FORM(HttpStatus.BAD_REQUEST, "해당 이미지는 성공양식의 소유가 아닌 이미지 입니다."), - FULFILLMENT_FORM_ALREADY_ACCEPTED(HttpStatus.BAD_REQUEST, "수락된 성공양식은 거절이 불가능합니다."), + FULFILLMENT_FORM_ALREADY_ACCEPTED(HttpStatus.BAD_REQUEST, "이미 수락된 성공양식입니다."), + + FULFILLMENT_FORM_NOT_UPDATABLE(HttpStatus.BAD_REQUEST, "성공양식 수정은 거절/수락대기 상태에만 수정이 가능합니다."), + + // SUCCESS_HISTORY + SUCCESS_HISTORY_PAGE_SIZE_TOO_LARGE(HttpStatus.BAD_REQUEST, "성공내역 페이지당 데이터 최댓값을 초과했습니다."), + + SUCCESS_HISTORY_PAGE_SIZE_TOO_SMALL(HttpStatus.BAD_REQUEST, "성공내역의 데이터 최솟값은 10개 입니다."); - FULFILLMENT_FORM_NOT_UPDATABLE(HttpStatus.BAD_REQUEST, "성공양식 수정은 거절/수락대기 상태에만 수정이 가능합니다."); private final HttpStatus status; private final String message; diff --git a/ticketmate-common/src/main/java/com/ticketmate/backend/common/core/event/fulfillmentform/FulfillmentFormEvent.java b/ticketmate-common/src/main/java/com/ticketmate/backend/common/core/event/fulfillmentform/FulfillmentFormEvent.java new file mode 100644 index 00000000..15df566b --- /dev/null +++ b/ticketmate-common/src/main/java/com/ticketmate/backend/common/core/event/fulfillmentform/FulfillmentFormEvent.java @@ -0,0 +1,7 @@ +package com.ticketmate.backend.common.core.event.fulfillmentform; + +import java.util.UUID; + +public record FulfillmentFormEvent(UUID fulfillmentFormId) { + +} diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/request/FulfillmentFormInfoRequest.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormInfoRequest.java similarity index 93% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/request/FulfillmentFormInfoRequest.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormInfoRequest.java index 1eb463c2..14cbc942 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/request/FulfillmentFormInfoRequest.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormInfoRequest.java @@ -1,4 +1,4 @@ -package com.ticketmate.backend.fulfillmentform.application.dto.request; +package com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request; import static com.ticketmate.backend.common.core.constant.ValidationConstants.FulfillmentForm.FULFILLMENT_IMG_MAX_COUNT; import static com.ticketmate.backend.common.core.constant.ValidationConstants.FulfillmentForm.PARTICULAR_MEMO_MAX_LENGTH; diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/request/FulfillmentFormRejectRequest.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormRejectRequest.java similarity index 89% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/request/FulfillmentFormRejectRequest.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormRejectRequest.java index be29debf..54da2a50 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/request/FulfillmentFormRejectRequest.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormRejectRequest.java @@ -1,4 +1,4 @@ -package com.ticketmate.backend.fulfillmentform.application.dto.request; +package com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request; import static com.ticketmate.backend.common.core.constant.ValidationConstants.FulfillmentForm.REJECTED_MEMO_MAX_LENGTH; diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/request/FulfillmentFormUpdateRequest.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormUpdateRequest.java similarity index 92% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/request/FulfillmentFormUpdateRequest.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormUpdateRequest.java index 431b387e..91a5db17 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/request/FulfillmentFormUpdateRequest.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/request/FulfillmentFormUpdateRequest.java @@ -1,4 +1,4 @@ -package com.ticketmate.backend.fulfillmentform.application.dto.request; +package com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request; import static com.ticketmate.backend.common.core.constant.ValidationConstants.FulfillmentForm.PARTICULAR_MEMO_MAX_LENGTH; @@ -24,9 +24,9 @@ public class FulfillmentFormUpdateRequest { private List deleteImgIdList; // 삭제하고 싶은 기존 사진 리스트 - + private List newSuccessImgList; // 추가로 등록하고 싶은 사진 리스트 - + private UUID agentBankAccountId; // 수정할 대리인 계좌번호 ID @Size(max = PARTICULAR_MEMO_MAX_LENGTH) diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/response/FulfillmentFormImgResponse.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/response/FulfillmentFormImgResponse.java similarity index 72% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/response/FulfillmentFormImgResponse.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/response/FulfillmentFormImgResponse.java index 79cf4bf1..0612a88c 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/response/FulfillmentFormImgResponse.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/response/FulfillmentFormImgResponse.java @@ -1,4 +1,4 @@ -package com.ticketmate.backend.fulfillmentform.application.dto.response; +package com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.response; import java.util.UUID; import lombok.AllArgsConstructor; diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/response/FulfillmentFormInfoResponse.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/response/FulfillmentFormInfoResponse.java similarity index 78% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/response/FulfillmentFormInfoResponse.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/response/FulfillmentFormInfoResponse.java index 3bf257e5..917f483f 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/response/FulfillmentFormInfoResponse.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/fulfillmentform/response/FulfillmentFormInfoResponse.java @@ -1,6 +1,6 @@ -package com.ticketmate.backend.fulfillmentform.application.dto.response; +package com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.response; -import com.ticketmate.backend.fulfillmentform.core.constant.FulfillmentFormStatus; +import com.ticketmate.backend.fulfillmentform.core.constant.fulfillmentform.FulfillmentFormStatus; import com.ticketmate.backend.member.application.dto.response.AgentBankAccountResponse; import java.time.LocalDateTime; import java.util.ArrayList; diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/request/SuccessHistoryFilteredRequest.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/request/SuccessHistoryFilteredRequest.java new file mode 100644 index 00000000..56ebfd45 --- /dev/null +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/request/SuccessHistoryFilteredRequest.java @@ -0,0 +1,57 @@ +package com.ticketmate.backend.fulfillmentform.application.dto.successhistory.request; + +import com.ticketmate.backend.common.application.exception.ErrorCode; +import com.ticketmate.backend.common.application.exception.annotation.MaxErrorCode; +import com.ticketmate.backend.common.application.exception.annotation.MinErrorCode; +import com.ticketmate.backend.common.infrastructure.constant.PageableConstants; +import com.ticketmate.backend.common.infrastructure.util.PageableUtil; +import com.ticketmate.backend.fulfillmentform.core.constant.successhistory.SuccessHistorySortField; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Sort.Direction; + +@Getter +@Setter +@Builder +@AllArgsConstructor +public class SuccessHistoryFilteredRequest { + + @Min(value = 1) + @MinErrorCode(ErrorCode.PAGE_NUMBER_TOO_SMALL) + @Max(value = Integer.MAX_VALUE) + @MaxErrorCode(ErrorCode.PAGE_NUMBER_TOO_LARGE) + private Integer pageNumber; // 페이지 번호 (1부터 시작) + + @Min(PageableConstants.DEFAULT_PAGE_SIZE) + @MinErrorCode(ErrorCode.SUCCESS_HISTORY_PAGE_SIZE_TOO_SMALL) + @Max(value = PageableConstants.MAX_PAGE_SIZE) + @MaxErrorCode(ErrorCode.SUCCESS_HISTORY_PAGE_SIZE_TOO_LARGE) + private Integer pageSize; // 페이지 사이즈 + + private SuccessHistorySortField sortField; // 정렬 필드 + + private Sort.Direction sortDirection; // 정렬 방향 + + public SuccessHistoryFilteredRequest() { + this.pageNumber = 1; + this.pageSize = PageableConstants.DEFAULT_PAGE_SIZE; + this.sortField = SuccessHistorySortField.CREATED_DATE; + this.sortDirection = Direction.DESC; + } + + public Pageable toPageable() { + return PageableUtil.createPageable( + pageNumber, + pageSize, + PageableConstants.DEFAULT_PAGE_SIZE, + sortField, + sortDirection + ); + } +} diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/response/SuccessHistoryResponse.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/response/SuccessHistoryResponse.java new file mode 100644 index 00000000..600d94c5 --- /dev/null +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/dto/successhistory/response/SuccessHistoryResponse.java @@ -0,0 +1,27 @@ +package com.ticketmate.backend.fulfillmentform.application.dto.successhistory.response; + +import com.ticketmate.backend.concert.core.constant.ConcertType; +import com.ticketmate.backend.fulfillmentform.core.constant.successhistory.SuccessHistoryStatus; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SuccessHistoryResponse { + + private UUID fulfillmentId; + private String concertName; + private String concertThumbnailUrl; + private ConcertType concertType; + private LocalDateTime createDate; + private SuccessHistoryStatus successHistoryStatus; + private UUID reviewId; + private Float reviewRating; + private String clientNickname; +} diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/FulfillmentFormMapper.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/fulfillmentform/FulfillmentFormMapper.java similarity index 71% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/FulfillmentFormMapper.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/fulfillmentform/FulfillmentFormMapper.java index bad032e6..359f8477 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/FulfillmentFormMapper.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/fulfillmentform/FulfillmentFormMapper.java @@ -1,6 +1,6 @@ -package com.ticketmate.backend.fulfillmentform.application.mapper; +package com.ticketmate.backend.fulfillmentform.application.mapper.fulfillmentform; -import com.ticketmate.backend.fulfillmentform.application.dto.response.FulfillmentFormInfoResponse; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.response.FulfillmentFormInfoResponse; import com.ticketmate.backend.fulfillmentform.infrastructure.entity.FulfillmentForm; public interface FulfillmentFormMapper { diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/FulfillmentFormMapperImpl.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/fulfillmentform/FulfillmentFormMapperImpl.java similarity index 88% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/FulfillmentFormMapperImpl.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/fulfillmentform/FulfillmentFormMapperImpl.java index 1e607172..1893b6cc 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/FulfillmentFormMapperImpl.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/fulfillmentform/FulfillmentFormMapperImpl.java @@ -1,9 +1,9 @@ -package com.ticketmate.backend.fulfillmentform.application.mapper; +package com.ticketmate.backend.fulfillmentform.application.mapper.fulfillmentform; import com.ticketmate.backend.common.core.util.CommonUtil; import com.ticketmate.backend.common.infrastructure.util.TimeUtil; -import com.ticketmate.backend.fulfillmentform.application.dto.response.FulfillmentFormImgResponse; -import com.ticketmate.backend.fulfillmentform.application.dto.response.FulfillmentFormInfoResponse; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.response.FulfillmentFormImgResponse; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.response.FulfillmentFormInfoResponse; import com.ticketmate.backend.fulfillmentform.infrastructure.entity.FulfillmentForm; import com.ticketmate.backend.fulfillmentform.infrastructure.entity.FulfillmentFormImg; import com.ticketmate.backend.member.application.mapper.AgentBankAccountMapper; diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapper.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapper.java new file mode 100644 index 00000000..befc4f45 --- /dev/null +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapper.java @@ -0,0 +1,10 @@ +package com.ticketmate.backend.fulfillmentform.application.mapper.successhistory; + + +import com.ticketmate.backend.fulfillmentform.application.dto.successhistory.response.SuccessHistoryResponse; +import com.ticketmate.backend.fulfillmentform.infrastructure.repository.successhistory.SuccessHistoryRow; + +public interface SuccessHistoryMapper { + + SuccessHistoryResponse toSuccessHistoryResponse(SuccessHistoryRow successHistoryRow); +} diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapperImpl.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapperImpl.java new file mode 100644 index 00000000..bde6a167 --- /dev/null +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/mapper/successhistory/SuccessHistoryMapperImpl.java @@ -0,0 +1,33 @@ +package com.ticketmate.backend.fulfillmentform.application.mapper.successhistory; + +import com.ticketmate.backend.fulfillmentform.application.dto.successhistory.response.SuccessHistoryResponse; +import com.ticketmate.backend.fulfillmentform.core.constant.successhistory.SuccessHistoryStatus; +import com.ticketmate.backend.fulfillmentform.infrastructure.repository.successhistory.SuccessHistoryRow; +import com.ticketmate.backend.storage.core.service.StorageService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class SuccessHistoryMapperImpl implements SuccessHistoryMapper { + + private final StorageService storageService; + + @Override + public SuccessHistoryResponse toSuccessHistoryResponse(SuccessHistoryRow successHistoryRow) { + // 리뷰가 달렸는지 확인 + boolean reviewed = successHistoryRow.getReviewId() != null; + + return SuccessHistoryResponse.builder() + .fulfillmentId(successHistoryRow.getFulfillmentId()) + .concertName(successHistoryRow.getConcertName()) + .concertThumbnailUrl(storageService.generatePublicUrl(successHistoryRow.getConcertThumbnailStoredPath())) + .concertType(successHistoryRow.getConcertType()) + .createDate(successHistoryRow.getCreateDate()) + .successHistoryStatus(reviewed ? SuccessHistoryStatus.REVIEWED : SuccessHistoryStatus.NOT_REVIEWED) + .reviewId(successHistoryRow.getReviewId()) + .reviewRating(successHistoryRow.getReviewRating()) + .clientNickname(successHistoryRow.getClientNickname()) + .build(); + } +} diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/FulfillmentFormImgService.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormImgService.java similarity index 99% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/FulfillmentFormImgService.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormImgService.java index 1653781a..659a2c54 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/FulfillmentFormImgService.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormImgService.java @@ -1,4 +1,4 @@ -package com.ticketmate.backend.fulfillmentform.application.service; +package com.ticketmate.backend.fulfillmentform.application.service.fulfillmentform; import static com.ticketmate.backend.common.core.constant.ValidationConstants.FulfillmentForm.FULFILLMENT_IMG_MAX_COUNT; import static com.ticketmate.backend.common.core.util.CommonUtil.nullOrEmpty; diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/FulfillmentFormService.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormService.java similarity index 89% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/FulfillmentFormService.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormService.java index 2dcbd115..da8ee5e9 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/FulfillmentFormService.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/fulfillmentform/FulfillmentFormService.java @@ -1,10 +1,10 @@ -package com.ticketmate.backend.fulfillmentform.application.service; +package com.ticketmate.backend.fulfillmentform.application.service.fulfillmentform; import static com.ticketmate.backend.common.core.util.CommonUtil.nullOrEmpty; -import static com.ticketmate.backend.fulfillmentform.core.constant.FulfillmentFormStatus.ACCEPTED_FULFILLMENT_FORM; -import static com.ticketmate.backend.fulfillmentform.core.constant.FulfillmentFormStatus.PENDING_FULFILLMENT_FORM; -import static com.ticketmate.backend.fulfillmentform.core.constant.FulfillmentFormStatus.REJECTED_FULFILLMENT_FORM; -import static com.ticketmate.backend.fulfillmentform.core.constant.FulfillmentFormStatus.UPDATE_FULFILLMENT_FORM; +import static com.ticketmate.backend.fulfillmentform.core.constant.fulfillmentform.FulfillmentFormStatus.ACCEPTED_FULFILLMENT_FORM; +import static com.ticketmate.backend.fulfillmentform.core.constant.fulfillmentform.FulfillmentFormStatus.PENDING_FULFILLMENT_FORM; +import static com.ticketmate.backend.fulfillmentform.core.constant.fulfillmentform.FulfillmentFormStatus.REJECTED_FULFILLMENT_FORM; +import static com.ticketmate.backend.fulfillmentform.core.constant.fulfillmentform.FulfillmentFormStatus.UPDATE_FULFILLMENT_FORM; import static com.ticketmate.backend.fulfillmentform.infrastructure.constant.FulfillmentFormConstants.UPDATABLE_STATUSES; import com.ticketmate.backend.applicationform.application.service.ApplicationFormService; @@ -14,15 +14,16 @@ import com.ticketmate.backend.chat.infrastructure.entity.ChatRoom; import com.ticketmate.backend.common.application.exception.CustomException; import com.ticketmate.backend.common.application.exception.ErrorCode; +import com.ticketmate.backend.common.core.event.fulfillmentform.FulfillmentFormEvent; import com.ticketmate.backend.concert.infrastructure.entity.Concert; -import com.ticketmate.backend.fulfillmentform.application.dto.request.FulfillmentFormInfoRequest; -import com.ticketmate.backend.fulfillmentform.application.dto.request.FulfillmentFormRejectRequest; -import com.ticketmate.backend.fulfillmentform.application.dto.request.FulfillmentFormUpdateRequest; -import com.ticketmate.backend.fulfillmentform.application.dto.response.FulfillmentFormInfoResponse; -import com.ticketmate.backend.fulfillmentform.application.mapper.FulfillmentFormMapper; -import com.ticketmate.backend.fulfillmentform.core.constant.FulfillmentFormStatus; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request.FulfillmentFormInfoRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request.FulfillmentFormRejectRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.request.FulfillmentFormUpdateRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.fulfillmentform.response.FulfillmentFormInfoResponse; +import com.ticketmate.backend.fulfillmentform.application.mapper.fulfillmentform.FulfillmentFormMapper; +import com.ticketmate.backend.fulfillmentform.core.constant.fulfillmentform.FulfillmentFormStatus; import com.ticketmate.backend.fulfillmentform.infrastructure.entity.FulfillmentForm; -import com.ticketmate.backend.fulfillmentform.infrastructure.repository.FulfillmentFormRepository; +import com.ticketmate.backend.fulfillmentform.infrastructure.repository.fulfillmentform.FulfillmentFormRepository; import com.ticketmate.backend.member.application.service.AgentBankAccountService; import com.ticketmate.backend.member.application.service.AgentPerformanceService; import com.ticketmate.backend.member.application.service.MemberService; @@ -35,6 +36,7 @@ import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionSynchronization; @@ -55,6 +57,7 @@ public class FulfillmentFormService { private final ApplicationFormService applicationFormService; private final FulfillmentFormMapper mapper; private final AgentPerformanceService agentPerformanceService; + private final ApplicationEventPublisher eventPublisher; /** * 티켓팅 성공시 대리인이 성공양식을 작성 및 저장하는 로직 @@ -148,10 +151,12 @@ public FulfillmentFormInfoResponse getFulfillmentFormInfo(Member member, UUID fu @Transactional @RedisLock(key = "@redisLockKeyManager.generate('fulfillment-form', #fulfillmentFormId)") public void acceptFulfillmentForm(Member member, UUID fulfillmentFormId) { - FulfillmentForm fulfillmentForm = handleFulfillmentStatusForClient(member, fulfillmentFormId, FulfillmentFormStatus.ACCEPTED_FULFILLMENT_FORM); + FulfillmentForm fulfillmentForm = handleFulfillmentStatusForClient(member, fulfillmentFormId, ACCEPTED_FULFILLMENT_FORM); validateFulfillmentFormMember(member, fulfillmentForm, MemberType.CLIENT); + eventPublisher.publishEvent(new FulfillmentFormEvent(fulfillmentFormId)); + // TODO 성공양식이 수락됐다는 알림 발송 로직 추가해야될듯 try { @@ -268,7 +273,12 @@ private FulfillmentForm handleFulfillmentStatusForClient(Member member, UUID ful switch (fulfillmentFormStatus) { case ACCEPTED_FULFILLMENT_FORM -> { - fulfillmentForm.setFulfillmentFormStatus(FulfillmentFormStatus.ACCEPTED_FULFILLMENT_FORM); + if (fulfillmentForm.getFulfillmentFormStatus() == ACCEPTED_FULFILLMENT_FORM) { + log.error("이미 수락된 성공양식입니다."); + throw new CustomException(ErrorCode.FULFILLMENT_FORM_ALREADY_ACCEPTED); + } + + fulfillmentForm.setFulfillmentFormStatus(ACCEPTED_FULFILLMENT_FORM); log.debug("의뢰인 성공양식 수락감지. 현재 상태 : {}", fulfillmentForm.getFulfillmentFormStatus()); } diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryEventHandler.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryEventHandler.java new file mode 100644 index 00000000..10940140 --- /dev/null +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryEventHandler.java @@ -0,0 +1,21 @@ +package com.ticketmate.backend.fulfillmentform.application.service.successhistory; + +import com.ticketmate.backend.common.core.event.fulfillmentform.FulfillmentFormEvent; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@Slf4j +@RequiredArgsConstructor +public class SuccessHistoryEventHandler { + + private final SuccessHistoryService successHistoryService; + + @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT) + public void createSuccessHistoryForEvent(FulfillmentFormEvent event) { + successHistoryService.createSuccessHistory(event.fulfillmentFormId()); + } +} diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryService.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryService.java new file mode 100644 index 00000000..05389453 --- /dev/null +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/application/service/successhistory/SuccessHistoryService.java @@ -0,0 +1,55 @@ +package com.ticketmate.backend.fulfillmentform.application.service.successhistory; + +import com.ticketmate.backend.fulfillmentform.application.dto.successhistory.request.SuccessHistoryFilteredRequest; +import com.ticketmate.backend.fulfillmentform.application.dto.successhistory.response.SuccessHistoryResponse; +import com.ticketmate.backend.fulfillmentform.application.mapper.successhistory.SuccessHistoryMapper; +import com.ticketmate.backend.fulfillmentform.infrastructure.entity.FulfillmentForm; +import com.ticketmate.backend.fulfillmentform.infrastructure.entity.SuccessHistory; +import com.ticketmate.backend.fulfillmentform.infrastructure.repository.successhistory.SuccessHistoryRepository; +import com.ticketmate.backend.member.application.service.MemberService; +import com.ticketmate.backend.member.core.constant.MemberType; +import com.ticketmate.backend.member.infrastructure.entity.Member; +import jakarta.persistence.EntityManager; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Slf4j +@RequiredArgsConstructor +public class SuccessHistoryService { + + private final SuccessHistoryRepository successHistoryRepository; + private final EntityManager entityManager; + private final MemberService memberService; + private final SuccessHistoryMapper mapper; + + public void createSuccessHistory(UUID fulfillmentFormId) { + if (successHistoryRepository.existsByFulfillmentForm_FulfillmentFormId(fulfillmentFormId)) { + log.debug("성공내역이 이미 존재합니다."); + return; + } + + FulfillmentForm fulfillmentForm = entityManager.getReference(FulfillmentForm.class, fulfillmentFormId); + successHistoryRepository.save(SuccessHistory.create(fulfillmentForm)); + } + + @Transactional(readOnly = true) + public Slice getSuccessHistoryList(UUID agentId, SuccessHistoryFilteredRequest request) { + Member agent = memberService.findMemberById(agentId); + + // 조회객체가 대리인이 정말 맞는지 + memberService.validateMemberType(agent, MemberType.AGENT); + + // 페이지네이션 객체 생성 + Pageable pageable = request.toPageable(); + + return successHistoryRepository + .findSuccessHistoryList(agentId, pageable) + .map(mapper::toSuccessHistoryResponse); + } +} \ No newline at end of file diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/FulfillmentFormStatus.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/fulfillmentform/FulfillmentFormStatus.java similarity index 83% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/FulfillmentFormStatus.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/fulfillmentform/FulfillmentFormStatus.java index 00b98bd9..d36ddb5f 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/FulfillmentFormStatus.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/fulfillmentform/FulfillmentFormStatus.java @@ -1,4 +1,4 @@ -package com.ticketmate.backend.fulfillmentform.core.constant; +package com.ticketmate.backend.fulfillmentform.core.constant.fulfillmentform; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistorySortField.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistorySortField.java new file mode 100644 index 00000000..3ffe1793 --- /dev/null +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistorySortField.java @@ -0,0 +1,28 @@ +package com.ticketmate.backend.fulfillmentform.core.constant.successhistory; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.ticketmate.backend.common.core.constant.SortField; +import com.ticketmate.backend.common.core.util.CommonUtil; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum SuccessHistorySortField implements SortField { + CREATED_DATE("createdDate"); + + private final String property; + + /** + * Jackson이 JSON -> Java 객체로 역직렬화 (deserialization)할 때 자동 호출 + * 컨트롤러에서 들어온 {"sortField": "TICKET_OPEN_DATE"} 같은 문자열을 변환 + * 만약 {"sortField": "ticketOpenDate"}와 같이 카멜케이스로 들어와도 f.property와 비교하여 자동 매칭 + */ + @JsonCreator + public static SuccessHistorySortField from(String value) { + return CommonUtil.stringToSortField(SuccessHistorySortField.class, value); + } + + @Override + public String getProperty() { + return property; + } +} diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistoryStatus.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistoryStatus.java new file mode 100644 index 00000000..0f359409 --- /dev/null +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/core/constant/successhistory/SuccessHistoryStatus.java @@ -0,0 +1,14 @@ +package com.ticketmate.backend.fulfillmentform.core.constant.successhistory; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum SuccessHistoryStatus { + + NOT_REVIEWED("리뷰가 아직 미작성인 성공내역"), + REVIEWED("리뷰가 작성된 성공내역"); + + private final String description; +} \ No newline at end of file diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/constant/FulfillmentFormConstants.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/constant/FulfillmentFormConstants.java index 6e659337..f1de0032 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/constant/FulfillmentFormConstants.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/constant/FulfillmentFormConstants.java @@ -1,11 +1,12 @@ package com.ticketmate.backend.fulfillmentform.infrastructure.constant; -import com.ticketmate.backend.fulfillmentform.core.constant.FulfillmentFormStatus; +import com.ticketmate.backend.fulfillmentform.core.constant.fulfillmentform.FulfillmentFormStatus; import java.util.EnumSet; import lombok.experimental.UtilityClass; @UtilityClass public class FulfillmentFormConstants { + // 수정 가능한 신청서 상태 public static final EnumSet UPDATABLE_STATUSES = EnumSet.of(FulfillmentFormStatus.PENDING_FULFILLMENT_FORM, diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/FulfillmentForm.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/FulfillmentForm.java index 0b80ef6a..ea25633a 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/FulfillmentForm.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/FulfillmentForm.java @@ -7,7 +7,7 @@ import com.ticketmate.backend.common.application.exception.ErrorCode; import com.ticketmate.backend.common.infrastructure.persistence.BasePostgresEntity; import com.ticketmate.backend.concert.infrastructure.entity.Concert; -import com.ticketmate.backend.fulfillmentform.core.constant.FulfillmentFormStatus; +import com.ticketmate.backend.fulfillmentform.core.constant.fulfillmentform.FulfillmentFormStatus; import com.ticketmate.backend.member.infrastructure.entity.AgentBankAccount; import com.ticketmate.backend.member.infrastructure.entity.Member; import jakarta.persistence.CascadeType; diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/SuccessHistory.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/SuccessHistory.java new file mode 100644 index 00000000..c8560a07 --- /dev/null +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/entity/SuccessHistory.java @@ -0,0 +1,48 @@ +package com.ticketmate.backend.fulfillmentform.infrastructure.entity; + +import com.ticketmate.backend.common.infrastructure.persistence.BasePostgresEntity; +import com.ticketmate.backend.fulfillmentform.core.constant.successhistory.SuccessHistoryStatus; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Entity +@Getter +@Setter +@SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +public class SuccessHistory extends BasePostgresEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID successHistoryId; + + @OneToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(nullable = false) + private FulfillmentForm fulfillmentForm; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private SuccessHistoryStatus successHistoryStatus; + + public static SuccessHistory create(FulfillmentForm fulfillmentForm) { + return SuccessHistory.builder() + .fulfillmentForm(fulfillmentForm) + .successHistoryStatus(SuccessHistoryStatus.NOT_REVIEWED) + .build(); + } +} diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/FulfillmentFormImgRepository.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/fulfillmentform/FulfillmentFormImgRepository.java similarity index 92% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/FulfillmentFormImgRepository.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/fulfillmentform/FulfillmentFormImgRepository.java index c1f7668c..50a2fee7 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/FulfillmentFormImgRepository.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/fulfillmentform/FulfillmentFormImgRepository.java @@ -1,8 +1,9 @@ -package com.ticketmate.backend.fulfillmentform.infrastructure.repository; +package com.ticketmate.backend.fulfillmentform.infrastructure.repository.fulfillmentform; import com.ticketmate.backend.fulfillmentform.infrastructure.entity.FulfillmentFormImg; import java.util.UUID; import org.springframework.data.jpa.repository.JpaRepository; public interface FulfillmentFormImgRepository extends JpaRepository { + } diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/FulfillmentFormRepository.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/fulfillmentform/FulfillmentFormRepository.java similarity index 95% rename from ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/FulfillmentFormRepository.java rename to ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/fulfillmentform/FulfillmentFormRepository.java index 5a6344b6..e1a83654 100644 --- a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/FulfillmentFormRepository.java +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/fulfillmentform/FulfillmentFormRepository.java @@ -1,4 +1,4 @@ -package com.ticketmate.backend.fulfillmentform.infrastructure.repository; +package com.ticketmate.backend.fulfillmentform.infrastructure.repository.fulfillmentform; import com.ticketmate.backend.applicationform.infrastructure.entity.ApplicationForm; import com.ticketmate.backend.fulfillmentform.infrastructure.entity.FulfillmentForm; diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRepository.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRepository.java new file mode 100644 index 00000000..a18bca01 --- /dev/null +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRepository.java @@ -0,0 +1,33 @@ +package com.ticketmate.backend.fulfillmentform.infrastructure.repository.successhistory; + +import com.ticketmate.backend.fulfillmentform.infrastructure.entity.SuccessHistory; +import java.util.UUID; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface SuccessHistoryRepository extends JpaRepository { + + boolean existsByFulfillmentForm_FulfillmentFormId(UUID fulfillmentFormId); + + @Query(""" + select + ff.fulfillmentFormId as fulfillmentId, + c.concertName as concertName, + c.concertThumbnailStoredPath as concertThumbnailStoredPath, + c.concertType as concertType, + sh.createdDate as createDate, + cl.nickname as clientNickname, + r.reviewId as reviewId, + r.rating as reviewRating + from SuccessHistory sh + join sh.fulfillmentForm ff + join ff.concert c + join ff.client cl + left join Review r on r.fulfillmentForm = ff + where ff.agent.memberId = :agentMemberId + """) + Slice findSuccessHistoryList(@Param("agentMemberId") UUID agentMemberId, Pageable pageable); +} diff --git a/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRow.java b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRow.java new file mode 100644 index 00000000..18eb9cb3 --- /dev/null +++ b/ticketmate-fulfillmentform/src/main/java/com/ticketmate/backend/fulfillmentform/infrastructure/repository/successhistory/SuccessHistoryRow.java @@ -0,0 +1,24 @@ +package com.ticketmate.backend.fulfillmentform.infrastructure.repository.successhistory; + +import com.ticketmate.backend.concert.core.constant.ConcertType; +import java.time.LocalDateTime; +import java.util.UUID; + +public interface SuccessHistoryRow { + + UUID getFulfillmentId(); + + String getConcertName(); + + String getConcertThumbnailStoredPath(); + + ConcertType getConcertType(); + + LocalDateTime getCreateDate(); + + String getClientNickname(); + + UUID getReviewId(); // 리뷰 없으면 null + + Float getReviewRating(); // 리뷰 없으면 null +} diff --git a/ticketmate-review/src/main/java/com/ticketmate/backend/review/application/service/ReviewService.java b/ticketmate-review/src/main/java/com/ticketmate/backend/review/application/service/ReviewService.java index cd1bc2df..38770cfd 100644 --- a/ticketmate-review/src/main/java/com/ticketmate/backend/review/application/service/ReviewService.java +++ b/ticketmate-review/src/main/java/com/ticketmate/backend/review/application/service/ReviewService.java @@ -6,8 +6,8 @@ import com.ticketmate.backend.common.application.exception.ErrorCode; import com.ticketmate.backend.common.core.util.CommonUtil; import com.ticketmate.backend.common.infrastructure.util.TimeUtil; -import com.ticketmate.backend.fulfillmentform.application.service.FulfillmentFormService; -import com.ticketmate.backend.fulfillmentform.core.constant.FulfillmentFormStatus; +import com.ticketmate.backend.fulfillmentform.application.service.fulfillmentform.FulfillmentFormService; +import com.ticketmate.backend.fulfillmentform.core.constant.fulfillmentform.FulfillmentFormStatus; import com.ticketmate.backend.fulfillmentform.infrastructure.entity.FulfillmentForm; import com.ticketmate.backend.member.application.service.AgentPerformanceService; import com.ticketmate.backend.member.application.service.MemberService; From 0934758561ba5699d074125f064cea2d40b926e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=9A=B0=ED=98=81?= <93671010+mr6208@users.noreply.github.com> Date: Mon, 5 Jan 2026 22:01:50 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Mr6208/20251125=20#646=20=EB=8C=80=EB=A6=AC?= =?UTF-8?q?=EC=9D=B8=20=EB=B0=8F=20=EC=9D=98=EB=A2=B0=EC=9D=B8=EC=9D=98=20?= =?UTF-8?q?=ED=8B=B0=EC=BC=93=ED=8C=85=20=EC=84=B1=EA=B3=B5=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20(#711)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} https://github.com/Team-TicketMate/ticketmate-server/issues/646 --------- Co-authored-by: Baek Jihoon <133375485+Chuseok22@users.noreply.github.com> --- ...105_114830__create_success_history_table.sql | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 ticketmate-api/src/main/resources/db/migration/V20260105_114830__create_success_history_table.sql diff --git a/ticketmate-api/src/main/resources/db/migration/V20260105_114830__create_success_history_table.sql b/ticketmate-api/src/main/resources/db/migration/V20260105_114830__create_success_history_table.sql new file mode 100644 index 00000000..6fb0ac98 --- /dev/null +++ b/ticketmate-api/src/main/resources/db/migration/V20260105_114830__create_success_history_table.sql @@ -0,0 +1,17 @@ +CREATE TABLE public.success_history( + success_history_id UUID NOT NULL PRIMARY KEY, + fulfillment_form_fulfillment_form_id UUID NOT NULL REFERENCES fulfillment_form + CONSTRAINT uk_success_history_fulfillment_form UNIQUE, + + success_history_status VARCHAR(255) NOT NULL + CONSTRAINT success_history_status_check + CHECK (success_history_status IN ( + 'NOT_REVIEWED', + 'REVIEWED' + )), + + created_date TIMESTAMPTZ(0) NOT NULL, + updated_date TIMESTAMPTZ(0) NOT NULL, + deleted BOOLEAN NOT NULL DEFAULT FALSE, + deleted_date TIMESTAMPTZ(0) +); \ No newline at end of file From 125a9d9d63e498c6596eec85a2c36faeb209baa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=9A=B0=ED=98=81?= <93671010+mr6208@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:02:27 +0900 Subject: [PATCH 3/4] =?UTF-8?q?Mr6208/20251125=20#646=20=EB=8C=80=EB=A6=AC?= =?UTF-8?q?=EC=9D=B8=20=EB=B0=8F=20=EC=9D=98=EB=A2=B0=EC=9D=B8=EC=9D=98=20?= =?UTF-8?q?=ED=8B=B0=EC=BC=93=ED=8C=85=20=EC=84=B1=EA=B3=B5=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20(#714)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700) (#710) * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 --------- Co-authored-by: Baek Jihoon <133375485+Chuseok22@users.noreply.github.com> * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * Test (#712) * Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#700) * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 --------- Co-authored-by: Baek Jihoon <133375485+Chuseok22@users.noreply.github.com> * Mr6208/20251125 #646 대리인 및 의뢰인의 티켓팅 성공내역 생성 및 조회 기능 추가 (#711) * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 모듈 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 도메인 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 API 설계 및 명세 작성} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역생성 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역리스트업 기능 설계} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {flyway 관련 세팅 추가} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {코드리뷰 반영 및 성공내역 모듈 통일} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공양식 수락 로직 검증단계 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {성공내역 생성 트랜젝션 범위 재설정} https://github.com/Team-TicketMate/ticketmate-server/issues/646 * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {스크립트 버전 충돌로 인한 스크립트 이름 변경} https://github.com/Team-TicketMate/ticketmate-server/issues/646 --------- Co-authored-by: Baek Jihoon <133375485+Chuseok22@users.noreply.github.com> --------- Co-authored-by: Baek Jihoon <133375485+Chuseok22@users.noreply.github.com> * 대리인_및_의뢰인의_티켓팅_성공내역_생성_및_조회_기능_추가 : feat : {기존 스크립트 삭제(왜있는거지)} https://github.com/Team-TicketMate/ticketmate-server/issues/646 --------- Co-authored-by: Baek Jihoon <133375485+Chuseok22@users.noreply.github.com> From 3ed512f19d9d6774d45e01916e9f3f76bd67abf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=9A=B0=ED=98=81?= <93671010+mr6208@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:27:12 +0900 Subject: [PATCH 4/4] =?UTF-8?q?hotfix:=20=EA=B3=BC=EA=B1=B0=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A6=BD=ED=8A=B8=20=EB=98=90=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...220_114830__create_success_history_table.sql | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 ticketmate-api/src/main/resources/db/migration/V20251220_114830__create_success_history_table.sql diff --git a/ticketmate-api/src/main/resources/db/migration/V20251220_114830__create_success_history_table.sql b/ticketmate-api/src/main/resources/db/migration/V20251220_114830__create_success_history_table.sql deleted file mode 100644 index 6fb0ac98..00000000 --- a/ticketmate-api/src/main/resources/db/migration/V20251220_114830__create_success_history_table.sql +++ /dev/null @@ -1,17 +0,0 @@ -CREATE TABLE public.success_history( - success_history_id UUID NOT NULL PRIMARY KEY, - fulfillment_form_fulfillment_form_id UUID NOT NULL REFERENCES fulfillment_form - CONSTRAINT uk_success_history_fulfillment_form UNIQUE, - - success_history_status VARCHAR(255) NOT NULL - CONSTRAINT success_history_status_check - CHECK (success_history_status IN ( - 'NOT_REVIEWED', - 'REVIEWED' - )), - - created_date TIMESTAMPTZ(0) NOT NULL, - updated_date TIMESTAMPTZ(0) NOT NULL, - deleted BOOLEAN NOT NULL DEFAULT FALSE, - deleted_date TIMESTAMPTZ(0) -); \ No newline at end of file