From 98dd5352647156075fa69b0976be0ccf677ba189 Mon Sep 17 00:00:00 2001 From: fervovita Date: Mon, 29 Jun 2026 15:32:36 +0900 Subject: [PATCH 1/6] =?UTF-8?q?Feat(commission):=20CommissionId=EB=A1=9C?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EA=B0=80=EB=8A=A5=ED=95=9C=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/textbook/repository/TextbookPageRepository.java | 4 ++++ .../commission/core/repository/CommissionColorRepository.java | 4 ++++ .../core/repository/CommissionConceptRepository.java | 4 ++++ .../commission/core/repository/CommissionFileRepository.java | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/src/main/java/ditda/backend/domain/commission/category/textbook/repository/TextbookPageRepository.java b/src/main/java/ditda/backend/domain/commission/category/textbook/repository/TextbookPageRepository.java index 79b76a6e..dc51589e 100644 --- a/src/main/java/ditda/backend/domain/commission/category/textbook/repository/TextbookPageRepository.java +++ b/src/main/java/ditda/backend/domain/commission/category/textbook/repository/TextbookPageRepository.java @@ -1,8 +1,12 @@ package ditda.backend.domain.commission.category.textbook.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import ditda.backend.domain.commission.category.textbook.entity.TextbookPage; public interface TextbookPageRepository extends JpaRepository { + + List findByCommissionId(Long commissionId); } diff --git a/src/main/java/ditda/backend/domain/commission/core/repository/CommissionColorRepository.java b/src/main/java/ditda/backend/domain/commission/core/repository/CommissionColorRepository.java index f4ac48e1..ec2e428a 100644 --- a/src/main/java/ditda/backend/domain/commission/core/repository/CommissionColorRepository.java +++ b/src/main/java/ditda/backend/domain/commission/core/repository/CommissionColorRepository.java @@ -1,8 +1,12 @@ package ditda.backend.domain.commission.core.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import ditda.backend.domain.commission.core.entity.CommissionColor; public interface CommissionColorRepository extends JpaRepository { + + List findByCommissionId(Long commissionId); } diff --git a/src/main/java/ditda/backend/domain/commission/core/repository/CommissionConceptRepository.java b/src/main/java/ditda/backend/domain/commission/core/repository/CommissionConceptRepository.java index 95fcf16b..02d9cdaf 100644 --- a/src/main/java/ditda/backend/domain/commission/core/repository/CommissionConceptRepository.java +++ b/src/main/java/ditda/backend/domain/commission/core/repository/CommissionConceptRepository.java @@ -1,8 +1,12 @@ package ditda.backend.domain.commission.core.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import ditda.backend.domain.commission.core.entity.CommissionConcept; public interface CommissionConceptRepository extends JpaRepository { + + List findByCommissionId(Long commissionId); } diff --git a/src/main/java/ditda/backend/domain/commission/core/repository/CommissionFileRepository.java b/src/main/java/ditda/backend/domain/commission/core/repository/CommissionFileRepository.java index df390d04..735cb138 100644 --- a/src/main/java/ditda/backend/domain/commission/core/repository/CommissionFileRepository.java +++ b/src/main/java/ditda/backend/domain/commission/core/repository/CommissionFileRepository.java @@ -1,8 +1,12 @@ package ditda.backend.domain.commission.core.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import ditda.backend.domain.commission.core.entity.CommissionFile; public interface CommissionFileRepository extends JpaRepository { + + List findByCommissionId(Long commissionId); } From 76403de70e405422041356bbdb1abb04121cc554 Mon Sep 17 00:00:00 2001 From: fervovita Date: Mon, 29 Jun 2026 15:35:47 +0900 Subject: [PATCH 2/6] =?UTF-8?q?Feat(commission):=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=EB=B3=84=20=EC=83=81=EC=84=B8=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../textbook/dto/TextbookCategoryDetail.java | 29 +++++++++++++++ .../dto/response/TextbookDetailResponse.java | 35 +++++++++++++++++++ .../handler/TextbookCategoryHandler.java | 13 +++++++ .../dto/response/CategoryDetailResponse.java | 7 ++++ .../core/handler/CategoryDetail.java | 8 +++++ .../handler/CommissionCategoryHandler.java | 3 ++ 6 files changed, 95 insertions(+) create mode 100644 src/main/java/ditda/backend/domain/commission/category/textbook/dto/TextbookCategoryDetail.java create mode 100644 src/main/java/ditda/backend/domain/commission/category/textbook/dto/response/TextbookDetailResponse.java create mode 100644 src/main/java/ditda/backend/domain/commission/core/dto/response/CategoryDetailResponse.java create mode 100644 src/main/java/ditda/backend/domain/commission/core/handler/CategoryDetail.java diff --git a/src/main/java/ditda/backend/domain/commission/category/textbook/dto/TextbookCategoryDetail.java b/src/main/java/ditda/backend/domain/commission/category/textbook/dto/TextbookCategoryDetail.java new file mode 100644 index 00000000..87e7dcfe --- /dev/null +++ b/src/main/java/ditda/backend/domain/commission/category/textbook/dto/TextbookCategoryDetail.java @@ -0,0 +1,29 @@ +package ditda.backend.domain.commission.category.textbook.dto; + +import java.util.List; + +import ditda.backend.domain.commission.category.textbook.dto.response.TextbookDetailResponse; +import ditda.backend.domain.commission.category.textbook.entity.Textbook; +import ditda.backend.domain.commission.category.textbook.entity.TextbookPage; +import ditda.backend.domain.commission.core.dto.response.CategoryDetailResponse; +import ditda.backend.domain.commission.core.handler.CategoryDetail; + +public record TextbookCategoryDetail( + Textbook textbook, + List pages +) implements CategoryDetail { + + @Override + public CategoryDetailResponse toResponse() { + + return new TextbookDetailResponse( + textbook.getTitle(), + textbook.getInstructorName(), + textbook.getSubject(), + pages.stream() + .map(p -> new TextbookDetailResponse.RequiredPage( + p.getPageType(), p.getPageDescription())) + .toList() + ); + } +} diff --git a/src/main/java/ditda/backend/domain/commission/category/textbook/dto/response/TextbookDetailResponse.java b/src/main/java/ditda/backend/domain/commission/category/textbook/dto/response/TextbookDetailResponse.java new file mode 100644 index 00000000..ab46018b --- /dev/null +++ b/src/main/java/ditda/backend/domain/commission/category/textbook/dto/response/TextbookDetailResponse.java @@ -0,0 +1,35 @@ +package ditda.backend.domain.commission.category.textbook.dto.response; + +import java.util.List; + +import ditda.backend.domain.commission.core.dto.response.CategoryDetailResponse; +import ditda.backend.domain.commission.core.entity.enums.PageType; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "교재 외지/내지 카테고리 상세") +public record TextbookDetailResponse( + + @Schema(description = "교재명", example = "수학의 정석") + String textbookName, + + @Schema(description = "강사명", example = "홍길동") + String instructorName, + + @Schema(description = "과목", example = "수학") + String subject, + + @Schema(description = "필요 페이지 정보") + List requiredPages + +) implements CategoryDetailResponse { + + public record RequiredPage( + + @Schema(description = "페이지 종류", example = "INSTRUCTOR_PROFILE") + PageType pageType, + + @Schema(description = "페이지 설명", example = "프로필은 깔끔하게") + String description + ) { + } +} diff --git a/src/main/java/ditda/backend/domain/commission/category/textbook/handler/TextbookCategoryHandler.java b/src/main/java/ditda/backend/domain/commission/category/textbook/handler/TextbookCategoryHandler.java index 36fa90e6..fa3b2583 100644 --- a/src/main/java/ditda/backend/domain/commission/category/textbook/handler/TextbookCategoryHandler.java +++ b/src/main/java/ditda/backend/domain/commission/category/textbook/handler/TextbookCategoryHandler.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Component; +import ditda.backend.domain.commission.category.textbook.dto.TextbookCategoryDetail; import ditda.backend.domain.commission.category.textbook.entity.Textbook; import ditda.backend.domain.commission.category.textbook.entity.TextbookPage; import ditda.backend.domain.commission.category.textbook.repository.TextbookPageRepository; @@ -13,6 +14,7 @@ import ditda.backend.domain.commission.core.entity.Commission; import ditda.backend.domain.commission.core.entity.enums.CategoryType; import ditda.backend.domain.commission.core.exception.CommissionErrorCode; +import ditda.backend.domain.commission.core.handler.CategoryDetail; import ditda.backend.domain.commission.core.handler.CommissionCategoryHandler; import ditda.backend.global.apipayload.exception.GeneralException; import lombok.RequiredArgsConstructor; @@ -67,4 +69,15 @@ public void saveDetail(Commission commission, CommissionCreateRequest request) { .toList(); textbookPageRepository.saveAll(pages); } + + @Override + public CategoryDetail loadDetail(Long commissionId) { + + Textbook textbook = textbookRepository.findById(commissionId) + .orElseThrow(() -> new IllegalStateException("Textbook not found for commissionId=" + commissionId)); + + List pages = textbookPageRepository.findByCommissionId(commissionId); + + return new TextbookCategoryDetail(textbook, pages); + } } diff --git a/src/main/java/ditda/backend/domain/commission/core/dto/response/CategoryDetailResponse.java b/src/main/java/ditda/backend/domain/commission/core/dto/response/CategoryDetailResponse.java new file mode 100644 index 00000000..f42fc56a --- /dev/null +++ b/src/main/java/ditda/backend/domain/commission/core/dto/response/CategoryDetailResponse.java @@ -0,0 +1,7 @@ +package ditda.backend.domain.commission.core.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "카테고리별 상세 정보") +public interface CategoryDetailResponse { +} diff --git a/src/main/java/ditda/backend/domain/commission/core/handler/CategoryDetail.java b/src/main/java/ditda/backend/domain/commission/core/handler/CategoryDetail.java new file mode 100644 index 00000000..6bdf0be1 --- /dev/null +++ b/src/main/java/ditda/backend/domain/commission/core/handler/CategoryDetail.java @@ -0,0 +1,8 @@ +package ditda.backend.domain.commission.core.handler; + +import ditda.backend.domain.commission.core.dto.response.CategoryDetailResponse; + +public interface CategoryDetail { + + CategoryDetailResponse toResponse(); +} diff --git a/src/main/java/ditda/backend/domain/commission/core/handler/CommissionCategoryHandler.java b/src/main/java/ditda/backend/domain/commission/core/handler/CommissionCategoryHandler.java index 2db28776..22a5398c 100644 --- a/src/main/java/ditda/backend/domain/commission/core/handler/CommissionCategoryHandler.java +++ b/src/main/java/ditda/backend/domain/commission/core/handler/CommissionCategoryHandler.java @@ -17,4 +17,7 @@ public interface CommissionCategoryHandler { // 카테고리별 전용 저장 void saveDetail(Commission commission, CommissionCreateRequest request); + + // 카테고리별 상세 조회 + CategoryDetail loadDetail(Long commissionId); } From 3b1ee455f11513749e1d812c17dd62af438fc4a9 Mon Sep 17 00:00:00 2001 From: fervovita Date: Mon, 29 Jun 2026 15:39:50 +0900 Subject: [PATCH 3/6] =?UTF-8?q?Feat(commission):=20=EC=99=B8=EC=A3=BC=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/controller/CommissionController.java | 35 ++++++ .../commission/core/dto/CommissionDetail.java | 19 +++ .../response/CommissionDetailResponse.java | 114 ++++++++++++++++++ .../core/facade/CommissionFacade.java | 54 +++++++++ .../core/mapper/CommissionDetailMapper.java | 97 +++++++++++++++ .../core/service/CommissionService.java | 52 ++++++++ .../designer/exception/DesignerErrorCode.java | 3 +- .../designer/service/DesignerService.java | 21 ++++ 8 files changed, 394 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ditda/backend/domain/commission/core/controller/CommissionController.java create mode 100644 src/main/java/ditda/backend/domain/commission/core/dto/CommissionDetail.java create mode 100644 src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java create mode 100644 src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java create mode 100644 src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java create mode 100644 src/main/java/ditda/backend/domain/commission/core/service/CommissionService.java create mode 100644 src/main/java/ditda/backend/domain/designer/service/DesignerService.java diff --git a/src/main/java/ditda/backend/domain/commission/core/controller/CommissionController.java b/src/main/java/ditda/backend/domain/commission/core/controller/CommissionController.java new file mode 100644 index 00000000..0af63011 --- /dev/null +++ b/src/main/java/ditda/backend/domain/commission/core/controller/CommissionController.java @@ -0,0 +1,35 @@ +package ditda.backend.domain.commission.core.controller; + +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; + +import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse; +import ditda.backend.domain.commission.core.facade.CommissionFacade; +import ditda.backend.global.apipayload.response.ApiResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/v1/commissions") +@RequiredArgsConstructor +@Tag(name = "Commission", description = "외주 상세 조회 API") +public class CommissionController { + + private final CommissionFacade commissionFacade; + + @Operation(summary = "외주 상세 조회", description = "**[외주 조회]** 외주 상세 정보를 조회합니다.") + @GetMapping("/{commissionId}") + public ApiResponse getCommissionDetail( + @AuthenticationPrincipal Long userId, + @PathVariable Long commissionId + ) { + + CommissionDetailResponse response = commissionFacade.getCommissionDetail(userId, commissionId); + + return ApiResponse.onSuccess("외주 상세 조회 성공", response); + } +} diff --git a/src/main/java/ditda/backend/domain/commission/core/dto/CommissionDetail.java b/src/main/java/ditda/backend/domain/commission/core/dto/CommissionDetail.java new file mode 100644 index 00000000..93c8e651 --- /dev/null +++ b/src/main/java/ditda/backend/domain/commission/core/dto/CommissionDetail.java @@ -0,0 +1,19 @@ +package ditda.backend.domain.commission.core.dto; + +import java.util.List; + +import ditda.backend.domain.commission.core.entity.Commission; +import ditda.backend.domain.commission.core.entity.CommissionColor; +import ditda.backend.domain.commission.core.entity.CommissionConcept; +import ditda.backend.domain.commission.core.entity.CommissionFile; +import ditda.backend.domain.commission.core.handler.CategoryDetail; + +public record CommissionDetail( + Commission commission, + List concepts, + List colors, + List files, + CategoryDetail categoryDetail +) { + +} diff --git a/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java b/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java new file mode 100644 index 00000000..f5e59dc7 --- /dev/null +++ b/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java @@ -0,0 +1,114 @@ +package ditda.backend.domain.commission.core.dto.response; + +import java.time.LocalDate; +import java.util.List; + +import ditda.backend.domain.commission.core.entity.enums.CategoryType; +import ditda.backend.domain.commission.core.entity.enums.ColorRole; +import ditda.backend.domain.commission.core.entity.enums.ColorSelectionMode; +import ditda.backend.domain.commission.core.entity.enums.CommissionStatus; +import ditda.backend.domain.commission.core.entity.enums.ConceptTag; +import ditda.backend.domain.commission.core.entity.enums.FileKind; +import ditda.backend.domain.commission.core.entity.enums.PageSize; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "외주 상세 정보 응답") +public record CommissionDetailResponse( + + @Schema(description = "외주 ID", example = "1") + Long commissionId, + + @Schema(description = "제목", example = "수학의 정석 - 수학") + String title, + + @Schema(description = "카테고리", example = "FLYER_TEXTBOOK_COVER_INNER") + CategoryType category, + + @Schema(description = "상태", example = "PENDING") + CommissionStatus status, + + @Schema(description = "디자인 정보") + DesignInfo designInfo, + + @Schema(description = "카테고리별 상세 정보") + CategoryDetailResponse categoryDetail, + + @Schema(description = "첨부 파일 목록") + List files, + + @Schema(description = "마감일 정보") + DateInfo dateInfo, + + @Schema(description = "가격 정보") + PriceInfo priceInfo +) { + @Schema(description = "디자인 정보") + public record DesignInfo( + + @Schema(description = "사이즈", example = "A4") + PageSize pageSize, + + @Schema(description = "컨셉 정보") + List concepts, + + @Schema(description = "추가 컨셉 설명", example = "초등 저학년 대상이라 너무 무겁지 않게") + String additionalConcept, + + @Schema(description = "색상 선택 모드", example = "USER_SELECTED") + ColorSelectionMode colorSelectionMode, + + @Schema(description = "색상 정보") + List colors + ) { + + @Schema(description = "색상 정보") + public record ColorInfo( + + @Schema(description = "색상 역할", example = "MAIN") + ColorRole role, + + @Schema(description = "색상 코드(#RRGGBB)", example = "#194D33") + String colorCode + ) { + } + } + + @Schema(description = "첨부 파일 정보") + public record FileInfo( + + @Schema(description = "파일 종류", example = "MATERIAL") + FileKind fileKind, + + @Schema(description = "첨부 파일 URL", example = "https://example.com/commission/file.pdf") + List fileUrls, + + @Schema(description = "파일 설명", example = "img.04는 강사 프로필 이미지") + String description + ) { + } + + @Schema(description = "마감일 정보") + public record DateInfo( + + @Schema(description = "지원 마감일", example = "2026-06-08") + LocalDate applicationDeadline, + + @Schema(description = "1차 시안 마감일", example = "2026-06-15") + LocalDate firstDraftDeadline, + + @Schema(description = "최종 마감일", example = "2026-06-23") + LocalDate finalDeadline + ) { + } + + @Schema(description = "가격 정보") + public record PriceInfo( + + @Schema(description = "기본금", example = "40000") + int baseAmount, + + @Schema(description = "최대 수령액", example = "320000") + int maxAmount + ) { + } +} diff --git a/src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java b/src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java new file mode 100644 index 00000000..d0f41c78 --- /dev/null +++ b/src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java @@ -0,0 +1,54 @@ +package ditda.backend.domain.commission.core.facade; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import ditda.backend.domain.commission.core.dto.CommissionDetail; +import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse; +import ditda.backend.domain.commission.core.entity.enums.CategoryType; +import ditda.backend.domain.commission.core.mapper.CommissionDetailMapper; +import ditda.backend.domain.commission.core.policy.CommissionPricePolicy; +import ditda.backend.domain.commission.core.service.CommissionService; +import ditda.backend.domain.designer.entity.Designer; +import ditda.backend.domain.designer.service.DesignerService; +import ditda.backend.domain.user.entity.User; +import ditda.backend.domain.user.entity.enums.UserRole; +import ditda.backend.domain.user.service.UserService; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class CommissionFacade { + + private final CommissionService commissionService; + private final UserService userService; + private final DesignerService designerService; + private final CommissionPricePolicy commissionPricePolicy; + private final CommissionDetailMapper commissionDetailMapper; + + // 외주 상세 정보 조회 + public CommissionDetailResponse getCommissionDetail(Long userId, Long commissionId) { + + // 상세 정보 조회 + CommissionDetail detail = commissionService.getDetail(commissionId); + + // Designer이면 가격 정보 표시 + User user = userService.findById(userId); + + CommissionDetailResponse.PriceInfo priceInfo = null; + if (user.getRole() == UserRole.DESIGNER) { + Designer designer = designerService.findById(userId); + priceInfo = buildPriceInfo(detail.commission().getCategoryType(), designer); + } + + return commissionDetailMapper.toResponse(detail, priceInfo); + } + + private CommissionDetailResponse.PriceInfo buildPriceInfo(CategoryType category, Designer designer) { + int baseAmount = commissionPricePolicy.calculateDraftSubmissionReward(category, designer.getLevel()); + int maxAmount = commissionPricePolicy.calculateFinalPayout(category, designer.getLevel()); + + return new CommissionDetailResponse.PriceInfo(baseAmount, maxAmount); + } +} diff --git a/src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java b/src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java new file mode 100644 index 00000000..4712f4c6 --- /dev/null +++ b/src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java @@ -0,0 +1,97 @@ +package ditda.backend.domain.commission.core.mapper; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Component; + +import ditda.backend.domain.commission.core.dto.CommissionDetail; +import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse; +import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.DateInfo; +import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.DesignInfo; +import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.FileInfo; +import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.PriceInfo; +import ditda.backend.domain.commission.core.entity.Commission; +import ditda.backend.domain.commission.core.entity.CommissionColor; +import ditda.backend.domain.commission.core.entity.CommissionConcept; +import ditda.backend.domain.commission.core.entity.CommissionFile; +import ditda.backend.domain.commission.core.entity.enums.ConceptTag; +import ditda.backend.domain.commission.core.entity.enums.FileKind; +import ditda.backend.global.s3.manager.S3PresignedUrlGenerator; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class CommissionDetailMapper { + + private final S3PresignedUrlGenerator s3PresignedUrlGenerator; + + public CommissionDetailResponse toResponse(CommissionDetail detail, PriceInfo priceInfo) { + Commission commission = detail.commission(); + + return new CommissionDetailResponse( + commission.getId(), + commission.getTitle(), + commission.getCategoryType(), + commission.getStatus(), + toDesignInfo(commission, detail.concepts(), detail.colors()), + detail.categoryDetail().toResponse(), + toFileInfos(detail.files()), + toDateInfo(commission), + priceInfo + ); + } + + private DesignInfo toDesignInfo( + Commission commission, + List concepts, + List colors + ) { + + List conceptTags = concepts.stream() + .map(CommissionConcept::getConcept) + .toList(); + + List colorInfos = colors.stream() + .map(c -> new DesignInfo.ColorInfo(c.getRole(), c.getColorCode())) + .toList(); + + return new DesignInfo( + commission.getPageSize(), + conceptTags, + commission.getAdditionalConcept(), + commission.getColorSelectionMode(), + colorInfos + ); + } + + private List toFileInfos(List files) { + + Map> groupedFiles = files.stream() + .collect(Collectors.groupingBy(CommissionFile::getFileKind)); + + return groupedFiles.entrySet().stream() + .map(e -> { + List urls = e.getValue().stream() + .map(this::resolveUrl) + .toList(); + + String description = e.getValue().getFirst().getDescription(); + return new FileInfo(e.getKey(), urls, description); + }) + .toList(); + } + + private DateInfo toDateInfo(Commission commission) { + return new DateInfo( + commission.getApplicationDeadline(), + commission.getFirstDraftDeadline(), + commission.getFinalDeadline() + ); + } + + private String resolveUrl(CommissionFile file) { + return s3PresignedUrlGenerator.generatePrivateGetUrl(file.getFileUrl()); + } +} diff --git a/src/main/java/ditda/backend/domain/commission/core/service/CommissionService.java b/src/main/java/ditda/backend/domain/commission/core/service/CommissionService.java new file mode 100644 index 00000000..c7d3aa70 --- /dev/null +++ b/src/main/java/ditda/backend/domain/commission/core/service/CommissionService.java @@ -0,0 +1,52 @@ +package ditda.backend.domain.commission.core.service; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import ditda.backend.domain.commission.core.dto.CommissionDetail; +import ditda.backend.domain.commission.core.entity.Commission; +import ditda.backend.domain.commission.core.entity.CommissionColor; +import ditda.backend.domain.commission.core.entity.CommissionConcept; +import ditda.backend.domain.commission.core.entity.CommissionFile; +import ditda.backend.domain.commission.core.exception.CommissionErrorCode; +import ditda.backend.domain.commission.core.handler.CategoryDetail; +import ditda.backend.domain.commission.core.handler.CommissionCategoryHandler; +import ditda.backend.domain.commission.core.handler.CommissionCategoryHandlerResolver; +import ditda.backend.domain.commission.core.repository.CommissionColorRepository; +import ditda.backend.domain.commission.core.repository.CommissionConceptRepository; +import ditda.backend.domain.commission.core.repository.CommissionFileRepository; +import ditda.backend.domain.commission.core.repository.CommissionRepository; +import ditda.backend.global.apipayload.exception.GeneralException; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class CommissionService { + + private final CommissionRepository commissionRepository; + private final CommissionConceptRepository commissionConceptRepository; + private final CommissionColorRepository commissionColorRepository; + private final CommissionFileRepository commissionFileRepository; + private final CommissionCategoryHandlerResolver handlerResolver; + + public CommissionDetail getDetail(Long commissionId) { + + // 외주 조회 + Commission commission = commissionRepository.findById(commissionId) + .orElseThrow(() -> new GeneralException(CommissionErrorCode.COMMISSION_NOT_FOUND)); + + // 상세 정보 조회 + List concepts = commissionConceptRepository.findByCommissionId(commissionId); + List colors = commissionColorRepository.findByCommissionId(commissionId); + List files = commissionFileRepository.findByCommissionId(commissionId); + + // 카테고리 상세 정보 조회 + CommissionCategoryHandler handler = handlerResolver.resolve(commission.getCategoryType()); + CategoryDetail categoryDetail = handler.loadDetail(commissionId); + + return new CommissionDetail(commission, concepts, colors, files, categoryDetail); + } +} diff --git a/src/main/java/ditda/backend/domain/designer/exception/DesignerErrorCode.java b/src/main/java/ditda/backend/domain/designer/exception/DesignerErrorCode.java index f74d3041..46493831 100644 --- a/src/main/java/ditda/backend/domain/designer/exception/DesignerErrorCode.java +++ b/src/main/java/ditda/backend/domain/designer/exception/DesignerErrorCode.java @@ -10,7 +10,8 @@ @AllArgsConstructor public enum DesignerErrorCode implements BaseErrorCode { - PORTFOLIO_FILE_LIMIT_EXCEEDED(HttpStatus.BAD_REQUEST, "DESIGNER_400_01", "포트폴리오 파일은 최대 3개까지 업로드 가능합니다."); + PORTFOLIO_FILE_LIMIT_EXCEEDED(HttpStatus.BAD_REQUEST, "DESIGNER_400_01", "포트폴리오 파일은 최대 3개까지 업로드 가능합니다."), + DESIGNER_NOT_FOUND(HttpStatus.NOT_FOUND, "DESIGNER_404_01", "디자이너를 찾을 수 없습니다."); private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/ditda/backend/domain/designer/service/DesignerService.java b/src/main/java/ditda/backend/domain/designer/service/DesignerService.java new file mode 100644 index 00000000..077cb6f9 --- /dev/null +++ b/src/main/java/ditda/backend/domain/designer/service/DesignerService.java @@ -0,0 +1,21 @@ +package ditda.backend.domain.designer.service; + +import org.springframework.stereotype.Service; + +import ditda.backend.domain.designer.entity.Designer; +import ditda.backend.domain.designer.exception.DesignerErrorCode; +import ditda.backend.domain.designer.repository.DesignerRepository; +import ditda.backend.global.apipayload.exception.GeneralException; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class DesignerService { + + private final DesignerRepository designerRepository; + + public Designer findById(Long designerId) { + return designerRepository.findById(designerId) + .orElseThrow(() -> new GeneralException(DesignerErrorCode.DESIGNER_NOT_FOUND)); + } +} From 4afe75f3901b58d43e98ae510bc8d5e754b3cee8 Mon Sep 17 00:00:00 2001 From: fervovita Date: Tue, 30 Jun 2026 00:57:54 +0900 Subject: [PATCH 4/6] =?UTF-8?q?Docs(commission):=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20=EC=83=81=EC=84=B8=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=EC=97=90=20oneOf=20=EC=8A=A4=ED=82=A4=EB=A7=88=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/dto/response/CategoryDetailResponse.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/ditda/backend/domain/commission/core/dto/response/CategoryDetailResponse.java b/src/main/java/ditda/backend/domain/commission/core/dto/response/CategoryDetailResponse.java index f42fc56a..712736d8 100644 --- a/src/main/java/ditda/backend/domain/commission/core/dto/response/CategoryDetailResponse.java +++ b/src/main/java/ditda/backend/domain/commission/core/dto/response/CategoryDetailResponse.java @@ -1,7 +1,11 @@ package ditda.backend.domain.commission.core.dto.response; +import ditda.backend.domain.commission.category.textbook.dto.response.TextbookDetailResponse; import io.swagger.v3.oas.annotations.media.Schema; -@Schema(description = "카테고리별 상세 정보") +@Schema( + description = "카테고리별 상세 정보", + oneOf = {TextbookDetailResponse.class} // 카테고리 추가시 여기에 추가 +) public interface CategoryDetailResponse { } From cef7e16a154c1e54948151c98cef40989feb9057 Mon Sep 17 00:00:00 2001 From: Jonghun Lim Date: Tue, 30 Jun 2026 21:43:02 +0900 Subject: [PATCH 5/6] =?UTF-8?q?Refactor(Commission):=20=EA=B0=80=EA=B2=A9?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20CommissionPricePolicy=EB=A1=9C?= =?UTF-8?q?=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/commission/core/dto/PriceInfo.java | 7 ++++ .../response/CommissionDetailResponse.java | 12 +------ .../entity/enums/CommissionAmountPolicy.java | 34 ------------------- .../core/facade/CommissionFacade.java | 16 ++++----- .../core/facade/DesignerCommissionFacade.java | 2 +- .../core/mapper/CommissionDetailMapper.java | 2 +- .../designer/exception/DesignerErrorCode.java | 1 - .../designer/service/DesignerService.java | 2 +- 8 files changed, 17 insertions(+), 59 deletions(-) delete mode 100644 src/main/java/ditda/backend/domain/commission/core/entity/enums/CommissionAmountPolicy.java diff --git a/src/main/java/ditda/backend/domain/commission/core/dto/PriceInfo.java b/src/main/java/ditda/backend/domain/commission/core/dto/PriceInfo.java index 5a9f0ef1..e63178dd 100644 --- a/src/main/java/ditda/backend/domain/commission/core/dto/PriceInfo.java +++ b/src/main/java/ditda/backend/domain/commission/core/dto/PriceInfo.java @@ -1,7 +1,14 @@ package ditda.backend.domain.commission.core.dto; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "가격 정보") public record PriceInfo( + + @Schema(description = "기본금", example = "60000") int baseAmount, + + @Schema(description = "최대 수령액", example = "210000") int maxAmount ) { } diff --git a/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java b/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java index f5e59dc7..44bdd924 100644 --- a/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java +++ b/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java @@ -3,6 +3,7 @@ import java.time.LocalDate; import java.util.List; +import ditda.backend.domain.commission.core.dto.PriceInfo; import ditda.backend.domain.commission.core.entity.enums.CategoryType; import ditda.backend.domain.commission.core.entity.enums.ColorRole; import ditda.backend.domain.commission.core.entity.enums.ColorSelectionMode; @@ -100,15 +101,4 @@ public record DateInfo( LocalDate finalDeadline ) { } - - @Schema(description = "가격 정보") - public record PriceInfo( - - @Schema(description = "기본금", example = "40000") - int baseAmount, - - @Schema(description = "최대 수령액", example = "320000") - int maxAmount - ) { - } } diff --git a/src/main/java/ditda/backend/domain/commission/core/entity/enums/CommissionAmountPolicy.java b/src/main/java/ditda/backend/domain/commission/core/entity/enums/CommissionAmountPolicy.java deleted file mode 100644 index 8d5f42b6..00000000 --- a/src/main/java/ditda/backend/domain/commission/core/entity/enums/CommissionAmountPolicy.java +++ /dev/null @@ -1,34 +0,0 @@ -package ditda.backend.domain.commission.core.entity.enums; - -import java.util.Arrays; - -import ditda.backend.domain.designer.entity.enums.DesignerLevel; -import ditda.backend.domain.designer.exception.DesignerErrorCode; -import ditda.backend.global.apipayload.exception.GeneralException; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum CommissionAmountPolicy { - - LEVEL_1(DesignerLevel.LEVEL_1, 40_000), - LEVEL_2(DesignerLevel.LEVEL_2, 50_000), - LEVEL_3(DesignerLevel.LEVEL_3, 60_000); - - private static final int MAX_AMOUNT_BONUS = 150_000; - - private final DesignerLevel level; - private final int baseAmount; - - public int getMaxAmount() { - return baseAmount + MAX_AMOUNT_BONUS; - } - - public static CommissionAmountPolicy from(DesignerLevel level) { - return Arrays.stream(values()) - .filter(policy -> policy.level == level) - .findFirst() - .orElseThrow(() -> new GeneralException(DesignerErrorCode.DESIGNER_LEVEL_POLICY_MISSING)); - } -} diff --git a/src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java b/src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java index d0f41c78..1de87c0a 100644 --- a/src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java +++ b/src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java @@ -4,8 +4,8 @@ import org.springframework.transaction.annotation.Transactional; import ditda.backend.domain.commission.core.dto.CommissionDetail; +import ditda.backend.domain.commission.core.dto.PriceInfo; import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse; -import ditda.backend.domain.commission.core.entity.enums.CategoryType; import ditda.backend.domain.commission.core.mapper.CommissionDetailMapper; import ditda.backend.domain.commission.core.policy.CommissionPricePolicy; import ditda.backend.domain.commission.core.service.CommissionService; @@ -36,19 +36,15 @@ public CommissionDetailResponse getCommissionDetail(Long userId, Long commission // Designer이면 가격 정보 표시 User user = userService.findById(userId); - CommissionDetailResponse.PriceInfo priceInfo = null; + PriceInfo priceInfo = null; if (user.getRole() == UserRole.DESIGNER) { Designer designer = designerService.findById(userId); - priceInfo = buildPriceInfo(detail.commission().getCategoryType(), designer); + priceInfo = commissionPricePolicy.getPriceInfo( + detail.commission().getCategoryType(), + designer.getLevel() + ); } return commissionDetailMapper.toResponse(detail, priceInfo); } - - private CommissionDetailResponse.PriceInfo buildPriceInfo(CategoryType category, Designer designer) { - int baseAmount = commissionPricePolicy.calculateDraftSubmissionReward(category, designer.getLevel()); - int maxAmount = commissionPricePolicy.calculateFinalPayout(category, designer.getLevel()); - - return new CommissionDetailResponse.PriceInfo(baseAmount, maxAmount); - } } diff --git a/src/main/java/ditda/backend/domain/commission/core/facade/DesignerCommissionFacade.java b/src/main/java/ditda/backend/domain/commission/core/facade/DesignerCommissionFacade.java index 37bab311..55361695 100644 --- a/src/main/java/ditda/backend/domain/commission/core/facade/DesignerCommissionFacade.java +++ b/src/main/java/ditda/backend/domain/commission/core/facade/DesignerCommissionFacade.java @@ -29,7 +29,7 @@ public class DesignerCommissionFacade { @Transactional(readOnly = true) public CommissionListResponse getRecruitingCommissionList(Long designerId, Pageable pageable) { - Designer designer = designerService.getById(designerId); + Designer designer = designerService.findById(designerId); DesignerLevel level = designer.getLevel(); Page commissions = designerCommissionService.getRecruitingCommissions(pageable); diff --git a/src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java b/src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java index 4712f4c6..e9a03202 100644 --- a/src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java +++ b/src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java @@ -7,11 +7,11 @@ import org.springframework.stereotype.Component; import ditda.backend.domain.commission.core.dto.CommissionDetail; +import ditda.backend.domain.commission.core.dto.PriceInfo; import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse; import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.DateInfo; import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.DesignInfo; import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.FileInfo; -import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.PriceInfo; import ditda.backend.domain.commission.core.entity.Commission; import ditda.backend.domain.commission.core.entity.CommissionColor; import ditda.backend.domain.commission.core.entity.CommissionConcept; diff --git a/src/main/java/ditda/backend/domain/designer/exception/DesignerErrorCode.java b/src/main/java/ditda/backend/domain/designer/exception/DesignerErrorCode.java index 667a2b80..dcf849ee 100644 --- a/src/main/java/ditda/backend/domain/designer/exception/DesignerErrorCode.java +++ b/src/main/java/ditda/backend/domain/designer/exception/DesignerErrorCode.java @@ -11,7 +11,6 @@ public enum DesignerErrorCode implements BaseErrorCode { DESIGNER_NOT_FOUND(HttpStatus.NOT_FOUND, "DESIGNER_404_01", "존재하지 않는 디자이너입니다."), - DESIGNER_LEVEL_POLICY_MISSING(HttpStatus.INTERNAL_SERVER_ERROR, "DESIGNER_500_01", "존재하지 않는 디자이너 레벨 정책입니다."), PORTFOLIO_FILE_LIMIT_EXCEEDED(HttpStatus.BAD_REQUEST, "DESIGNER_400_01", "포트폴리오 파일은 최대 3개까지 업로드 가능합니다."); private final HttpStatus httpStatus; diff --git a/src/main/java/ditda/backend/domain/designer/service/DesignerService.java b/src/main/java/ditda/backend/domain/designer/service/DesignerService.java index ff5adc25..6b601832 100644 --- a/src/main/java/ditda/backend/domain/designer/service/DesignerService.java +++ b/src/main/java/ditda/backend/domain/designer/service/DesignerService.java @@ -16,7 +16,7 @@ public class DesignerService { private final DesignerRepository designerRepository; @Transactional(readOnly = true) - public Designer getById(Long designerId) { + public Designer findById(Long designerId) { return designerRepository.findById(designerId) .orElseThrow(() -> new GeneralException(DesignerErrorCode.DESIGNER_NOT_FOUND)); } From 19bf6dc1049679d8b0d1be22e128c426a722c707 Mon Sep 17 00:00:00 2001 From: fervovita Date: Wed, 1 Jul 2026 01:26:32 +0900 Subject: [PATCH 6/6] =?UTF-8?q?Refactor(commission):=20=EB=82=B4=EB=B6=80?= =?UTF-8?q?=20=EA=B0=80=EA=B2=A9=20=EA=B0=9D=EC=B2=B4=EC=99=80=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=20DTO=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commission/core/dto/PriceDetail.java | 8 ++++++++ .../domain/commission/core/dto/PriceInfo.java | 14 -------------- .../dto/response/CommissionDetailResponse.java | 12 +++++++++++- .../dto/response/CommissionListResponse.java | 12 ++++++------ .../core/facade/CommissionFacade.java | 8 ++++---- .../core/facade/DesignerCommissionFacade.java | 8 ++++---- .../core/mapper/CommissionDetailMapper.java | 18 +++++++++++++++--- .../core/policy/CommissionPricePolicy.java | 6 +++--- 8 files changed, 51 insertions(+), 35 deletions(-) create mode 100644 src/main/java/ditda/backend/domain/commission/core/dto/PriceDetail.java delete mode 100644 src/main/java/ditda/backend/domain/commission/core/dto/PriceInfo.java diff --git a/src/main/java/ditda/backend/domain/commission/core/dto/PriceDetail.java b/src/main/java/ditda/backend/domain/commission/core/dto/PriceDetail.java new file mode 100644 index 00000000..b8246f36 --- /dev/null +++ b/src/main/java/ditda/backend/domain/commission/core/dto/PriceDetail.java @@ -0,0 +1,8 @@ +package ditda.backend.domain.commission.core.dto; + +public record PriceDetail( + + int baseAmount, + int maxAmount +) { +} diff --git a/src/main/java/ditda/backend/domain/commission/core/dto/PriceInfo.java b/src/main/java/ditda/backend/domain/commission/core/dto/PriceInfo.java deleted file mode 100644 index e63178dd..00000000 --- a/src/main/java/ditda/backend/domain/commission/core/dto/PriceInfo.java +++ /dev/null @@ -1,14 +0,0 @@ -package ditda.backend.domain.commission.core.dto; - -import io.swagger.v3.oas.annotations.media.Schema; - -@Schema(description = "가격 정보") -public record PriceInfo( - - @Schema(description = "기본금", example = "60000") - int baseAmount, - - @Schema(description = "최대 수령액", example = "210000") - int maxAmount -) { -} diff --git a/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java b/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java index 44bdd924..baccae33 100644 --- a/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java +++ b/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionDetailResponse.java @@ -3,7 +3,6 @@ import java.time.LocalDate; import java.util.List; -import ditda.backend.domain.commission.core.dto.PriceInfo; import ditda.backend.domain.commission.core.entity.enums.CategoryType; import ditda.backend.domain.commission.core.entity.enums.ColorRole; import ditda.backend.domain.commission.core.entity.enums.ColorSelectionMode; @@ -101,4 +100,15 @@ public record DateInfo( LocalDate finalDeadline ) { } + + @Schema(description = "가격 정보") + public record PriceInfo( + + @Schema(description = "기본금", example = "60000") + int baseAmount, + + @Schema(description = "최대 수령액", example = "210000") + int maxAmount + ) { + } } diff --git a/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionListResponse.java b/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionListResponse.java index c8d6364e..babd1527 100644 --- a/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionListResponse.java +++ b/src/main/java/ditda/backend/domain/commission/core/dto/response/CommissionListResponse.java @@ -6,7 +6,7 @@ import org.springframework.data.domain.Page; -import ditda.backend.domain.commission.core.dto.PriceInfo; +import ditda.backend.domain.commission.core.dto.PriceDetail; import ditda.backend.domain.commission.core.entity.Commission; import ditda.backend.domain.commission.core.entity.enums.CategoryType; import io.swagger.v3.oas.annotations.media.Schema; @@ -30,9 +30,9 @@ public record CommissionListResponse( int totalPages ) { - public static CommissionListResponse from(Page page, Map priceInfos) { + public static CommissionListResponse from(Page page, Map priceDetails) { List items = page.getContent().stream() - .map(c -> CommissionResponse.from(c, priceInfos.get(c.getId()))) + .map(c -> CommissionResponse.from(c, priceDetails.get(c.getId()))) .toList(); return new CommissionListResponse( @@ -66,14 +66,14 @@ public record CommissionResponse( int maxAmount ) { - private static CommissionResponse from(Commission commission, PriceInfo priceInfo) { + private static CommissionResponse from(Commission commission, PriceDetail priceDetail) { return new CommissionResponse( commission.getId(), commission.getApplicationDeadline(), commission.getCategoryType(), commission.getTitle(), - priceInfo.baseAmount(), - priceInfo.maxAmount() + priceDetail.baseAmount(), + priceDetail.maxAmount() ); } } diff --git a/src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java b/src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java index 1de87c0a..8149436c 100644 --- a/src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java +++ b/src/main/java/ditda/backend/domain/commission/core/facade/CommissionFacade.java @@ -4,7 +4,7 @@ import org.springframework.transaction.annotation.Transactional; import ditda.backend.domain.commission.core.dto.CommissionDetail; -import ditda.backend.domain.commission.core.dto.PriceInfo; +import ditda.backend.domain.commission.core.dto.PriceDetail; import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse; import ditda.backend.domain.commission.core.mapper.CommissionDetailMapper; import ditda.backend.domain.commission.core.policy.CommissionPricePolicy; @@ -36,15 +36,15 @@ public CommissionDetailResponse getCommissionDetail(Long userId, Long commission // Designer이면 가격 정보 표시 User user = userService.findById(userId); - PriceInfo priceInfo = null; + PriceDetail priceDetail = null; if (user.getRole() == UserRole.DESIGNER) { Designer designer = designerService.findById(userId); - priceInfo = commissionPricePolicy.getPriceInfo( + priceDetail = commissionPricePolicy.getPriceDetail( detail.commission().getCategoryType(), designer.getLevel() ); } - return commissionDetailMapper.toResponse(detail, priceInfo); + return commissionDetailMapper.toResponse(detail, priceDetail); } } diff --git a/src/main/java/ditda/backend/domain/commission/core/facade/DesignerCommissionFacade.java b/src/main/java/ditda/backend/domain/commission/core/facade/DesignerCommissionFacade.java index 55361695..12eda122 100644 --- a/src/main/java/ditda/backend/domain/commission/core/facade/DesignerCommissionFacade.java +++ b/src/main/java/ditda/backend/domain/commission/core/facade/DesignerCommissionFacade.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import ditda.backend.domain.commission.core.dto.PriceInfo; +import ditda.backend.domain.commission.core.dto.PriceDetail; import ditda.backend.domain.commission.core.dto.response.CommissionListResponse; import ditda.backend.domain.commission.core.entity.Commission; import ditda.backend.domain.commission.core.policy.CommissionPricePolicy; @@ -33,12 +33,12 @@ public CommissionListResponse getRecruitingCommissionList(Long designerId, Pagea DesignerLevel level = designer.getLevel(); Page commissions = designerCommissionService.getRecruitingCommissions(pageable); - Map priceInfos = commissions.getContent().stream() + Map priceDetails = commissions.getContent().stream() .collect(Collectors.toMap( Commission::getId, - c -> commissionPricePolicy.getPriceInfo(c.getCategoryType(), level) + c -> commissionPricePolicy.getPriceDetail(c.getCategoryType(), level) )); - return CommissionListResponse.from(commissions, priceInfos); + return CommissionListResponse.from(commissions, priceDetails); } } diff --git a/src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java b/src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java index e9a03202..d809c19d 100644 --- a/src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java +++ b/src/main/java/ditda/backend/domain/commission/core/mapper/CommissionDetailMapper.java @@ -7,11 +7,12 @@ import org.springframework.stereotype.Component; import ditda.backend.domain.commission.core.dto.CommissionDetail; -import ditda.backend.domain.commission.core.dto.PriceInfo; +import ditda.backend.domain.commission.core.dto.PriceDetail; import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse; import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.DateInfo; import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.DesignInfo; import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.FileInfo; +import ditda.backend.domain.commission.core.dto.response.CommissionDetailResponse.PriceInfo; import ditda.backend.domain.commission.core.entity.Commission; import ditda.backend.domain.commission.core.entity.CommissionColor; import ditda.backend.domain.commission.core.entity.CommissionConcept; @@ -27,7 +28,7 @@ public class CommissionDetailMapper { private final S3PresignedUrlGenerator s3PresignedUrlGenerator; - public CommissionDetailResponse toResponse(CommissionDetail detail, PriceInfo priceInfo) { + public CommissionDetailResponse toResponse(CommissionDetail detail, PriceDetail priceDetail) { Commission commission = detail.commission(); return new CommissionDetailResponse( @@ -39,7 +40,7 @@ public CommissionDetailResponse toResponse(CommissionDetail detail, PriceInfo pr detail.categoryDetail().toResponse(), toFileInfos(detail.files()), toDateInfo(commission), - priceInfo + toPriceInfo(priceDetail) ); } @@ -91,6 +92,17 @@ private DateInfo toDateInfo(Commission commission) { ); } + private PriceInfo toPriceInfo(PriceDetail priceDetail) { + if (priceDetail == null) { + return null; + } + + return new PriceInfo( + priceDetail.baseAmount(), + priceDetail.maxAmount() + ); + } + private String resolveUrl(CommissionFile file) { return s3PresignedUrlGenerator.generatePrivateGetUrl(file.getFileUrl()); } diff --git a/src/main/java/ditda/backend/domain/commission/core/policy/CommissionPricePolicy.java b/src/main/java/ditda/backend/domain/commission/core/policy/CommissionPricePolicy.java index dd5ca9fd..3ebf5cba 100644 --- a/src/main/java/ditda/backend/domain/commission/core/policy/CommissionPricePolicy.java +++ b/src/main/java/ditda/backend/domain/commission/core/policy/CommissionPricePolicy.java @@ -4,7 +4,7 @@ import org.springframework.stereotype.Component; -import ditda.backend.domain.commission.core.dto.PriceInfo; +import ditda.backend.domain.commission.core.dto.PriceDetail; import ditda.backend.domain.commission.core.entity.enums.CategoryType; import ditda.backend.domain.designer.entity.enums.DesignerLevel; @@ -44,8 +44,8 @@ public int calculateFinalPayout(CategoryType category, DesignerLevel level) { } // 기본금 및 최종금액 policy가 만들어서 반환 - public PriceInfo getPriceInfo(CategoryType category, DesignerLevel level) { - return new PriceInfo( + public PriceDetail getPriceDetail(CategoryType category, DesignerLevel level) { + return new PriceDetail( calculateDraftSubmissionReward(category, level), calculateFinalPayout(category, level) );