diff --git a/src/main/java/Capstone/AutoScheduler/global/config/SecurityConfig.java b/src/main/java/Capstone/AutoScheduler/global/config/SecurityConfig.java index d9134f8..05936c4 100644 --- a/src/main/java/Capstone/AutoScheduler/global/config/SecurityConfig.java +++ b/src/main/java/Capstone/AutoScheduler/global/config/SecurityConfig.java @@ -32,7 +32,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti // Event 관련 접근 .requestMatchers("/event/", "/event/{eventId}", "/event/member/{memberId}", "/event/member/{memberId}/event/{eventId}", "/event/member/{memberId}/date/{date}", "/event/multipleEvents/{memberId}/{generatorId}", "/event/member/{memberId}/recent").permitAll() // Generator 관련 접근 - .requestMatchers("/generator/", "/generator/{generatorId}").permitAll() + .requestMatchers("/generator/", "/generator/{generatorId}", "/generator/list/{memberId}").permitAll() // Bookmark 관련 접근 .requestMatchers("/bookmark/add/{memberId}/{generatorId}", "/bookmark/delete/{bookmarkId}" ).permitAll() // Crawling 관련 접근 diff --git a/src/main/java/Capstone/AutoScheduler/global/converter/GeneratorConverter.java b/src/main/java/Capstone/AutoScheduler/global/converter/GeneratorConverter.java index 4cb2e9c..3144fe3 100644 --- a/src/main/java/Capstone/AutoScheduler/global/converter/GeneratorConverter.java +++ b/src/main/java/Capstone/AutoScheduler/global/converter/GeneratorConverter.java @@ -75,4 +75,34 @@ public static GeneratorResponseDTO.GeneratorPreviewListDTO toGeneratorPreviewLis .build(); } + + public static GeneratorResponseDTO.GeneratorPreviewDTO toGeneratorPreviewDTOWithBookmark(Generator generator, boolean isBookmarked) { + return GeneratorResponseDTO.GeneratorPreviewDTO.builder() + .generatorId(generator.getGeneratorId()) + .memberId(generator.getMember().getMemberId()) + .memberName(generator.getMember().getName()) + .sourceType(generator.getSourceType()) + .generatorTitle(generator.getGeneratorTitle()) + .generatorDetail(generator.getGeneratorDetail()) + .frames(generator.getFrames()) + .mapping(generator.getMapping()) + .webUrl(generator.getWebUrl()) + .isBookmarked(isBookmarked) // 북마크 상태 추가 + .build(); + } + + public static GeneratorResponseDTO.GeneratorPreviewListDTO toGeneratorPreviewListDTOWithBookmark( + List generatorList, List bookmarkedGeneratorIds) { + List generatorPreviewDTOList = generatorList.stream() + .map(generator -> toGeneratorPreviewDTOWithBookmark( + generator, bookmarkedGeneratorIds.contains(generator.getGeneratorId()))) + .collect(Collectors.toList()); + return GeneratorResponseDTO.GeneratorPreviewListDTO.builder() + .generators(generatorPreviewDTOList) + .build(); + } + + + + } diff --git a/src/main/java/Capstone/AutoScheduler/global/converter/MemberConverter.java b/src/main/java/Capstone/AutoScheduler/global/converter/MemberConverter.java index e7a77ff..980da75 100644 --- a/src/main/java/Capstone/AutoScheduler/global/converter/MemberConverter.java +++ b/src/main/java/Capstone/AutoScheduler/global/converter/MemberConverter.java @@ -61,5 +61,4 @@ public static MemberResponseDTO.BookmarkPreviewListDTO toBookmarkPreviewListDTO( .build(); } - } diff --git a/src/main/java/Capstone/AutoScheduler/global/repository/BookmarkRepository.java b/src/main/java/Capstone/AutoScheduler/global/repository/BookmarkRepository.java index 61b29ce..0cb7634 100644 --- a/src/main/java/Capstone/AutoScheduler/global/repository/BookmarkRepository.java +++ b/src/main/java/Capstone/AutoScheduler/global/repository/BookmarkRepository.java @@ -7,6 +7,7 @@ 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; import java.util.List; @@ -17,4 +18,7 @@ public interface BookmarkRepository extends JpaRepository { // 회원별 북마크 리스트 조회 //@Query("SELECT b FROM Bookmark b JOIN FETCH b.generator p LEFT JOIN FETCH p.generatorFileList LEFT JOIN FETCH p.member WHERE b.member = :member") List findAllByMember(Member member); + @Query("SELECT b.generator.generatorId FROM Bookmark b WHERE b.member.memberId = :memberId") + List findBookmarkedGeneratorIdsByMemberId(@Param("memberId") Long memberId); + } diff --git a/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorQueryService.java b/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorQueryService.java index 9660341..ae17d1e 100644 --- a/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorQueryService.java +++ b/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorQueryService.java @@ -1,6 +1,7 @@ package Capstone.AutoScheduler.global.service.GeneratorService; import Capstone.AutoScheduler.global.domain.entity.Generator; +import Capstone.AutoScheduler.global.web.dto.Generator.GeneratorResponseDTO; import java.util.List; @@ -8,5 +9,5 @@ public interface GeneratorQueryService { Generator findById(Long generatorId); List getGenerators(); - //List getGeneratorsWithBookmarkStatus(Long memberId); + List getGeneratorsWithBookmarkStatus(Long memberId); } diff --git a/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorQueryServiceImpl.java b/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorQueryServiceImpl.java index 257e8ad..1197c76 100644 --- a/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorQueryServiceImpl.java +++ b/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorQueryServiceImpl.java @@ -1,6 +1,7 @@ package Capstone.AutoScheduler.global.service.GeneratorService; +import Capstone.AutoScheduler.global.converter.GeneratorConverter; import Capstone.AutoScheduler.global.domain.entity.Generator; import Capstone.AutoScheduler.global.repository.GeneratorRepository; import Capstone.AutoScheduler.global.web.dto.Generator.GeneratorResponseDTO; @@ -34,13 +35,18 @@ public Generator findById(Long generatorId) { } @Override - public List getGenerators() { + public List getGenerators() { return generatorRepository.findAllByOrderByGeneratorIdDesc(); } -// @Override -// public List getGeneratorsWithBookmarkStatus(Long memberId) { -// return generatorRepository.findAllWithBookmarkStatus(memberId); -// } + @Override + public List getGeneratorsWithBookmarkStatus(Long memberId) { + return generatorRepository.findAllWithBookmarkStatus(memberId).stream() + .map(data -> (Generator) data[0]) // Generator 객체만 추출 + .toList(); + } + + + } diff --git a/src/main/java/Capstone/AutoScheduler/global/web/controller/GeneratorController.java b/src/main/java/Capstone/AutoScheduler/global/web/controller/GeneratorController.java index 356ae99..d8832bb 100644 --- a/src/main/java/Capstone/AutoScheduler/global/web/controller/GeneratorController.java +++ b/src/main/java/Capstone/AutoScheduler/global/web/controller/GeneratorController.java @@ -5,6 +5,7 @@ import Capstone.AutoScheduler.global.apiPayload.code.status.SuccessStatus; import Capstone.AutoScheduler.global.converter.GeneratorConverter; import Capstone.AutoScheduler.global.domain.entity.Generator; +import Capstone.AutoScheduler.global.repository.BookmarkRepository; import Capstone.AutoScheduler.global.service.GeneratorService.GeneratorCommandService; import Capstone.AutoScheduler.global.service.GeneratorService.GeneratorQueryService; import Capstone.AutoScheduler.global.service.MemberService.MemberCommandService; @@ -32,6 +33,7 @@ public class GeneratorController { private final GeneratorCommandService generatorCommandService; private final GeneratorQueryService generatorQueryService; private final MemberCommandService memberCommandService; + private final BookmarkRepository bookmarkRepository; // 일정 생성기 저장하기 @PostMapping("/") @@ -70,14 +72,16 @@ public ApiResponse findGenerators( GeneratorConverter.toGeneratorPreviewListDTO(generators)); } -// // 전체 일정 생성기 리스트 조회 (사용자의 북마크 상태 포함) -// @GetMapping("/list/{memberId}") -// @Operation(summary = "전체 일정 생성기 리스트 조회 (사용자의 북마크 상태 포함) API", description = "전체 일정 생성기 리스트를 조회하며 사용자가 북마크한 생성기를 표시합니다.") -// public ApiResponse findGeneratorsWithBookmark(@PathVariable Long memberId) { -// List generators = generatorQueryService.getGeneratorsWithBookmarkStatus(memberId); -// return ApiResponse.onSuccess( -// SuccessStatus.GENERATOR_OK, -// GeneratorConverter.toGeneratorPreviewListDTO(generators)); -// } + // 전체 일정 생성기 리스트 조회 (사용자의 북마크 상태 포함) + @GetMapping("/list/{memberId}") + @Operation(summary = "전체 일정 생성기 리스트 조회 (사용자의 북마크 상태 포함) API", description = "전체 일정 생성기 리스트를 조회하며 사용자가 북마크한 생성기를 표시합니다.") + public ApiResponse findGeneratorsWithBookmark(@PathVariable Long memberId) { + List generators = generatorQueryService.getGeneratorsWithBookmarkStatus(memberId); + List bookmarkedGeneratorIds = bookmarkRepository.findBookmarkedGeneratorIdsByMemberId(memberId); + return ApiResponse.onSuccess( + SuccessStatus.GENERATOR_OK, + GeneratorConverter.toGeneratorPreviewListDTOWithBookmark(generators, bookmarkedGeneratorIds)); + } + }