diff --git a/src/main/java/stackpot/stackpot/feed/controller/FeedController.java b/src/main/java/stackpot/stackpot/feed/controller/FeedController.java index 66a3fa68..ce1db099 100644 --- a/src/main/java/stackpot/stackpot/feed/controller/FeedController.java +++ b/src/main/java/stackpot/stackpot/feed/controller/FeedController.java @@ -168,6 +168,16 @@ public ResponseEntity>> getSeries() { return ResponseEntity.ok(ApiResponse.onSuccess(seriesMap)); } + @GetMapping("/series/{user_id}") + @Operation(summary = "다른 사람 Series 조회 API", description = "다른 사람의 Series List를 조회합니다.") + @ApiErrorCodeExamples({ + ErrorStatus.USER_NOT_FOUND + }) + public ResponseEntity>> getSeries(@PathVariable("user_id") Long userId) { + Map seriesMap = feedQueryService.getOtherSeries(userId); + return ResponseEntity.ok(ApiResponse.onSuccess(seriesMap)); + } + @GetMapping("/likes") @Operation(summary = "좋아요(공감)한 피드 조회", description = "현재 사용자가 공감한 Feed 리스트를 페이징으로 조회합니다.") public ResponseEntity>> getSavedFeeds( diff --git a/src/main/java/stackpot/stackpot/feed/service/FeedQueryService.java b/src/main/java/stackpot/stackpot/feed/service/FeedQueryService.java index 4f6a97eb..cc530f5e 100644 --- a/src/main/java/stackpot/stackpot/feed/service/FeedQueryService.java +++ b/src/main/java/stackpot/stackpot/feed/service/FeedQueryService.java @@ -13,6 +13,7 @@ public interface FeedQueryService { // FeedResponseDto.FeedPreviewList searchByUserIdByKeyword(Long userId, Long nextCursor, int pageSize); UserMyPageResponseDto getFeeds(Long nextCursor, int pageSize, Long seriesId); Map getMySeries(); + Map getOtherSeries(Long userId); Long getLikeCount(Long feedId); Feed getFeedByFeedId(Long feedId); Map getLikedFeedsWithPaging(int page, int size); diff --git a/src/main/java/stackpot/stackpot/feed/service/FeedQueryServiceImpl.java b/src/main/java/stackpot/stackpot/feed/service/FeedQueryServiceImpl.java index 70b30bb9..b1460f6d 100644 --- a/src/main/java/stackpot/stackpot/feed/service/FeedQueryServiceImpl.java +++ b/src/main/java/stackpot/stackpot/feed/service/FeedQueryServiceImpl.java @@ -311,6 +311,21 @@ public Map getMySeries() { )); } + @Override + public Map getOtherSeries(Long userId) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new UserHandler(ErrorStatus.USER_NOT_FOUND)); + + List userSeriesList = seriesRepository.findAllByUser(user); + + return userSeriesList.stream() + .collect(Collectors.toMap( + Series::getSeriesId, + Series::getComment + )); + } + + @Override public Map getLikedFeedsWithPaging(int page, int size) { User user = authService.getCurrentUser(); // 인증 필요 diff --git a/src/main/java/stackpot/stackpot/pot/controller/PotMemberController.java b/src/main/java/stackpot/stackpot/pot/controller/PotMemberController.java index 720e790a..24df7d1a 100644 --- a/src/main/java/stackpot/stackpot/pot/controller/PotMemberController.java +++ b/src/main/java/stackpot/stackpot/pot/controller/PotMemberController.java @@ -45,7 +45,7 @@ public ResponseEntity>> addPotMembe return ResponseEntity.ok(ApiResponse.onSuccess(response)); } - @Operation(summary = "팟 어필 API") + @Operation(summary = "여기서 저는요 작성 및 수정 API") @PatchMapping("/appeal") public ResponseEntity> updateAppealContent( @PathVariable("pot_id") Long potId, diff --git a/src/main/java/stackpot/stackpot/pot/repository/PotRepository.java b/src/main/java/stackpot/stackpot/pot/repository/PotRepository.java index d621b051..89eb4d57 100644 --- a/src/main/java/stackpot/stackpot/pot/repository/PotRepository.java +++ b/src/main/java/stackpot/stackpot/pot/repository/PotRepository.java @@ -7,6 +7,7 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; import stackpot.stackpot.pot.entity.Pot; import stackpot.stackpot.user.entity.enums.Role; @@ -56,9 +57,9 @@ public interface PotRepository extends JpaRepository { @Modifying @Query("DELETE FROM Pot f WHERE f.user.id = :userId") void deleteByUserId(@Param("userId") Long userId); - @Modifying - @Query("DELETE FROM Pot p WHERE p.user.id = :userId AND p.potId IN :potIds AND p.potStatus = 'RECRUITING'") - void deleteByUserIdAndPotIds(@Param("userId") Long userId, @Param("potIds") List potIds); +// @Modifying +// @Query("DELETE FROM Pot p WHERE p.user.id = :userId AND p.potId IN :potIds AND p.potStatus = 'RECRUITING'") +// void deleteByUserIdAndPotIds(@Param("userId") Long userId, @Param("potIds") List potIds); boolean existsByUserId(Long userId); // 지원자 수 기준으로 모든 Pot 정렬 @@ -85,4 +86,13 @@ List findIdsByUserIdAndStatus(@Param("userId") Long userId, @Query("select p.potId from Pot p where p.user.id = :userId and p.potStatus not in :statuses") List findIdsByUserIdAndStatusNotIn(@Param("userId") Long userId, @Param("statuses") List statuses); + + @Modifying @Transactional + @Query(""" + delete from Pot p + where p.user.id = :userId + and p.potId in :potIds + and p.potStatus = 'RECRUITING' + """) + void deleteByUserIdAndPotIds(@Param("userId") Long userId, @Param("potIds") List potIds); } diff --git a/src/main/java/stackpot/stackpot/pot/repository/PotSaveRepository.java b/src/main/java/stackpot/stackpot/pot/repository/PotSaveRepository.java index e2c94e0b..37949921 100644 --- a/src/main/java/stackpot/stackpot/pot/repository/PotSaveRepository.java +++ b/src/main/java/stackpot/stackpot/pot/repository/PotSaveRepository.java @@ -53,5 +53,12 @@ default Map countSavesByPotIds(List potIds) { void deleteAllByUserAndPots(@Param("user") User user, @Param("pots") List pots); List findByUser(User user); + + @Modifying + @Transactional void deleteByUser(User user); + + @Modifying @Transactional + @Query("delete from PotSave ps where ps.pot.potId in :potIds") + int deleteByPotIds(@Param("potIds") List potIds); } \ No newline at end of file diff --git a/src/main/java/stackpot/stackpot/pot/service/potApplication/PotApplicationQueryServiceImpl.java b/src/main/java/stackpot/stackpot/pot/service/potApplication/PotApplicationQueryServiceImpl.java index e815ae06..2623dc96 100644 --- a/src/main/java/stackpot/stackpot/pot/service/potApplication/PotApplicationQueryServiceImpl.java +++ b/src/main/java/stackpot/stackpot/pot/service/potApplication/PotApplicationQueryServiceImpl.java @@ -17,6 +17,7 @@ import stackpot.stackpot.pot.repository.PotApplicationRepository; import stackpot.stackpot.pot.repository.PotCommentRepository; import stackpot.stackpot.pot.repository.PotRepository; +import stackpot.stackpot.pot.repository.PotSaveRepository; import stackpot.stackpot.user.entity.User; import stackpot.stackpot.user.repository.UserRepository; @@ -35,6 +36,7 @@ public class PotApplicationQueryServiceImpl implements PotApplicationQueryServic private final PotApplicationConverter potApplicationConverter; private final PotDetailConverter potDetailConverter; private final AuthService authService; + private final PotSaveRepository potSaveRepository; @Override @Transactional(readOnly = true) @@ -63,13 +65,15 @@ public PotDetailWithApplicantsResponseDto getPotDetailsAndApplicants(Long potId) boolean isApplied = pot.getPotApplication().stream() .anyMatch(application -> application.getUser().getId().equals(user.getId())); + boolean isSaved = potSaveRepository.existsByUserAndPot_PotId(user, potId); + String recruitmentDetails = pot.getRecruitmentDetails().stream() .map(rd -> RoleNameMapper.mapRoleName(rd.getRecruitmentRole().name()) + "(" + rd.getRecruitmentCount() + ")") .collect(Collectors.joining(", ")); Long commentCount = potCommentRepository.countByPotId(potId); - PotDetailResponseDto potDetailDto = potDetailConverter.toPotDetailResponseDto(pot.getUser(), pot, recruitmentDetails, isOwner, isApplied, null, commentCount); + PotDetailResponseDto potDetailDto = potDetailConverter.toPotDetailResponseDto(pot.getUser(), pot, recruitmentDetails, isOwner, isApplied, isSaved, commentCount); List applicants = Collections.emptyList(); if (isOwner && "RECRUITING".equals(pot.getPotStatus())) { diff --git a/src/main/java/stackpot/stackpot/pot/service/potMember/PotMemberCommandServiceImpl.java b/src/main/java/stackpot/stackpot/pot/service/potMember/PotMemberCommandServiceImpl.java index 6388bd1e..dc313cb5 100644 --- a/src/main/java/stackpot/stackpot/pot/service/potMember/PotMemberCommandServiceImpl.java +++ b/src/main/java/stackpot/stackpot/pot/service/potMember/PotMemberCommandServiceImpl.java @@ -96,9 +96,9 @@ public List addMembersToPot(Long potId, PotMemberReq @Transactional @Override public void updateAppealContent(Long potId, String appealContent) { - String email = authService.getCurrentUserEmail(); + User user = authService.getCurrentUser(); - PotMember potMember = potMemberRepository.findByPot_PotIdAndUser_Email(potId, email) + PotMember potMember = potMemberRepository.findByPotPotIdAndUser(potId, user) .orElseThrow(() -> new PotHandler(ErrorStatus.POT_MEMBER_NOT_FOUND)); potMember.setAppealContent(appealContent); diff --git a/src/main/java/stackpot/stackpot/user/scheduler/TempUserCleanupScheduler.java b/src/main/java/stackpot/stackpot/user/scheduler/TempUserCleanupScheduler.java index fdc67844..65e02701 100644 --- a/src/main/java/stackpot/stackpot/user/scheduler/TempUserCleanupScheduler.java +++ b/src/main/java/stackpot/stackpot/user/scheduler/TempUserCleanupScheduler.java @@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import stackpot.stackpot.user.repository.TempUserRepository; import java.time.LocalDateTime; @@ -15,7 +16,8 @@ public class TempUserCleanupScheduler { private final TempUserRepository tempUserRepository; - @Scheduled(cron = "0 0 * * * *") // 매 정시 + @Scheduled(cron = "0 0 * * * *") + @Transactional// 매 정시 public void deleteOldTempUsers() { LocalDateTime oneHourAgo = LocalDateTime.now().minusHours(1); int deletedCount = tempUserRepository.deleteByCreatedAtBefore(oneHourAgo); diff --git a/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java b/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java index 0669d833..aa2a3916 100644 --- a/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java +++ b/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java @@ -408,6 +408,9 @@ public void handleCreatorPotDeletion(User user) { // PotApplication 삭제 potApplicationRepository.deleteByPotIds(recruitingPotIds); potRepository.deleteByUserIdAndPotIds(userId, recruitingPotIds); + potSaveRepository.deleteByPotIds(recruitingPotIds); + + potRepository.deleteByUserIdAndPotIds(userId, recruitingPotIds); } @@ -470,7 +473,7 @@ public void deletePotAndRelatedData(Pot pot) { potApplicationRepository.deleteByPotId(pot.getPotId()); potRecruitmentDetailsRepository.deleteByPot_PotId(pot.getPotId()); - + potSaveRepository.deleteByPotIds(List.of(pot.getPotId())); // Pot 삭제 potRepository.delete(pot);