From fdc5d42be5da1042d1f3a7088f78b644026c4981 Mon Sep 17 00:00:00 2001 From: tlarbals824 Date: Mon, 4 Mar 2024 18:49:38 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat=20:=20=EA=B4=91=EA=B3=A0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 인기 급상승 조회 추가 - 내가 찜한 영상 조회 추가 - 파일 저장시 모든 파일은 namespace를 가지도록 변경 --- .../controller/AdvertiseController.java | 31 ++++++++++--------- .../advertise/service/AdvertiseService.java | 29 +++++++++++------ .../service/dto/AdvertiseCreateRequest.java | 6 ++++ .../service/dto/AdvertiseSimpleResponse.java | 11 +++++++ .../service/AdvertiseSaveService.java | 3 +- .../application/file/service/FileService.java | 4 ++- .../service/dto/DirectoryCreateRequest.java | 4 +-- .../domain/advertise/Advertisement.java | 5 ++- .../advertise/AdvertisementRepository.java | 2 ++ .../advertise/service/AdvertiseReader.java | 3 ++ .../service/CaptureAppender.java | 6 ++-- .../advertisesave/service/SaveAppender.java | 2 +- .../java/core/kobaco/domain/file/File.java | 8 +++-- .../domain/file/service/FileFactory.java | 4 +-- .../domain/file/service/FileReader.java | 8 +++++ .../domain/like/AdvertiseLikeRepository.java | 6 +++- .../like/service/AdvertiseLikeReader.java | 19 ++++++++++++ .../domain/like/service/LikeReader.java | 10 ------ .../jpa/advertisement/AdvertiseMapper.java | 2 ++ .../AdvertisementRepositoryImpl.java | 9 +++++- .../entity/AdvertisementEntity.java | 10 ++++-- .../AdvertisementJpaRepository.java | 17 ++++++++++ .../jpa/like/AdvertiseLikeJpaRepository.java | 11 +++++++ .../jpa/like/AdvertiseLikeRepositoryImpl.java | 7 +++++ 24 files changed, 165 insertions(+), 52 deletions(-) create mode 100644 kobaco/kobaco/src/main/java/core/kobaco/domain/like/service/AdvertiseLikeReader.java delete mode 100644 kobaco/kobaco/src/main/java/core/kobaco/domain/like/service/LikeReader.java diff --git a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/controller/AdvertiseController.java b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/controller/AdvertiseController.java index e81a928..e9e1040 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/controller/AdvertiseController.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/controller/AdvertiseController.java @@ -8,14 +8,11 @@ import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.web.bind.annotation.*; -import java.sql.Time; -import java.time.LocalTime; -import java.util.List; - @RestController @RequiredArgsConstructor @RequestMapping("/api/advertises") @@ -31,16 +28,7 @@ public void createAdvertise(AdvertiseCreateRequest request) { @Operation(summary = "광고 목록 조회") @GetMapping public Page getAdvertiseList(Pageable pageable) { - List advertiseList = List.of( - new AdvertiseSimpleResponse( - 1L, - "광고 이미지 URL", - "광고 제목", - Time.valueOf(LocalTime.of(0, 4,23)), - List.of("광고 태그1", "광고 태그2") - ) - ); - return new PageImpl<>(advertiseList, pageable, advertiseList.size()); + return advertiseService.getAdvertiseList(PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by("id").descending())); } @Operation(summary = "광고 상세 조회") @@ -62,4 +50,17 @@ public void likeAdvertise(@PathVariable Long advertiseId) { public AdvertiseLikeDetailResponse getAdvertiseLikeCount(@PathVariable Long advertiseId) { return advertiseService.getAdvertiseLikeCount(advertiseId); } + + + @Operation(summary = "내가 찜한 영상") + @GetMapping("/saves") + public Page getSaveAdvertises(Pageable pageable){ + return advertiseService.getSaveAdvertiseList(pageable); + } + + @Operation(summary = "인기 급상승 영상 조회") + @GetMapping("/likes") + public Page getLikeAdvertises(Pageable pageable){ + return advertiseService.getLikeAdvertiseList(pageable); + } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/AdvertiseService.java b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/AdvertiseService.java index 566c61f..24c6178 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/AdvertiseService.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/AdvertiseService.java @@ -9,9 +9,11 @@ import core.kobaco.domain.advertise.service.AdvertiseReader; import core.kobaco.domain.keyword.service.KeywordFactory; import core.kobaco.domain.keyword.service.KeywordReader; +import core.kobaco.domain.like.service.AdvertiseLikeReader; import core.kobaco.domain.user.UserUtils; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,6 +30,7 @@ public class AdvertiseService { private final KeywordReader keywordReader; private final KeywordFactory keywordFactory; private final AdvertiseLikeManager advertiseLikeManager; + private final AdvertiseLikeReader advertiseLikeReader; @Transactional public void createAdvertise(AdvertiseCreateRequest request){ @@ -36,15 +39,8 @@ public void createAdvertise(AdvertiseCreateRequest request){ } public Page getAdvertiseList(Pageable pageable){ -// return advertiseReader.getAdvertiseList(pageable) -// .map(advertise -> AdvertiseSimpleResponse.of( -// advertise, -// advertiseReader.getAdvertiseKeyword(advertise.getAdvertiseId()) -// .stream() -// .map(keyword -> keywordReader.getKeyword(keyword.getKeywordId()).getKeyword()) -// .toList() -// )); - return null; + return advertiseReader.getAllAdvertiseList(pageable) + .map(AdvertiseSimpleResponse::of); } @@ -72,4 +68,19 @@ public AdvertiseLikeDetailResponse getAdvertiseLikeCount(final Long advertiseId) } + public Page getSaveAdvertiseList(Pageable pageable) { + if(!userUtils.isLogin()) + return Page.empty(); + return advertiseReader.getSaveAdvertiseList(userUtils.getRequestUserId(), pageable) + .map(AdvertiseSimpleResponse::of); + } + + public Page getLikeAdvertiseList(Pageable pageable) { + List advertiseSimpleResponses = advertiseLikeReader.getLikeAdvertiseIdList(pageable).stream() + .map(advertiseReader::getAdvertise) + .map(AdvertiseSimpleResponse::of) + .toList(); + return new PageImpl<>(advertiseSimpleResponses, pageable, advertiseSimpleResponses.size()); + + } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseCreateRequest.java b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseCreateRequest.java index 3083cb5..69cdf1a 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseCreateRequest.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseCreateRequest.java @@ -2,12 +2,17 @@ import core.kobaco.domain.advertise.Advertisement; import core.kobaco.domain.advertise.AdvertisementDetail; +import io.swagger.v3.oas.annotations.media.Schema; +import java.sql.Time; import java.time.LocalDate; +import java.time.LocalTime; import java.util.List; public record AdvertiseCreateRequest( String videoUrl, + @Schema(description = "00:00:00 형식", example = "00:00:00", type = "string") + LocalTime videoTime, String title, LocalDate uploadDate, String copy, @@ -23,6 +28,7 @@ public Advertisement toDomain(){ return Advertisement.of( null, videoUrl, + Time.valueOf(videoTime), title, uploadDate, copy, diff --git a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseSimpleResponse.java b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseSimpleResponse.java index cd134b5..e6573eb 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseSimpleResponse.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseSimpleResponse.java @@ -1,5 +1,7 @@ package core.kobaco.application.advertise.service.dto; +import core.kobaco.domain.advertise.Advertisement; + import java.sql.Time; import java.util.List; @@ -10,4 +12,13 @@ public record AdvertiseSimpleResponse ( Time videoTime, List keywordList ){ + public static AdvertiseSimpleResponse of(Advertisement advertisement){ + return new AdvertiseSimpleResponse( + advertisement.getAdvertiseId(), + advertisement.getVideoUrl(), + advertisement.getTitle(), + advertisement.getVideoTime(), + List.of("키워드1", "키워드2") + ); + } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/application/advertisesave/service/AdvertiseSaveService.java b/kobaco/kobaco/src/main/java/core/kobaco/application/advertisesave/service/AdvertiseSaveService.java index 20821e9..6686300 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/application/advertisesave/service/AdvertiseSaveService.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/application/advertisesave/service/AdvertiseSaveService.java @@ -41,7 +41,6 @@ public void captureAdvertise(MultipartFile imageFile, Long advertiseId) { final User user = userUtils.getRequestUser(); final String imageUrl = imageUploader.uploadImage(imageFile); // final File captureDirectory = fileFactory.createAdvertiseCaptureDirectory(advertiseId, user.getId()); - final File captureDirectory = fileFactory.createBasicDirectory(user.getId()); - captureAppender.append(captureDirectory.getFileId(), advertiseId, imageUrl); + captureAppender.append(fileFactory.createBasicDirectory(user.getId()), advertiseId, imageUrl); } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/application/file/service/FileService.java b/kobaco/kobaco/src/main/java/core/kobaco/application/file/service/FileService.java index 491ad54..ba50a4a 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/application/file/service/FileService.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/application/file/service/FileService.java @@ -5,6 +5,7 @@ import core.kobaco.application.file.service.dto.DirectoryUpdateRequest; import core.kobaco.application.file.service.dto.FileMoveRequest; import core.kobaco.domain.file.File; +import core.kobaco.domain.file.Namespace; import core.kobaco.domain.file.service.*; import core.kobaco.domain.user.UserUtils; import lombok.RequiredArgsConstructor; @@ -39,7 +40,8 @@ public DirectoryDetailResponse getFiles(Long directoryId) { @Transactional public void createDirectory(Long parentDirectoryId, DirectoryCreateRequest request) { - fileAppender.append(request.toDomain(parentDirectoryId)); + final Namespace namespace = fileReader.getNamespaceByUserId(userUtils.getRequestUserId()); + fileAppender.append(request.toDomain(parentDirectoryId, namespace.getNamespaceId())); } @Transactional diff --git a/kobaco/kobaco/src/main/java/core/kobaco/application/file/service/dto/DirectoryCreateRequest.java b/kobaco/kobaco/src/main/java/core/kobaco/application/file/service/dto/DirectoryCreateRequest.java index ee483e3..8c0bf6e 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/application/file/service/dto/DirectoryCreateRequest.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/application/file/service/dto/DirectoryCreateRequest.java @@ -6,13 +6,13 @@ public record DirectoryCreateRequest( String directoryName ) { - public File toDomain(final Long parentDirectoryId){ + public File toDomain(final Long parentDirectoryId, Long namespaceId){ return File.of( null, directoryName, FileType.DIRECTORY, parentDirectoryId, - null + namespaceId ); } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/Advertisement.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/Advertisement.java index ec0ceac..de44b39 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/Advertisement.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/Advertisement.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import java.sql.Time; import java.time.LocalDate; @Getter @@ -11,6 +12,7 @@ public class Advertisement { private Long advertiseId; private String videoUrl; + private Time videoTime; private String title; private LocalDate uploadDate; private String copy; @@ -19,11 +21,12 @@ public class Advertisement { public static Advertisement of(Long advertiseId, String videoUrl, + Time videoTime, String title, LocalDate uploadDate, String copy, String copyDetail, AdvertisementDetail advertisementDetail) { - return new Advertisement(advertiseId, videoUrl, title, uploadDate,copy, copyDetail, advertisementDetail); + return new Advertisement(advertiseId, videoUrl, videoTime, title, uploadDate, copy, copyDetail, advertisementDetail); } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/AdvertisementRepository.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/AdvertisementRepository.java index a755909..4a11a2f 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/AdvertisementRepository.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/AdvertisementRepository.java @@ -11,4 +11,6 @@ public interface AdvertisementRepository { Advertisement save(Advertisement advertisement); Page findAll(Pageable pageable); + + Page findSavedAllByUserId(Pageable pageable, Long userId); } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseReader.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseReader.java index f519aae..5617a42 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseReader.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseReader.java @@ -30,4 +30,7 @@ public Page getAllAdvertiseList(Pageable pageable) { return advertisementRepository.findAll(pageable); } + public Page getSaveAdvertiseList(Long requestUserId, Pageable pageable) { + return advertisementRepository.findSavedAllByUserId(pageable, requestUserId); + } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertisesave/service/CaptureAppender.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertisesave/service/CaptureAppender.java index 6ff0721..bc058ca 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertisesave/service/CaptureAppender.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertisesave/service/CaptureAppender.java @@ -5,6 +5,7 @@ import core.kobaco.domain.file.File; import core.kobaco.domain.file.FileRepository; import core.kobaco.domain.file.FileType; +import core.kobaco.domain.file.service.FileReader; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -13,9 +14,10 @@ public class CaptureAppender { private final AdvertiseCaptureRepository advertiseCaptureRepository; private final FileRepository fileRepository; + private final FileReader fileReader; - public void append(Long captureDirectoryId, Long advertiseId,String imageUrl) { - final File imageFile = fileRepository.save(File.of(FileType.IMAGE, captureDirectoryId)); + public void append(File directory, Long advertiseId,String imageUrl) { + final File imageFile = fileRepository.save(File.of(FileType.IMAGE, directory.getFileId(), directory.getNamespaceId())); advertiseCaptureRepository.save(AdvertiseCapture.of(imageUrl, imageFile.getFileId(), advertiseId)); } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertisesave/service/SaveAppender.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertisesave/service/SaveAppender.java index b2a2bb1..dbde973 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertisesave/service/SaveAppender.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertisesave/service/SaveAppender.java @@ -16,7 +16,7 @@ public class SaveAppender { private final FileRepository fileRepository; public void append(Advertisement advertisement, File directory) { - final File savedFile = fileRepository.save(File.of(FileType.ADVERTISE, directory.getFileId())); + final File savedFile = fileRepository.save(File.of(FileType.ADVERTISE, directory.getFileId(), directory.getNamespaceId())); final AdvertiseSave advertiseSave = AdvertiseSave.of(savedFile.getFileId(),advertisement.getAdvertiseId()); advertiseSaveRepository.save(advertiseSave); } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/file/File.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/file/File.java index ed3e818..ecb1683 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/file/File.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/file/File.java @@ -41,14 +41,18 @@ public static File captureDirectory(Long parentFileId) { return new File(null, CAPTURE_DIRECTORY_NAME, FileType.CAPTURE_DIRECTORY, parentFileId, null); } -public static File basicDirectory(Long parentFileId) { - return new File(null, BASIC_DIRECTORY_NAME, FileType.BASIC_DIRECTORY, parentFileId, null); +public static File basicDirectory(Long parentFileId, Long namespaceId) { + return new File(null, BASIC_DIRECTORY_NAME, FileType.BASIC_DIRECTORY, parentFileId, namespaceId); } public static File of(String fileName, FileType fileType, Long parentFileId) { return new File(null, fileName, fileType, parentFileId, null); } + public static File of(FileType fileType, Long parentFileId, Long namespaceId) { + return new File(null, null, fileType, parentFileId, namespaceId); + } + public static File of(FileType fileType, Long parentFileId) { return new File(null, null, fileType, parentFileId, null); } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/file/service/FileFactory.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/file/service/FileFactory.java index 1953ff8..8014231 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/file/service/FileFactory.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/file/service/FileFactory.java @@ -24,7 +24,7 @@ public File createRootDirectory(final Long userId) { .orElseGet(() -> { final File rootDirectory = fileRepository.save(File.rootDirectory(namespace.getNamespaceId())); // fileRepository.save(File.captureDirectory(rootDirectory.getFileId())); - fileRepository.save(File.basicDirectory(rootDirectory.getFileId())); + fileRepository.save(File.basicDirectory(rootDirectory.getFileId(), namespace.getNamespaceId())); return rootDirectory; } ); @@ -42,7 +42,7 @@ public File createAdvertiseCaptureDirectory(final Long advertiseId, final Long u public File createBasicDirectory(final Long userId) { final File rootDirectory = createRootDirectory(userId); return fileRepository.findBasicDirectoryByUserId(userId) - .orElseGet(() -> fileRepository.save(File.basicDirectory(rootDirectory.getFileId()))); + .orElseGet(() -> fileRepository.save(File.basicDirectory(rootDirectory.getFileId(), rootDirectory.getNamespaceId()))); } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/file/service/FileReader.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/file/service/FileReader.java index 3508ecb..9993282 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/file/service/FileReader.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/file/service/FileReader.java @@ -2,6 +2,8 @@ import core.kobaco.domain.file.File; import core.kobaco.domain.file.FileRepository; +import core.kobaco.domain.file.Namespace; +import core.kobaco.domain.file.NamespaceRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -11,6 +13,7 @@ @RequiredArgsConstructor public class FileReader { private final FileRepository fileRepository; + private final NamespaceRepository namespaceRepository; public List getDirectoryFiles(final Long directoryId){ return fileRepository.findAllByFileId(directoryId); @@ -26,4 +29,9 @@ public File getCaptureDirectoryByUserId(final Long userId){ .orElseThrow(() -> new IllegalArgumentException("Capture directory not found")); } + public Namespace getNamespaceByUserId(final Long userId){ + return namespaceRepository.findByUserId(userId) + .orElseThrow(() -> new IllegalArgumentException("Namespace not found")); + } + } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/like/AdvertiseLikeRepository.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/like/AdvertiseLikeRepository.java index 83ac809..eebf91e 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/like/AdvertiseLikeRepository.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/like/AdvertiseLikeRepository.java @@ -1,6 +1,8 @@ package core.kobaco.domain.like; -import javax.swing.text.html.Option; +import org.springframework.data.domain.Pageable; + +import java.util.List; import java.util.Optional; public interface AdvertiseLikeRepository { @@ -13,4 +15,6 @@ public interface AdvertiseLikeRepository { void delete(AdvertiseLike advertiseLike); Optional findByAdvertisementIdAndUserId(Long advertiseId, Long userId); + + List findTopLankAdvertiseId(Pageable pageable); } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/like/service/AdvertiseLikeReader.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/like/service/AdvertiseLikeReader.java new file mode 100644 index 0000000..b173024 --- /dev/null +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/like/service/AdvertiseLikeReader.java @@ -0,0 +1,19 @@ +package core.kobaco.domain.like.service; + +import core.kobaco.domain.like.AdvertiseLikeRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class AdvertiseLikeReader { + private final AdvertiseLikeRepository likeRepository; + + + public List getLikeAdvertiseIdList(Pageable pageable) { + return likeRepository.findTopLankAdvertiseId(pageable); + } +} diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/like/service/LikeReader.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/like/service/LikeReader.java deleted file mode 100644 index 9ebe7c1..0000000 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/like/service/LikeReader.java +++ /dev/null @@ -1,10 +0,0 @@ -package core.kobaco.domain.like.service; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class LikeReader { - -} diff --git a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertiseMapper.java b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertiseMapper.java index 971612d..e5faef8 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertiseMapper.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertiseMapper.java @@ -15,6 +15,7 @@ public AdvertisementEntity toEntity(Advertisement advertisement) { return AdvertisementEntity.of( advertisement.getAdvertiseId(), advertisement.getVideoUrl(), + advertisement.getVideoTime(), advertisement.getTitle(), advertisement.getUploadDate(), advertisement.getCopy(), @@ -31,6 +32,7 @@ public Advertisement toDomain(AdvertisementEntity advertisementEntity) { return Advertisement.of( advertisementEntity.getId(), advertisementEntity.getVideoUrl(), + advertisementEntity.getVideoTime(), advertisementEntity.getTitle(), advertisementEntity.getUploadDate(), advertisementEntity.getCopy(), diff --git a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertisementRepositoryImpl.java b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertisementRepositoryImpl.java index 1aade48..cd169db 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertisementRepositoryImpl.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertisementRepositoryImpl.java @@ -28,6 +28,13 @@ public Advertisement save(Advertisement advertisement) { @Override public Page findAll(Pageable pageable) { - return null; + return advertisementJpaRepository.findAll(pageable) + .map(advertiseMapper::toDomain); + } + + @Override + public Page findSavedAllByUserId(Pageable pageable, Long userId) { + return advertisementJpaRepository.findSavedAllByUserId(pageable, userId) + .map(advertiseMapper::toDomain); } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/entity/AdvertisementEntity.java b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/entity/AdvertisementEntity.java index b991a0d..223bbf2 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/entity/AdvertisementEntity.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/entity/AdvertisementEntity.java @@ -8,6 +8,7 @@ import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; +import java.sql.Time; import java.time.LocalDate; import java.util.List; @@ -23,6 +24,7 @@ public class AdvertisementEntity extends BaseEntity { private String videoUrl; private String title; private LocalDate uploadDate; + private Time videoTime; private String copy; private String copyDetail; @JdbcTypeCode(SqlTypes.JSON) @@ -36,7 +38,7 @@ public class AdvertisementEntity extends BaseEntity { private AdvertisementEntity(Long id, String videoUrl, String title, - LocalDate uploadDate, + LocalDate uploadDate, Time videoTime, String copy, String copyDetail, List peopleList, @@ -48,6 +50,7 @@ private AdvertisementEntity(Long id, this.videoUrl = videoUrl; this.title = title; this.uploadDate = uploadDate; + this.videoTime = videoTime; this.copy = copy; this.copyDetail = copyDetail; this.peopleList = peopleList; @@ -60,6 +63,7 @@ private AdvertisementEntity(Long id, public static AdvertisementEntity of( Long id, String videoUrl, + Time videoTime, String title, LocalDate uploadDate, String copy, @@ -69,11 +73,11 @@ public static AdvertisementEntity of( String owner, String ownerCompany, String makerCompany) { - return new AdvertisementEntity(id, videoUrl, title, uploadDate, copy, copyDetail, peopleList, objectList, owner, ownerCompany, makerCompany); + return new AdvertisementEntity(id, videoUrl, title, uploadDate, videoTime, copy, copyDetail, peopleList, objectList, owner, ownerCompany, makerCompany); } public static AdvertisementEntity from(Long id){ - return new AdvertisementEntity(id, null, null, null, null, null, null, null, null, null, null); + return new AdvertisementEntity(id, null, null, null, null, null, null, null, null, null, null, null); } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/repository/AdvertisementJpaRepository.java b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/repository/AdvertisementJpaRepository.java index 1165d48..99795d3 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/repository/AdvertisementJpaRepository.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/repository/AdvertisementJpaRepository.java @@ -1,7 +1,24 @@ package core.kobaco.infra.jpa.advertisement.repository; import core.kobaco.infra.jpa.advertisement.entity.AdvertisementEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface AdvertisementJpaRepository extends JpaRepository { + + @Query(""" + select ae + from AdvertisementEntity ae + join AdvertiseSaveEntity ase on ae.id = ase.advertisement.id + where ase.file.id in ( + select fe.id + from FileEntity fe + join NamespaceEntity ne on fe.namespace=ne and ne.user.id = :userId + ) + order by ase.id desc + """) + Page findSavedAllByUserId(Pageable pageable, @Param("userId") Long userId); } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/like/AdvertiseLikeJpaRepository.java b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/like/AdvertiseLikeJpaRepository.java index 1210619..1eda0f4 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/like/AdvertiseLikeJpaRepository.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/like/AdvertiseLikeJpaRepository.java @@ -1,7 +1,10 @@ package core.kobaco.infra.jpa.like; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import java.util.List; import java.util.Optional; public interface AdvertiseLikeJpaRepository extends JpaRepository { @@ -11,4 +14,12 @@ public interface AdvertiseLikeJpaRepository extends JpaRepository findByAdvertisementIdAndUserId(Long advertiseId, Long userId); + + @Query(""" + select al.advertisement.id + from AdvertiseLikeEntity al + group by al.advertisement.id + order by count(al.advertisement.id) desc +""") + List findTopLankAdvertiseId(Pageable pageable); } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/like/AdvertiseLikeRepositoryImpl.java b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/like/AdvertiseLikeRepositoryImpl.java index fba5acb..6e84fbe 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/like/AdvertiseLikeRepositoryImpl.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/like/AdvertiseLikeRepositoryImpl.java @@ -3,8 +3,10 @@ import core.kobaco.domain.like.AdvertiseLike; import core.kobaco.domain.like.AdvertiseLikeRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository @@ -38,4 +40,9 @@ public Optional findByAdvertisementIdAndUserId(Long advertiseId, return advertiseLikeJpaRepository.findByAdvertisementIdAndUserId(advertiseId, userId).map(likeMapper::toDomain); } + @Override + public List findTopLankAdvertiseId(Pageable pageable) { + return advertiseLikeJpaRepository.findTopLankAdvertiseId(pageable); + } + } From 0639593b30eaed90c4ec0760d33b72122d45cc3b Mon Sep 17 00:00:00 2001 From: tlarbals824 Date: Mon, 4 Mar 2024 19:55:20 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat=20:=20=ED=82=A4=EC=9B=8C=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=ED=86=B5=ED=95=9C=20=EA=B4=91=EA=B3=A0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AdvertiseController.java | 16 ++++++++-- .../advertise/service/AdvertiseService.java | 32 ++++++++++++++++--- .../service/dto/AdvertiseSimpleResponse.java | 4 +-- .../advertise/AdvertisementRepository.java | 3 ++ .../service/AdvertiseKeywordReader.java | 21 ++++++++++++ .../advertise/service/AdvertiseReader.java | 6 ++-- .../domain/keyword/KeywordRepository.java | 2 ++ .../domain/keyword/service/KeywordReader.java | 6 ++++ .../AdvertisementRepositoryImpl.java | 13 ++++++++ .../AdvertisementJpaRepository.java | 13 ++++++++ .../jpa/keyword/KeywordRepositoryImpl.java | 9 ++++++ 11 files changed, 113 insertions(+), 12 deletions(-) create mode 100644 kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseKeywordReader.java diff --git a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/controller/AdvertiseController.java b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/controller/AdvertiseController.java index e9e1040..e70897e 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/controller/AdvertiseController.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/controller/AdvertiseController.java @@ -13,6 +13,8 @@ import org.springframework.data.domain.Sort; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequiredArgsConstructor @RequestMapping("/api/advertises") @@ -25,10 +27,18 @@ public void createAdvertise(AdvertiseCreateRequest request) { advertiseService.createAdvertise(request); } - @Operation(summary = "광고 목록 조회") + @Operation(summary = "광고 목록 조회", description = """ + query param을 통해서 검색어를 전달받아 검색어에 해당하는 광고 목록을 조회합니다. + 컨셉, 상업군 상관없이 keywordList에 전달하면 됩니다. + """) @GetMapping - public Page getAdvertiseList(Pageable pageable) { - return advertiseService.getAdvertiseList(PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by("id").descending())); + public Page getAdvertiseList( + Pageable pageable, + @RequestParam(required = false) List keywordList) { + return advertiseService.getAdvertiseList( + PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by("id").descending()), + keywordList + ); } @Operation(summary = "광고 상세 조회") diff --git a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/AdvertiseService.java b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/AdvertiseService.java index 24c6178..ce2c47c 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/AdvertiseService.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/AdvertiseService.java @@ -5,8 +5,10 @@ import core.kobaco.application.advertise.service.dto.AdvertiseLikeDetailResponse; import core.kobaco.application.advertise.service.dto.AdvertiseSimpleResponse; import core.kobaco.domain.advertise.service.AdvertiseAppender; +import core.kobaco.domain.advertise.service.AdvertiseKeywordReader; import core.kobaco.domain.advertise.service.AdvertiseLikeManager; import core.kobaco.domain.advertise.service.AdvertiseReader; +import core.kobaco.domain.keyword.Keyword; import core.kobaco.domain.keyword.service.KeywordFactory; import core.kobaco.domain.keyword.service.KeywordReader; import core.kobaco.domain.like.service.AdvertiseLikeReader; @@ -31,6 +33,8 @@ public class AdvertiseService { private final KeywordFactory keywordFactory; private final AdvertiseLikeManager advertiseLikeManager; private final AdvertiseLikeReader advertiseLikeReader; + private final AdvertiseKeywordReader advertiseKeywordReader; + @Transactional public void createAdvertise(AdvertiseCreateRequest request){ @@ -38,9 +42,15 @@ public void createAdvertise(AdvertiseCreateRequest request){ advertiseAppender.append(request.toDomain(), keywordIdList); } - public Page getAdvertiseList(Pageable pageable){ - return advertiseReader.getAllAdvertiseList(pageable) - .map(AdvertiseSimpleResponse::of); + public Page getAdvertiseList(Pageable pageable, List keywordList) { + return advertiseReader.getAllAdvertiseList(pageable, keywordList) + .map(advertise -> { + List advertiseKeywordList = keywordReader.getKeywordList(advertiseKeywordReader.getKeywordIds(advertise.getAdvertiseId())) + .stream() + .map(Keyword::getKeyword) + .toList(); + return AdvertiseSimpleResponse.of(advertise, advertiseKeywordList); + }); } @@ -72,13 +82,25 @@ public Page getSaveAdvertiseList(Pageable pageable) { if(!userUtils.isLogin()) return Page.empty(); return advertiseReader.getSaveAdvertiseList(userUtils.getRequestUserId(), pageable) - .map(AdvertiseSimpleResponse::of); + .map(advertise -> { + List advertiseKeywordList = keywordReader.getKeywordList(advertiseKeywordReader.getKeywordIds(advertise.getAdvertiseId())) + .stream() + .map(Keyword::getKeyword) + .toList(); + return AdvertiseSimpleResponse.of(advertise, advertiseKeywordList); + }); } public Page getLikeAdvertiseList(Pageable pageable) { List advertiseSimpleResponses = advertiseLikeReader.getLikeAdvertiseIdList(pageable).stream() .map(advertiseReader::getAdvertise) - .map(AdvertiseSimpleResponse::of) + .map(advertise -> { + List advertiseKeywordList = keywordReader.getKeywordList(advertiseKeywordReader.getKeywordIds(advertise.getAdvertiseId())) + .stream() + .map(Keyword::getKeyword) + .toList(); + return AdvertiseSimpleResponse.of(advertise, advertiseKeywordList); + }) .toList(); return new PageImpl<>(advertiseSimpleResponses, pageable, advertiseSimpleResponses.size()); diff --git a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseSimpleResponse.java b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseSimpleResponse.java index e6573eb..c2c879f 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseSimpleResponse.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/application/advertise/service/dto/AdvertiseSimpleResponse.java @@ -12,13 +12,13 @@ public record AdvertiseSimpleResponse ( Time videoTime, List keywordList ){ - public static AdvertiseSimpleResponse of(Advertisement advertisement){ + public static AdvertiseSimpleResponse of(Advertisement advertisement, List keywordList){ return new AdvertiseSimpleResponse( advertisement.getAdvertiseId(), advertisement.getVideoUrl(), advertisement.getTitle(), advertisement.getVideoTime(), - List.of("키워드1", "키워드2") + keywordList ); } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/AdvertisementRepository.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/AdvertisementRepository.java index 4a11a2f..10b67f1 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/AdvertisementRepository.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/AdvertisementRepository.java @@ -3,6 +3,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import java.util.List; import java.util.Optional; public interface AdvertisementRepository { @@ -13,4 +14,6 @@ public interface AdvertisementRepository { Page findAll(Pageable pageable); Page findSavedAllByUserId(Pageable pageable, Long userId); + + Page findAllWithKeyword(Pageable pageable, List keywordList); } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseKeywordReader.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseKeywordReader.java new file mode 100644 index 0000000..d585450 --- /dev/null +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseKeywordReader.java @@ -0,0 +1,21 @@ +package core.kobaco.domain.advertise.service; + +import core.kobaco.domain.advertise.AdvertisementKeyword; +import core.kobaco.domain.advertise.AdvertisementKeywordRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class AdvertiseKeywordReader { + private final AdvertisementKeywordRepository advertisementKeywordRepository; + + public List getKeywordIds(Long advertiseId) { + return advertisementKeywordRepository.findAllByAdvertiseId(advertiseId) + .stream() + .map(AdvertisementKeyword::getKeywordId) + .toList(); + } +} diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseReader.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseReader.java index 5617a42..5a8e805 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseReader.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/advertise/service/AdvertiseReader.java @@ -4,6 +4,7 @@ import core.kobaco.domain.advertise.AdvertisementKeyword; import core.kobaco.domain.advertise.AdvertisementKeywordRepository; import core.kobaco.domain.advertise.AdvertisementRepository; +import jakarta.annotation.Nullable; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -26,8 +27,9 @@ public List getAdvertiseKeyword(Long advertiseId) { return advertisementKeywordRepository.findAllByAdvertiseId(advertiseId); } - public Page getAllAdvertiseList(Pageable pageable) { - return advertisementRepository.findAll(pageable); + public Page getAllAdvertiseList(Pageable pageable, @Nullable List keywordList) { +// return advertisementRepository.findAll(pageable); + return advertisementRepository.findAllWithKeyword(pageable, keywordList); } public Page getSaveAdvertiseList(Long requestUserId, Pageable pageable) { diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/keyword/KeywordRepository.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/keyword/KeywordRepository.java index ffccfbf..98a82c8 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/keyword/KeywordRepository.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/keyword/KeywordRepository.java @@ -7,6 +7,8 @@ public interface KeywordRepository { Optional findById(Long keywordId); Optional findByKeyword(String keyword); + List findAllById(List keywordIdList); + Keyword save(Keyword keyword); } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/domain/keyword/service/KeywordReader.java b/kobaco/kobaco/src/main/java/core/kobaco/domain/keyword/service/KeywordReader.java index e507187..f2baf60 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/domain/keyword/service/KeywordReader.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/domain/keyword/service/KeywordReader.java @@ -5,6 +5,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; + @Service @RequiredArgsConstructor public class KeywordReader { @@ -15,4 +17,8 @@ public Keyword getKeyword(Long keywordId) { .orElseThrow(() -> new IllegalArgumentException("Invalid keywordId")); } + public List getKeywordList(List keywordIdList) { + return keywordRepository.findAllById(keywordIdList); + } + } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertisementRepositoryImpl.java b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertisementRepositoryImpl.java index cd169db..e3aff86 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertisementRepositoryImpl.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/AdvertisementRepositoryImpl.java @@ -8,6 +8,8 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Objects; import java.util.Optional; @Repository @@ -37,4 +39,15 @@ public Page findSavedAllByUserId(Pageable pageable, Long userId) return advertisementJpaRepository.findSavedAllByUserId(pageable, userId) .map(advertiseMapper::toDomain); } + + @Override + public Page findAllWithKeyword(Pageable pageable, List keywordList) { + if(Objects.isNull(keywordList)||keywordList.isEmpty()){ + return advertisementJpaRepository.findAll(pageable) + .map(advertiseMapper::toDomain); + } + keywordList.forEach(System.out::println); + return advertisementJpaRepository.findAllWithKeyword(pageable, keywordList) + .map(advertiseMapper::toDomain); + } } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/repository/AdvertisementJpaRepository.java b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/repository/AdvertisementJpaRepository.java index 99795d3..04f9eed 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/repository/AdvertisementJpaRepository.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/advertisement/repository/AdvertisementJpaRepository.java @@ -7,6 +7,8 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.util.List; + public interface AdvertisementJpaRepository extends JpaRepository { @Query(""" @@ -21,4 +23,15 @@ where ase.file.id in ( order by ase.id desc """) Page findSavedAllByUserId(Pageable pageable, @Param("userId") Long userId); + + @Query(""" + select ae + from AdvertisementEntity ae + join AdvertisementKeywordEntity ak on ak.advertisement=ae and ak.keyword in ( + select ke + from KeywordEntity ke + where ke.description in :keywordList + ) + """) + Page findAllWithKeyword(Pageable pageable, List keywordList); } diff --git a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/keyword/KeywordRepositoryImpl.java b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/keyword/KeywordRepositoryImpl.java index bac3382..afb1afb 100644 --- a/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/keyword/KeywordRepositoryImpl.java +++ b/kobaco/kobaco/src/main/java/core/kobaco/infra/jpa/keyword/KeywordRepositoryImpl.java @@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Slf4j @@ -30,6 +31,14 @@ public Optional findByKeyword(String keyword) { }); } + @Override + public List findAllById(List keywordIdList) { + return keywordJpaRepository.findAllById(keywordIdList) + .stream() + .map(keywordMapper::toDomain) + .toList(); + } + @Override public Keyword save(Keyword keyword) { log.info("keyword: {}", keyword);