diff --git a/src/main/java/ditda/backend/domain/admin/designer/controller/AdminDesignerController.java b/src/main/java/ditda/backend/domain/admin/designer/controller/AdminDesignerController.java index 1d11361..2e2660c 100644 --- a/src/main/java/ditda/backend/domain/admin/designer/controller/AdminDesignerController.java +++ b/src/main/java/ditda/backend/domain/admin/designer/controller/AdminDesignerController.java @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.RestController; import ditda.backend.domain.admin.designer.dto.response.DesignerAccountResponse; +import ditda.backend.domain.admin.designer.dto.response.DesignerPortfolioResponse; import ditda.backend.domain.admin.designer.service.AdminDesignerService; import ditda.backend.global.apipayload.response.ApiResponse; import io.swagger.v3.oas.annotations.Operation; @@ -32,4 +33,16 @@ public ApiResponse getDesignerAccount( return ApiResponse.onSuccess("디자이너 계좌 정보 조회 성공", response); } + + @Operation(summary = "디자이너 포트폴리오 조회", description = "**[어드민]** 디자이너가 가입 시 첨부한 포트폴리오의 presigned URL을 조회합니다.") + @GetMapping("/{designerId}/portfolios") + public ApiResponse getDesignerPortfolios( + @AuthenticationPrincipal Long adminId, + @PathVariable Long designerId + ) { + + DesignerPortfolioResponse response = adminDesignerService.getDesignerPortfolios(adminId, designerId); + + return ApiResponse.onSuccess("디자이너 포트폴리오 조회 성공", response); + } } diff --git a/src/main/java/ditda/backend/domain/admin/designer/dto/response/DesignerPortfolioResponse.java b/src/main/java/ditda/backend/domain/admin/designer/dto/response/DesignerPortfolioResponse.java new file mode 100644 index 0000000..c4b1f43 --- /dev/null +++ b/src/main/java/ditda/backend/domain/admin/designer/dto/response/DesignerPortfolioResponse.java @@ -0,0 +1,21 @@ +package ditda.backend.domain.admin.designer.dto.response; + +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "디자이너 포트폴리오 정보 응답") +public record DesignerPortfolioResponse( + + @Schema(description = "디자이너 ID", example = "1") + Long designerId, + + @Schema(description = "포트폴리오 URL", example = "[\"https://example.com/portfolio/file.pdf\"]") + List portfolioUrls + +) { + + public static DesignerPortfolioResponse of(Long designerId, List portfolioUrls) { + return new DesignerPortfolioResponse(designerId, portfolioUrls); + } +} diff --git a/src/main/java/ditda/backend/domain/admin/designer/mapper/AdminDesignerMapper.java b/src/main/java/ditda/backend/domain/admin/designer/mapper/AdminDesignerMapper.java new file mode 100644 index 0000000..87f5953 --- /dev/null +++ b/src/main/java/ditda/backend/domain/admin/designer/mapper/AdminDesignerMapper.java @@ -0,0 +1,25 @@ +package ditda.backend.domain.admin.designer.mapper; + +import java.util.List; + +import org.springframework.stereotype.Component; + +import ditda.backend.domain.admin.designer.dto.response.DesignerPortfolioResponse; +import ditda.backend.global.s3.manager.S3PresignedUrlGenerator; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class AdminDesignerMapper { + + private final S3PresignedUrlGenerator s3PresignedUrlGenerator; + + public DesignerPortfolioResponse toPortfolioResponse(Long designerId, List portfolioKeys) { + + List portfolioUrls = portfolioKeys.stream() + .map(s3PresignedUrlGenerator::generatePrivateGetUrl) + .toList(); + + return DesignerPortfolioResponse.of(designerId, portfolioUrls); + } +} diff --git a/src/main/java/ditda/backend/domain/admin/designer/service/AdminDesignerService.java b/src/main/java/ditda/backend/domain/admin/designer/service/AdminDesignerService.java index dfde3ff..97197d0 100644 --- a/src/main/java/ditda/backend/domain/admin/designer/service/AdminDesignerService.java +++ b/src/main/java/ditda/backend/domain/admin/designer/service/AdminDesignerService.java @@ -1,11 +1,16 @@ package ditda.backend.domain.admin.designer.service; +import java.util.List; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ditda.backend.domain.admin.designer.dto.response.DesignerAccountResponse; +import ditda.backend.domain.admin.designer.dto.response.DesignerPortfolioResponse; +import ditda.backend.domain.admin.designer.mapper.AdminDesignerMapper; import ditda.backend.domain.designer.entity.Designer; import ditda.backend.domain.designer.service.DesignerService; +import ditda.backend.domain.designer.service.PortfolioService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -16,6 +21,8 @@ public class AdminDesignerService { private final DesignerService designerService; + private final PortfolioService portfolioService; + private final AdminDesignerMapper adminDesignerMapper; // 디자이너 계좌 정보 조회 public DesignerAccountResponse getDesignerAccount(Long adminId, Long designerId) { @@ -27,4 +34,19 @@ public DesignerAccountResponse getDesignerAccount(Long adminId, Long designerId) return DesignerAccountResponse.from(designer); } + + // 디자이너 포트폴리오 조회 + public DesignerPortfolioResponse getDesignerPortfolios(Long adminId, Long designerId) { + + // 디자이너 존재 검증 + designerService.validateExists(designerId); + + // 포트폴리오 key 조회 + List portfolioKeys = portfolioService.getPortfolioKeys(designerId); + + log.info("[Admin Audit] adminId={} accessed designerId={} portfolios (count={})", + adminId, designerId, portfolioKeys.size()); + + return adminDesignerMapper.toPortfolioResponse(designerId, portfolioKeys); + } } diff --git a/src/main/java/ditda/backend/domain/designer/repository/PortfolioRepository.java b/src/main/java/ditda/backend/domain/designer/repository/PortfolioRepository.java index 7288954..0368c0b 100644 --- a/src/main/java/ditda/backend/domain/designer/repository/PortfolioRepository.java +++ b/src/main/java/ditda/backend/domain/designer/repository/PortfolioRepository.java @@ -1,8 +1,12 @@ package ditda.backend.domain.designer.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import ditda.backend.domain.designer.entity.Portfolio; public interface PortfolioRepository extends JpaRepository { + + List findByDesignerIdOrderByIdAsc(Long designerId); } 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 5384ae8..866a919 100644 --- a/src/main/java/ditda/backend/domain/designer/service/DesignerService.java +++ b/src/main/java/ditda/backend/domain/designer/service/DesignerService.java @@ -30,4 +30,10 @@ public Designer getByIdWithUser(Long designerId) { public Designer getReferenceById(Long designerId) { return designerRepository.getReferenceById(designerId); } + + public void validateExists(Long designerId) { + if (!designerRepository.existsById(designerId)) { + throw new GeneralException(DesignerErrorCode.DESIGNER_NOT_FOUND); + } + } } diff --git a/src/main/java/ditda/backend/domain/designer/service/PortfolioService.java b/src/main/java/ditda/backend/domain/designer/service/PortfolioService.java index f092a54..33d1aa6 100644 --- a/src/main/java/ditda/backend/domain/designer/service/PortfolioService.java +++ b/src/main/java/ditda/backend/domain/designer/service/PortfolioService.java @@ -57,6 +57,13 @@ public void savePortfolios(Designer designer, List portfolioKeys) { portfolioRepository.saveAll(portfolios); } + @Transactional(readOnly = true) + public List getPortfolioKeys(Long designerId) { + return portfolioRepository.findByDesignerIdOrderByIdAsc(designerId).stream() + .map(Portfolio::getPortfolioUrl) + .toList(); + } + public List promote(List tempKeys) { return s3UploadManager.promote(BUCKET, tempKeys); }