diff --git a/src/main/java/banban/springboot/repository/NewsRepository.java b/src/main/java/banban/springboot/repository/NewsRepository.java index 7881b69..e375197 100644 --- a/src/main/java/banban/springboot/repository/NewsRepository.java +++ b/src/main/java/banban/springboot/repository/NewsRepository.java @@ -2,6 +2,7 @@ import banban.springboot.domain.entity.Member; import banban.springboot.domain.entity.News; +import banban.springboot.domain.entity.TeamGroup; import banban.springboot.domain.enums.NewsCategories; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -9,11 +10,14 @@ import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface NewsRepository extends JpaRepository { List findByIsBreakingNewsTrue(); // 속보 뉴스 조회 List findByNewsCategories(NewsCategories newsCategories); // 긍정/부정 뉴스 조회 + Optional findByTeamGroupAndId(TeamGroup teamGroup, Long newsId); + Optional findByTeamGroupAndMemberAndId(TeamGroup teamGroup, Member member, Long newsId); // 뉴스 작성자 목록 중복 제거 후 반환 @Query("SELECT DISTINCT n.member FROM News n WHERE n.member.teamGroup.groupKey = :groupKey") List findDistinctMembersByGroupKey(@Param("groupKey") String groupKey); diff --git a/src/main/java/banban/springboot/service/NewsService.java b/src/main/java/banban/springboot/service/NewsService.java index 68d6c95..a527811 100644 --- a/src/main/java/banban/springboot/service/NewsService.java +++ b/src/main/java/banban/springboot/service/NewsService.java @@ -59,4 +59,32 @@ public News addNewsLike(Long newsId){ return newsRepository.save(existNews); } + @Transactional + public NewsResponseDTO.NewsReadResponseDTO readNews(String groupKey, Long newsId) { + + TeamGroup teamGroup = groupRepository.findByGroupKey(groupKey) + .orElseThrow(() -> new GeneralException(ErrorStatus.TEAMGROUP_NOT_FOUND)); + + News news = newsRepository.findByTeamGroupAndId(teamGroup, newsId) + .orElseThrow(() -> new GeneralException(ErrorStatus.NEWS_NOT_EXIST_FOUND)); + + return NewsResponseDTO.NewsReadResponseDTO.from(news); + } + + @Transactional + public Void removeNews(String groupKey, Long memberId, Long newsId) { + + TeamGroup teamGroup = groupRepository.findByGroupKey(groupKey) + .orElseThrow(() -> new GeneralException(ErrorStatus.TEAMGROUP_NOT_FOUND)); + + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND)); + + News news = newsRepository.findByTeamGroupAndMemberAndId(teamGroup, member, newsId) + .orElseThrow(() -> new GeneralException(ErrorStatus.NEWS_NOT_EXIST_FOUND)); + + newsRepository.deleteById(news.getId()); + + return null; + } } diff --git a/src/main/java/banban/springboot/web/controller/NewsController.java b/src/main/java/banban/springboot/web/controller/NewsController.java index f98d05a..3451982 100644 --- a/src/main/java/banban/springboot/web/controller/NewsController.java +++ b/src/main/java/banban/springboot/web/controller/NewsController.java @@ -46,4 +46,35 @@ public ApiResponse updatePromotionProject(@PathVariable(name = "newsId") L return ApiResponse.onSuccess(null); } + + // 뉴스 상세 보기 + @GetMapping("/{groupKey}/news/{newsId}") + @Operation(summary = "뉴스 상세 보기 API",description = "뉴스 상세 보는 API입니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200",description = "OK, 성공"), + }) + @Parameters({ + @Parameter(name = "groupKey", description = "그룹키, path variable 입니다!"), + @Parameter(name = "newsId", description = "뉴스글의 ID, path variable 입니다!"), + }) + public ApiResponse createNews(@PathVariable("groupKey") String groupKey, @PathVariable("newsId") Long newsId) { + NewsResponseDTO.NewsReadResponseDTO news = newsService.readNews(groupKey, newsId); + return ApiResponse.onSuccess(news); + } + + // 내가 작성한 뉴스 삭제 + @DeleteMapping("/{groupKey}/users/news/{memberId}/{newsId}") + @Operation(summary = "내가 작성한 뉴스 삭제하기 API",description = "내가 작성한 뉴스 삭제하는 API입니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200",description = "OK, 성공"), + }) + @Parameters({ + @Parameter(name = "groupKey", description = "그룹키, path variable 입니다!"), + @Parameter(name = "memberId", description = "사용자의 ID, path variable 입니다!"), + @Parameter(name = "newsId", description = "뉴스글의 ID, path variable 입니다!"), + }) + public ApiResponse deleteNews(@PathVariable("groupKey") String groupKey, @PathVariable("memberId") Long memberId, @PathVariable("newsId") Long newsId) { + newsService.removeNews(groupKey, memberId, newsId); + return ApiResponse.onSuccess(null); + } } diff --git a/src/main/java/banban/springboot/web/dto/response/NewsResponseDTO.java b/src/main/java/banban/springboot/web/dto/response/NewsResponseDTO.java index f7a6849..ac081e0 100644 --- a/src/main/java/banban/springboot/web/dto/response/NewsResponseDTO.java +++ b/src/main/java/banban/springboot/web/dto/response/NewsResponseDTO.java @@ -30,4 +30,27 @@ public static NewsCreateResponseDTO from(News news) { .build(); } } + + @Getter + @Setter + @NoArgsConstructor + @Builder + @AllArgsConstructor + public static class NewsReadResponseDTO { + private Long newsId; + private String headline; + private String content; + private String username; + private boolean isBreakingNews; + + public static NewsReadResponseDTO from(News news) { + return NewsReadResponseDTO.builder() + .newsId(news.getId()) + .headline(news.getHeadline()) + .content(news.getContent()) + .username(news.getMember().getUsername()) + .isBreakingNews(news.isBreakingNews()) + .build(); + } + } }