From ef18319b6e74bbfec1bb1db4664d7fb76c6dc3ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EC=B0=AC?= <129833370+dongchandev@users.noreply.github.com> Date: Mon, 20 May 2024 21:56:48 +0900 Subject: [PATCH 01/11] =?UTF-8?q?refactor:=20wakeUpSong=20useCase=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dodamapi/point/usecase/PointUseCase.java | 4 + .../{ => handler}/WakeupSongController.java | 41 +++--- .../wakeupsong/usecase/WakeupSongUseCase.java | 109 ++++++++++++++++ .../dodamcore/common/util/YoutubeApiUtil.java | 33 +++++ .../application/WakeupSongService.java | 119 +++--------------- dodam-core/src/main/resources/application.yml | 1 - 6 files changed, 182 insertions(+), 125 deletions(-) rename dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/{ => handler}/WakeupSongController.java (56%) create mode 100644 dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java create mode 100644 dodam-core/src/main/java/b1nd/dodamcore/common/util/YoutubeApiUtil.java diff --git a/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java index 4c69eaab..8d40eb00 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java @@ -17,6 +17,7 @@ import b1nd.dodamcore.point.domain.entity.PointScore; import b1nd.dodamcore.point.domain.enums.PointType; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -24,6 +25,7 @@ import java.time.LocalDate; import java.util.List; +@Slf4j @Component @Transactional(readOnly = true) @RequiredArgsConstructor @@ -36,7 +38,9 @@ public class PointUseCase { @Transactional(rollbackFor = Exception.class) public Response issue(IssuePointReq req) { + log.info("아"); PointReason reason = pointReasonService.getBy(req.reasonId()); + log.info("아잉"); List students = memberService.getStudentsByIds(req.studentIds()); savePoints(students, reason, req.issueAt()); diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/WakeupSongController.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java similarity index 56% rename from dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/WakeupSongController.java rename to dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java index c882dd18..f2c21d84 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/WakeupSongController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java @@ -1,7 +1,8 @@ -package b1nd.dodamapi.wakeupsong; +package b1nd.dodamapi.wakeupsong.handler; import b1nd.dodamapi.common.response.Response; import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamapi.wakeupsong.usecase.WakeupSongUseCase; import b1nd.dodamcore.wakeupsong.application.WakeupSongService; import b1nd.dodamcore.wakeupsong.application.dto.req.ApplyWakeupSongBySearchReq; import b1nd.dodamcore.wakeupsong.application.dto.req.ApplyWakeupSongReq; @@ -10,17 +11,18 @@ import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeRes; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.concurrent.Callable; +import java.util.concurrent.Executor; @RestController @RequestMapping("/wakeup-song") @RequiredArgsConstructor public class WakeupSongController { - - private final WakeupSongService wakeupSongService; + private final WakeupSongUseCase wakeupSongUseCase; @GetMapping("/allowed") public ResponseData> getAllowedWakeupSongByPlayDate( @@ -28,67 +30,56 @@ public ResponseData> getAllowedWakeupSongByPlayDate( @RequestParam int month, @RequestParam int day ) { - List wakeupSongList = wakeupSongService.getAllowedWakeupSongByPlayDate(year, month, day); - return ResponseData.ok("승인된 기상송 조회 성공", wakeupSongList); + return wakeupSongUseCase.getAllowedWakeupSong(year, month, day); } @GetMapping("/pending") public ResponseData> getPendingWakeupSong() { - List wakeupSongList = wakeupSongService.getPendingWakeupSong(); - return ResponseData.ok("승인 대기 중인 기상송 조회 성공", wakeupSongList); + return wakeupSongUseCase.getPendingWakeupSong(); } @GetMapping("/my") public ResponseData> getMyWakeupSong() { - List wakeupSongList = wakeupSongService.getMyWakeupSong(); - return ResponseData.ok("자신이 신청한 기상송 조회 성공", wakeupSongList); + return wakeupSongUseCase.getMyWakeupSong(); } @PostMapping public Callable createWakeupSong(@RequestBody @Valid ApplyWakeupSongReq req) { - wakeupSongService.createWakeupSong(req.videoUrl()); - return () -> Response.created("기상송 신청 성공"); + return wakeupSongUseCase.createWakeupSong(req.videoUrl()); } @PostMapping("/keyword") public Callable createWakeupSongByYoutubeSearch(@RequestBody @Valid ApplyWakeupSongBySearchReq req) { - wakeupSongService.createWakeupSongByYoutubeSearch(req); - return () -> Response.created("유튜브 검색을 통한 기상송 신청 성공"); + return wakeupSongUseCase.createWakeupSongByYoutubeSearch(req); } @GetMapping("/search") public ResponseData> getYoutubeVideo(@RequestParam String keyword) { - List videoList = wakeupSongService.getYoutubeList(keyword); - return ResponseData.ok("유튜브 검색을 통한 기상송 조회 성공", videoList); + return wakeupSongUseCase.getYoutubeList(keyword); } @PatchMapping("/allow/{id}") public Response allowWakeupSong(@PathVariable int id) { - wakeupSongService.allowWakeupSong(id); - return Response.ok("기상송 승인 성공"); + return wakeupSongUseCase.allow(id); } @PatchMapping("/deny/{id}") public Response denyWakeupSong(@PathVariable int id) { - wakeupSongService.denyWakeupSong(id); - return Response.ok("기상송 거절 성공"); + return wakeupSongUseCase.deny(id); } @DeleteMapping("/{id}") public Response deleteWakeupSong(@PathVariable int id) { - wakeupSongService.deleteWakeupSong(id); - return Response.ok("기상송 삭제 성공"); + return wakeupSongUseCase.delete(id); } @DeleteMapping("/my/{id}") public Response deleteMyWakeupSong(@PathVariable int id) { - wakeupSongService.deleteMyWakeupSong(id); - return Response.ok("기상송 신청 취소 성공"); + return wakeupSongUseCase.deleteMyWakeupSong(id); } @GetMapping("/chart") public ResponseData> getChart() { - List chartList = wakeupSongService.getChartList(); - return ResponseData.ok("차트 조회 성공", chartList); + return wakeupSongUseCase.getChartList(); } } diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java new file mode 100644 index 00000000..834bd32d --- /dev/null +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java @@ -0,0 +1,109 @@ +package b1nd.dodamapi.wakeupsong.usecase; + +import b1nd.dodamapi.common.response.Response; +import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.util.YoutubeApiUtil; +import b1nd.dodamcore.member.application.MemberSessionHolder; +import b1nd.dodamcore.member.domain.entity.Member; +import b1nd.dodamcore.wakeupsong.application.ChartClient; +import b1nd.dodamcore.wakeupsong.application.WakeupSongClient; +import b1nd.dodamcore.wakeupsong.application.WakeupSongService; +import b1nd.dodamcore.wakeupsong.application.dto.req.ApplyWakeupSongBySearchReq; +import b1nd.dodamcore.wakeupsong.application.dto.res.ChartRes; +import b1nd.dodamcore.wakeupsong.application.dto.res.WakeupSongRes; +import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeApiRes; +import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeRes; +import b1nd.dodamcore.wakeupsong.domain.entity.WakeupSong; +import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongAlreadyCreatedException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.concurrent.Callable; + +@Component +@Transactional(rollbackFor = Exception.class) +@RequiredArgsConstructor +public class WakeupSongUseCase { + private final WakeupSongService wakeupSongService; + private final WakeupSongClient wakeupSongClient; + private final ChartClient chartClient; + private final MemberSessionHolder memberSessionHolder; + + public ResponseData> getAllowedWakeupSong(int year, int month, int day){ + List wakeupSongList = wakeupSongService.getByPlayDate(year, month, day); + return ResponseData.ok("승인된 기상송 조회 성공", WakeupSongRes.of(wakeupSongList)); + } + + public ResponseData> getPendingWakeupSong(){ + List wakeupSongList = wakeupSongService.getPendingWakeupSong(); + return ResponseData.ok("승인 대기 중인 기상송 조회 성공", WakeupSongRes.of(wakeupSongList)); + } + + public ResponseData> getMyWakeupSong(){ + Member member = memberSessionHolder.current(); + List wakeupSongList = wakeupSongService.getMyWakeupSong(member); + return ResponseData.ok("자신이 신청한 기상송 조회 성공", WakeupSongRes.of(wakeupSongList)); + } + + public Callable createWakeupSong(String videoUrl) { + Member member = verifyAlreadyAppliedFromSession(); + String videoId = YoutubeApiUtil.getVideoId(videoUrl); + YoutubeApiRes.Snippet snippet = wakeupSongClient.getVideo(videoId).getItems().get(0).getSnippet(); + wakeupSongService.buildAndSaveWakeupSong(snippet, videoId, videoUrl, member); + return () -> Response.created("기상송 신청 성공"); + } + + public Callable createWakeupSongByYoutubeSearch(ApplyWakeupSongBySearchReq req){ + Member member = verifyAlreadyAppliedFromSession(); + YoutubeApiRes.SearchItem searchItem = wakeupSongClient.searchVideoByKeyword( + req.title() + " " + req.artist(), 1).getItems().get(0); + wakeupSongService.buildAndSaveWakeupSong(searchItem.getSnippet(), searchItem.getId().getVideoId(), + "https://www.youtube.com/watch?v=" + searchItem.getId().getVideoId(), member); + return () -> Response.created("유튜브 검색을 통한 기상송 신청 성공"); + } + + private Member verifyAlreadyAppliedFromSession(){ + Member member = memberSessionHolder.current(); + if (wakeupSongService.existsByMemberAndCreatedAt(member)){ + throw new WakeupSongAlreadyCreatedException(); + } return member; + } + + public Response allow(int id){ + WakeupSong wakeupSong = wakeupSongService.getById(id); + wakeupSong.allow(memberSessionHolder.current()); + return Response.ok("기상송 승인 성공"); + } + + public Response deny(int id){ + WakeupSong wakeupSong = wakeupSongService.getById(id); + wakeupSong.deny(); + return Response.ok("기상송 거절 성공"); + } + + public Response delete(int id){ + WakeupSong wakeupSong = wakeupSongService.getById(id); + wakeupSongService.delete(wakeupSong); + return Response.ok("기상송 삭제 성공"); + } + + public Response deleteMyWakeupSong(int id) { + WakeupSong wakeupSong = wakeupSongService.getById(id); + wakeupSong.isApplicant(memberSessionHolder.current()); + wakeupSongService.delete(wakeupSong); + return Response.ok("기상송 신청 취소 성공"); + } + + public ResponseData> getChartList() { + List chartList = chartClient.getList().join(); + return ResponseData.ok("차트 조회 성공", chartList); + } + + public ResponseData> getYoutubeList(String keyword) { + List videoList = wakeupSongClient.searchVideoByKeyword(keyword, 5).getItems().stream() + .map(YoutubeApiUtil::getYoutubeRes).toList(); + return ResponseData.ok("유튜브 검색을 통한 기상송 조회 성공", videoList); + } +} diff --git a/dodam-core/src/main/java/b1nd/dodamcore/common/util/YoutubeApiUtil.java b/dodam-core/src/main/java/b1nd/dodamcore/common/util/YoutubeApiUtil.java new file mode 100644 index 00000000..32929c5e --- /dev/null +++ b/dodam-core/src/main/java/b1nd/dodamcore/common/util/YoutubeApiUtil.java @@ -0,0 +1,33 @@ +package b1nd.dodamcore.common.util; + +import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeApiRes; +import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeRes; +import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongUrlMalformedException; + +import java.util.Optional; + +public class YoutubeApiUtil { + + static public YoutubeApiRes.Thumbnail getThumbnailUrl(YoutubeApiRes.Snippet snippet) { + Optional standard = Optional.ofNullable(snippet.getThumbnails().getStandard()); + return standard.orElseGet(() -> snippet.getThumbnails().getHigh()); + } + + static public String getVideoId(String videoUrl){ + try { + return videoUrl.split("/?v=")[1].split("&")[0]; + } catch (IndexOutOfBoundsException e) { + throw new WakeupSongUrlMalformedException(); + } + } + + static public YoutubeRes getYoutubeRes(YoutubeApiRes.SearchItem item) { + return new YoutubeRes( + HtmlConverter.of(item.getSnippet().getTitle()), + item.getId().getVideoId(), + "https://www.youtube.com/watch?v=" + item.getId().getVideoId(), + item.getSnippet().getChannelTitle(), + YoutubeApiUtil.getThumbnailUrl(item.getSnippet()).getUrl() + ); + } +} diff --git a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java index 2368206a..3a58f043 100644 --- a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java +++ b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java @@ -1,6 +1,7 @@ package b1nd.dodamcore.wakeupsong.application; import b1nd.dodamcore.common.util.HtmlConverter; +import b1nd.dodamcore.common.util.YoutubeApiUtil; import b1nd.dodamcore.common.util.ZonedDateTimeUtil; import b1nd.dodamcore.member.application.MemberSessionHolder; import b1nd.dodamcore.member.domain.entity.Member; @@ -27,132 +28,52 @@ @RequiredArgsConstructor @Transactional(readOnly = true) public class WakeupSongService { - private final WakeupSongRepository wakeupSongRepository; - private final WakeupSongClient wakeupSongClient; - private final ChartClient chartClient; - private final MemberSessionHolder memberSessionHolder; - public List getAllowedWakeupSongByPlayDate(int year, int month, int day) { - return WakeupSongRes.of( - wakeupSongRepository.findAllByPlayAt(LocalDate.of(year, month, day)) - ); + public List getByPlayDate(int year, int month, int day) { + return wakeupSongRepository.findAllByPlayAt(LocalDate.of(year, month, day)); } - public List getPendingWakeupSong() { - return WakeupSongRes.of( - wakeupSongRepository.findAllByStatus(WakeupSongStatus.PENDING) - ); + public List getPendingWakeupSong() { + return wakeupSongRepository.findAllByStatus(WakeupSongStatus.PENDING); } - public List getMyWakeupSong() { - return WakeupSongRes.of( - wakeupSongRepository.findAllByMember_IdAndStatus(memberSessionHolder.current().getId(), WakeupSongStatus.PENDING) - ); + public List getMyWakeupSong(Member member) { + return wakeupSongRepository.findAllByMember_IdAndStatus(member.getId(), WakeupSongStatus.PENDING); } - @Transactional(rollbackFor = Exception.class) - public void createWakeupSong(String videoUrl) { - Member member = verifyAlreadyApplied(); - - String videoId; - try { - videoId = videoUrl.split("/?v=")[1].split("&")[0]; - } catch (IndexOutOfBoundsException e) { - throw new WakeupSongUrlMalformedException(); - } - - YoutubeApiRes.Snippet snippet = wakeupSongClient.getVideo(videoId).getItems().get(0).getSnippet(); - - buildAndSaveWakeupSong(snippet, videoId, videoUrl, member); + private void save(WakeupSong wakeupSong) { + wakeupSongRepository.save(wakeupSong); } @Transactional(rollbackFor = Exception.class) - public void createWakeupSongByYoutubeSearch(ApplyWakeupSongBySearchReq req) { - Member member = verifyAlreadyApplied(); - - YoutubeApiRes.SearchItem searchItem = wakeupSongClient.searchVideoByKeyword(req.title() + " " + req.artist(), 1).getItems().get(0); - - buildAndSaveWakeupSong(searchItem.getSnippet(), searchItem.getId().getVideoId(), - "https://www.youtube.com/watch?v=" + searchItem.getId().getVideoId(), member); + public void buildAndSaveWakeupSong(YoutubeApiRes.Snippet snippet, String videoId, String videoUrl, Member member){ + WakeupSong wakeupSong = buildWakeupSong(snippet, videoId, videoUrl, member); + save(wakeupSong); } - private Member verifyAlreadyApplied() { - Member member = memberSessionHolder.current(); - if (wakeupSongRepository.existsByMember_IdAndCreatedAtAfter(member.getId(), ZonedDateTimeUtil.nowToLocalDateTime().minusDays(7))) { - throw new WakeupSongAlreadyCreatedException(); - } - return member; - } - - private void buildAndSaveWakeupSong(YoutubeApiRes.Snippet snippet, String videoId, String videoUrl, Member member) { - WakeupSong wakeupSong = WakeupSong.builder() + private WakeupSong buildWakeupSong(YoutubeApiRes.Snippet snippet, String videoId, String videoUrl, Member member){ + return WakeupSong.builder() .videoId(videoId) .videoTitle(HtmlConverter.of(snippet.getTitle())) .videoUrl(videoUrl) .channelTitle(snippet.getChannelTitle()) - .thumbnailUrl(getThumbnailUrl(snippet).getUrl()) + .thumbnailUrl(YoutubeApiUtil.getThumbnailUrl(snippet).getUrl()) .member(member) .build(); - - wakeupSongRepository.save(wakeupSong); - } - - public List getYoutubeList(String keyword) { - return wakeupSongClient.searchVideoByKeyword(keyword, 5).getItems().stream() - .map(this::getYoutubeRes).toList(); - } - - private YoutubeRes getYoutubeRes(YoutubeApiRes.SearchItem item) { - return new YoutubeRes( - HtmlConverter.of(item.getSnippet().getTitle()), - item.getId().getVideoId(), - "https://www.youtube.com/watch?v=" + item.getId().getVideoId(), - item.getSnippet().getChannelTitle(), - getThumbnailUrl(item.getSnippet()).getUrl() - ); - } - - private YoutubeApiRes.Thumbnail getThumbnailUrl(YoutubeApiRes.Snippet snippet) { - Optional standard = Optional.ofNullable(snippet.getThumbnails().getStandard()); - return standard.orElseGet(() -> snippet.getThumbnails().getHigh()); } - @Transactional(rollbackFor = Exception.class) - public void allowWakeupSong(int id) { - WakeupSong wakeupSong = wakeupSongRepository.findById(id) - .orElseThrow(WakeupSongNotFoundException::new); - - wakeupSong.allow(memberSessionHolder.current()); + public Boolean existsByMemberAndCreatedAt(Member member){ + return wakeupSongRepository.existsByMember_IdAndCreatedAtAfter(member.getId(), ZonedDateTimeUtil.nowToLocalDateTime().minusDays(7)); } - @Transactional(rollbackFor = Exception.class) - public void denyWakeupSong(int id) { - WakeupSong wakeupSong = wakeupSongRepository.findById(id) + public WakeupSong getById(int id){ + return wakeupSongRepository.findById(id) .orElseThrow(WakeupSongNotFoundException::new); - - wakeupSong.deny(); } @Transactional(rollbackFor = Exception.class) - public void deleteWakeupSong(int id) { - WakeupSong wakeupSong = wakeupSongRepository.findById(id) - .orElseThrow(WakeupSongNotFoundException::new); - + public void delete(WakeupSong wakeupSong){ wakeupSongRepository.delete(wakeupSong); } - - @Transactional(rollbackFor = Exception.class) - public void deleteMyWakeupSong(int id) { - WakeupSong wakeupSong = wakeupSongRepository.findById(id) - .orElseThrow(WakeupSongNotFoundException::new); - - wakeupSong.isApplicant(memberSessionHolder.current()); - - wakeupSongRepository.delete(wakeupSong); - } - - public List getChartList() { - return chartClient.getList().join(); - } } diff --git a/dodam-core/src/main/resources/application.yml b/dodam-core/src/main/resources/application.yml index 8b137891..e69de29b 100644 --- a/dodam-core/src/main/resources/application.yml +++ b/dodam-core/src/main/resources/application.yml @@ -1 +0,0 @@ - From e6bdce5f9e77570d42dd9c8e9d3de400aee8cf0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EC=B0=AC?= <129833370+dongchandev@users.noreply.github.com> Date: Mon, 20 May 2024 23:06:40 +0900 Subject: [PATCH 02/11] refactor: callabe -> completableFuture --- .../handler/WakeupSongController.java | 5 ++- .../wakeupsong/usecase/WakeupSongUseCase.java | 40 +++++++++++++------ .../UnsupportedVideoTypeException.java | 14 +++++++ .../exception/WakeupSongExceptionCode.java | 3 +- 4 files changed, 46 insertions(+), 16 deletions(-) create mode 100644 dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/domain/exception/UnsupportedVideoTypeException.java diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java index f2c21d84..fe733786 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.concurrent.Callable; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; @RestController @@ -44,12 +45,12 @@ public ResponseData> getMyWakeupSong() { } @PostMapping - public Callable createWakeupSong(@RequestBody @Valid ApplyWakeupSongReq req) { + public CompletableFuture createWakeupSong(@RequestBody @Valid ApplyWakeupSongReq req) { return wakeupSongUseCase.createWakeupSong(req.videoUrl()); } @PostMapping("/keyword") - public Callable createWakeupSongByYoutubeSearch(@RequestBody @Valid ApplyWakeupSongBySearchReq req) { + public CompletableFuture createWakeupSongByYoutubeSearch(@RequestBody @Valid ApplyWakeupSongBySearchReq req) { return wakeupSongUseCase.createWakeupSongByYoutubeSearch(req); } diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java index 834bd32d..16d2edf8 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java @@ -14,6 +14,7 @@ import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeApiRes; import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeRes; import b1nd.dodamcore.wakeupsong.domain.entity.WakeupSong; +import b1nd.dodamcore.wakeupsong.domain.exception.UnsupportedVideoTypeException; import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongAlreadyCreatedException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -21,6 +22,7 @@ import java.util.List; import java.util.concurrent.Callable; +import java.util.concurrent.CompletableFuture; @Component @Transactional(rollbackFor = Exception.class) @@ -47,21 +49,33 @@ public ResponseData> getMyWakeupSong(){ return ResponseData.ok("자신이 신청한 기상송 조회 성공", WakeupSongRes.of(wakeupSongList)); } - public Callable createWakeupSong(String videoUrl) { - Member member = verifyAlreadyAppliedFromSession(); - String videoId = YoutubeApiUtil.getVideoId(videoUrl); - YoutubeApiRes.Snippet snippet = wakeupSongClient.getVideo(videoId).getItems().get(0).getSnippet(); - wakeupSongService.buildAndSaveWakeupSong(snippet, videoId, videoUrl, member); - return () -> Response.created("기상송 신청 성공"); + public CompletableFuture createWakeupSong(String videoUrl) { + return CompletableFuture.supplyAsync(() -> { + Member member = verifyAlreadyAppliedFromSession(); + String videoId = YoutubeApiUtil.getVideoId(videoUrl); + YoutubeApiRes.Snippet snippet = wakeupSongClient.getVideo(videoId).getItems().get(0).getSnippet(); + checkIsMV(snippet.getTitle()); + wakeupSongService.buildAndSaveWakeupSong(snippet, videoId, videoUrl, member); + return Response.created("기상송 신청 성공"); + }); } - public Callable createWakeupSongByYoutubeSearch(ApplyWakeupSongBySearchReq req){ - Member member = verifyAlreadyAppliedFromSession(); - YoutubeApiRes.SearchItem searchItem = wakeupSongClient.searchVideoByKeyword( - req.title() + " " + req.artist(), 1).getItems().get(0); - wakeupSongService.buildAndSaveWakeupSong(searchItem.getSnippet(), searchItem.getId().getVideoId(), - "https://www.youtube.com/watch?v=" + searchItem.getId().getVideoId(), member); - return () -> Response.created("유튜브 검색을 통한 기상송 신청 성공"); + public CompletableFuture createWakeupSongByYoutubeSearch(ApplyWakeupSongBySearchReq req){ + return CompletableFuture.supplyAsync(() -> { + Member member = verifyAlreadyAppliedFromSession(); + YoutubeApiRes.SearchItem searchItem = wakeupSongClient.searchVideoByKeyword( + req.title() + " " + req.artist(), 1).getItems().get(0); + checkIsMV(searchItem.getSnippet().getTitle()); + wakeupSongService.buildAndSaveWakeupSong(searchItem.getSnippet(), searchItem.getId().getVideoId(), + "https://www.youtube.com/watch?v=" + searchItem.getId().getVideoId(), member); + return Response.created("유튜브 검색을 통한 기상송 신청 성공"); + }); + } + + private void checkIsMV(String title){ + if(title.contains("MV")){ + throw new UnsupportedVideoTypeException(); + } } private Member verifyAlreadyAppliedFromSession(){ diff --git a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/domain/exception/UnsupportedVideoTypeException.java b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/domain/exception/UnsupportedVideoTypeException.java new file mode 100644 index 00000000..92bd599e --- /dev/null +++ b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/domain/exception/UnsupportedVideoTypeException.java @@ -0,0 +1,14 @@ +package b1nd.dodamcore.wakeupsong.domain.exception; + +import b1nd.dodamcore.common.exception.CustomException; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(value = HttpStatus.UNPROCESSABLE_ENTITY) +public class UnsupportedVideoTypeException extends CustomException { + + public UnsupportedVideoTypeException() { + super(WakeupSongExceptionCode.UNSUPPORTED_TYPE); + } + +} \ No newline at end of file diff --git a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/domain/exception/WakeupSongExceptionCode.java b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/domain/exception/WakeupSongExceptionCode.java index 07e2d341..77d9c63f 100644 --- a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/domain/exception/WakeupSongExceptionCode.java +++ b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/domain/exception/WakeupSongExceptionCode.java @@ -10,7 +10,8 @@ public enum WakeupSongExceptionCode implements ExceptionCode { ALREADY_APPLIED(HttpStatus.LOCKED, "이미 이번주에 기상송을 신청함"), NOT_FOUND(HttpStatus.NOT_FOUND, "없는 기상송"), NOT_APPLICANT(HttpStatus.FORBIDDEN, "신청자가 아님"), - URL_MALFORMED(HttpStatus.BAD_REQUEST, "잘못된 유튜브 URL 형식"); + URL_MALFORMED(HttpStatus.BAD_REQUEST, "잘못된 유튜브 URL 형식"), + UNSUPPORTED_TYPE(HttpStatus.UNPROCESSABLE_ENTITY,"지원하지 않는 유형의 비디오"); private final HttpStatus status; private final String message; From 5a68720173eecd4b99ac4fc9aa6501792d3dde8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EC=B0=AC?= <129833370+dongchandev@users.noreply.github.com> Date: Tue, 21 May 2024 08:17:11 +0900 Subject: [PATCH 03/11] =?UTF-8?q?chore:=20Async=20annotation=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java | 3 +++ .../b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java | 3 +++ .../src/main/java/b1nd/dodaminfra/token/TokenFilter.java | 2 -- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java index fe733786..8971dfa7 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java @@ -11,6 +11,7 @@ import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeRes; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.*; @@ -22,6 +23,7 @@ @RestController @RequestMapping("/wakeup-song") @RequiredArgsConstructor +@Slf4j public class WakeupSongController { private final WakeupSongUseCase wakeupSongUseCase; @@ -46,6 +48,7 @@ public ResponseData> getMyWakeupSong() { @PostMapping public CompletableFuture createWakeupSong(@RequestBody @Valid ApplyWakeupSongReq req) { + log.info("니ㅏㄹㅇ니ㅏㅇㄴㄹㅁ;ㅏㅣㅓㄹㄴㅇ머ㅏㅣ;라ㅣㄹㅇ나ㅣ아ㅣㅇㄹㅇㄹ니ㅏ"); return wakeupSongUseCase.createWakeupSong(req.videoUrl()); } diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java index 16d2edf8..5b67aac1 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java @@ -17,6 +17,7 @@ import b1nd.dodamcore.wakeupsong.domain.exception.UnsupportedVideoTypeException; import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongAlreadyCreatedException; import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -43,12 +44,14 @@ public ResponseData> getPendingWakeupSong(){ return ResponseData.ok("승인 대기 중인 기상송 조회 성공", WakeupSongRes.of(wakeupSongList)); } + @Async public ResponseData> getMyWakeupSong(){ Member member = memberSessionHolder.current(); List wakeupSongList = wakeupSongService.getMyWakeupSong(member); return ResponseData.ok("자신이 신청한 기상송 조회 성공", WakeupSongRes.of(wakeupSongList)); } + @Async public CompletableFuture createWakeupSong(String videoUrl) { return CompletableFuture.supplyAsync(() -> { Member member = verifyAlreadyAppliedFromSession(); diff --git a/dodam-infra/src/main/java/b1nd/dodaminfra/token/TokenFilter.java b/dodam-infra/src/main/java/b1nd/dodaminfra/token/TokenFilter.java index 76821486..ac5e9996 100644 --- a/dodam-infra/src/main/java/b1nd/dodaminfra/token/TokenFilter.java +++ b/dodam-infra/src/main/java/b1nd/dodaminfra/token/TokenFilter.java @@ -28,11 +28,9 @@ public class TokenFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String token = TokenExtractor.extract(request, TOKEN_TYPE); - if(!token.isEmpty()) { setAuthentication(token); } - filterChain.doFilter(request, response); } From f9ca7dd2497a5e673b4e8a0b77c388031fa22708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EC=B0=AC?= <129833370+dongchandev@users.noreply.github.com> Date: Tue, 21 May 2024 08:20:11 +0900 Subject: [PATCH 04/11] =?UTF-8?q?fix:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20@Asy?= =?UTF-8?q?nc=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20=EC=9E=AC=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java index 5b67aac1..29b85cc8 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java @@ -44,7 +44,6 @@ public ResponseData> getPendingWakeupSong(){ return ResponseData.ok("승인 대기 중인 기상송 조회 성공", WakeupSongRes.of(wakeupSongList)); } - @Async public ResponseData> getMyWakeupSong(){ Member member = memberSessionHolder.current(); List wakeupSongList = wakeupSongService.getMyWakeupSong(member); @@ -63,6 +62,7 @@ public CompletableFuture createWakeupSong(String videoUrl) { }); } + @Async public CompletableFuture createWakeupSongByYoutubeSearch(ApplyWakeupSongBySearchReq req){ return CompletableFuture.supplyAsync(() -> { Member member = verifyAlreadyAppliedFromSession(); From 6bc313942053d85e1bf2dcf97f1a7168e270ba00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EC=B0=AC?= <129833370+dongchandev@users.noreply.github.com> Date: Tue, 21 May 2024 10:41:39 +0900 Subject: [PATCH 05/11] =?UTF-8?q?fix:=20security=20context=20=EC=A0=84?= =?UTF-8?q?=EC=9D=B4=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dodamapi/common/exception/CustomExceptionHandler.java | 2 +- .../dodamapi/wakeupsong/handler/WakeupSongController.java | 1 - .../b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java | 5 ++++- .../dodaminfra/security/MemberAuthenticationHolder.java | 3 +++ .../main/java/b1nd/dodaminfra/security/SecurityConfig.java | 6 ++++++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/dodam-api/src/main/java/b1nd/dodamapi/common/exception/CustomExceptionHandler.java b/dodam-api/src/main/java/b1nd/dodamapi/common/exception/CustomExceptionHandler.java index a84d2caf..eb8813af 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/common/exception/CustomExceptionHandler.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/common/exception/CustomExceptionHandler.java @@ -120,7 +120,7 @@ protected ResponseEntity handleMethodArgumentTypeMismatchEx @ExceptionHandler(Exception.class) protected ResponseEntity handleException(Exception e, HttpServletRequest request){ errorNoticeSender.send(e, request); - +// log.info("{}",e.toString()); return ResponseEntity .status(500) .body(ErrorResponseEntity.builder() diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java index 8971dfa7..d30fb05c 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java @@ -48,7 +48,6 @@ public ResponseData> getMyWakeupSong() { @PostMapping public CompletableFuture createWakeupSong(@RequestBody @Valid ApplyWakeupSongReq req) { - log.info("니ㅏㄹㅇ니ㅏㅇㄴㄹㅁ;ㅏㅣㅓㄹㄴㅇ머ㅏㅣ;라ㅣㄹㅇ나ㅣ아ㅣㅇㄹㅇㄹ니ㅏ"); return wakeupSongUseCase.createWakeupSong(req.videoUrl()); } diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java index 29b85cc8..2193d846 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java @@ -17,6 +17,7 @@ import b1nd.dodamcore.wakeupsong.domain.exception.UnsupportedVideoTypeException; import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongAlreadyCreatedException; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -25,6 +26,7 @@ import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; +@Slf4j @Component @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor @@ -85,7 +87,8 @@ private Member verifyAlreadyAppliedFromSession(){ Member member = memberSessionHolder.current(); if (wakeupSongService.existsByMemberAndCreatedAt(member)){ throw new WakeupSongAlreadyCreatedException(); - } return member; + } + return member; } public Response allow(int id){ diff --git a/dodam-infra/src/main/java/b1nd/dodaminfra/security/MemberAuthenticationHolder.java b/dodam-infra/src/main/java/b1nd/dodaminfra/security/MemberAuthenticationHolder.java index 435fd4c5..9ab10b67 100644 --- a/dodam-infra/src/main/java/b1nd/dodaminfra/security/MemberAuthenticationHolder.java +++ b/dodam-infra/src/main/java/b1nd/dodaminfra/security/MemberAuthenticationHolder.java @@ -3,9 +3,12 @@ import b1nd.dodamcore.member.application.MemberSessionHolder; import b1nd.dodamcore.member.domain.entity.Member; import b1nd.dodaminfra.security.common.MemberDetails; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.concurrent.DelegatingSecurityContextExecutor; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; +@Slf4j @Component final class MemberAuthenticationHolder implements MemberSessionHolder { diff --git a/dodam-infra/src/main/java/b1nd/dodaminfra/security/SecurityConfig.java b/dodam-infra/src/main/java/b1nd/dodaminfra/security/SecurityConfig.java index 6251b6d5..6fab397b 100644 --- a/dodam-infra/src/main/java/b1nd/dodaminfra/security/SecurityConfig.java +++ b/dodam-infra/src/main/java/b1nd/dodaminfra/security/SecurityConfig.java @@ -11,6 +11,7 @@ import org.springframework.http.HttpStatus; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.access.intercept.AuthorizationFilter; import org.springframework.security.web.authentication.HttpStatusEntryPoint; @@ -114,6 +115,11 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http.build(); } + @Bean + public void setSecurityContextHolderStrategy() { + SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_GLOBAL); + } + @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); From a12b073fc879f3eaad4e29506a12a36955b26a93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EC=B0=AC?= <129833370+dongchandev@users.noreply.github.com> Date: Fri, 24 May 2024 16:19:13 +0900 Subject: [PATCH 06/11] =?UTF-8?q?chore=20:=20=ED=94=BC=EB=93=9C=EB=B0=B1?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wakeupsong/application/MusicChartClient.java | 11 +++++++++++ .../dodamcore/wakeupsong/application/VideoClient.java | 10 ++++++++++ 2 files changed, 21 insertions(+) create mode 100644 dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/MusicChartClient.java create mode 100644 dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/VideoClient.java diff --git a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/MusicChartClient.java b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/MusicChartClient.java new file mode 100644 index 00000000..2394c080 --- /dev/null +++ b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/MusicChartClient.java @@ -0,0 +1,11 @@ +package b1nd.dodamcore.wakeupsong.application; + +import b1nd.dodamcore.wakeupsong.application.dto.res.ChartRes; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public interface MusicChartClient { + + CompletableFuture> getList(); +} diff --git a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/VideoClient.java b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/VideoClient.java new file mode 100644 index 00000000..48e13743 --- /dev/null +++ b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/VideoClient.java @@ -0,0 +1,10 @@ +package b1nd.dodamcore.wakeupsong.application; + +import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeApiRes; + +public interface VideoClient { + + YoutubeApiRes.Video getVideo(String videoId); + + YoutubeApiRes.Search searchVideoByKeyword(String keyword, int size); +} From 702f54667de18473b1ca241b6046627209145e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EC=B0=AC?= <129833370+dongchandev@users.noreply.github.com> Date: Mon, 3 Jun 2024 09:53:07 +0900 Subject: [PATCH 07/11] =?UTF-8?q?chore:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dodamapi/point/usecase/PointUseCase.java | 3 -- .../handler/WakeupSongController.java | 2 +- .../wakeupsong/usecase/WakeupSongUseCase.java | 47 ++++++++++--------- .../dodamcore/common/util/YoutubeApiUtil.java | 5 +- .../wakeupsong/application/ChartClient.java | 11 ----- .../application/WakeupSongClient.java | 10 ---- .../dodaminfra/api/melon/MelonClient.java | 4 +- .../dodaminfra/api/youtube/YoutubeClient.java | 4 +- .../security/MemberAuthenticationHolder.java | 1 - .../dodaminfra/security/SecurityConfig.java | 5 -- 10 files changed, 33 insertions(+), 59 deletions(-) delete mode 100644 dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/ChartClient.java delete mode 100644 dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongClient.java diff --git a/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java index 8d40eb00..d843ebc2 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java @@ -25,7 +25,6 @@ import java.time.LocalDate; import java.util.List; -@Slf4j @Component @Transactional(readOnly = true) @RequiredArgsConstructor @@ -38,9 +37,7 @@ public class PointUseCase { @Transactional(rollbackFor = Exception.class) public Response issue(IssuePointReq req) { - log.info("아"); PointReason reason = pointReasonService.getBy(req.reasonId()); - log.info("아잉"); List students = memberService.getStudentsByIds(req.studentIds()); savePoints(students, reason, req.issueAt()); diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java index d30fb05c..3c24c198 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java @@ -82,7 +82,7 @@ public Response deleteMyWakeupSong(@PathVariable int id) { } @GetMapping("/chart") - public ResponseData> getChart() { + public ResponseData>> getChart() { return wakeupSongUseCase.getChartList(); } } diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java index 2193d846..aad3b12c 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java @@ -5,8 +5,8 @@ import b1nd.dodamcore.common.util.YoutubeApiUtil; import b1nd.dodamcore.member.application.MemberSessionHolder; import b1nd.dodamcore.member.domain.entity.Member; -import b1nd.dodamcore.wakeupsong.application.ChartClient; -import b1nd.dodamcore.wakeupsong.application.WakeupSongClient; +import b1nd.dodamcore.wakeupsong.application.MusicChartClient; +import b1nd.dodamcore.wakeupsong.application.VideoClient; import b1nd.dodamcore.wakeupsong.application.WakeupSongService; import b1nd.dodamcore.wakeupsong.application.dto.req.ApplyWakeupSongBySearchReq; import b1nd.dodamcore.wakeupsong.application.dto.res.ChartRes; @@ -17,67 +17,65 @@ import b1nd.dodamcore.wakeupsong.domain.exception.UnsupportedVideoTypeException; import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongAlreadyCreatedException; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; -@Slf4j @Component -@Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class WakeupSongUseCase { private final WakeupSongService wakeupSongService; - private final WakeupSongClient wakeupSongClient; - private final ChartClient chartClient; + private final VideoClient videoClient; + private final MusicChartClient chartClient; private final MemberSessionHolder memberSessionHolder; + @Transactional(readOnly = true) public ResponseData> getAllowedWakeupSong(int year, int month, int day){ List wakeupSongList = wakeupSongService.getByPlayDate(year, month, day); return ResponseData.ok("승인된 기상송 조회 성공", WakeupSongRes.of(wakeupSongList)); } + @Transactional(readOnly = true) public ResponseData> getPendingWakeupSong(){ List wakeupSongList = wakeupSongService.getPendingWakeupSong(); return ResponseData.ok("승인 대기 중인 기상송 조회 성공", WakeupSongRes.of(wakeupSongList)); } + @Transactional(readOnly = true) public ResponseData> getMyWakeupSong(){ Member member = memberSessionHolder.current(); List wakeupSongList = wakeupSongService.getMyWakeupSong(member); return ResponseData.ok("자신이 신청한 기상송 조회 성공", WakeupSongRes.of(wakeupSongList)); } - @Async + @Transactional(rollbackFor = Exception.class) public CompletableFuture createWakeupSong(String videoUrl) { + Member member = verifyAlreadyAppliedFromSession(); return CompletableFuture.supplyAsync(() -> { - Member member = verifyAlreadyAppliedFromSession(); String videoId = YoutubeApiUtil.getVideoId(videoUrl); - YoutubeApiRes.Snippet snippet = wakeupSongClient.getVideo(videoId).getItems().get(0).getSnippet(); - checkIsMV(snippet.getTitle()); + YoutubeApiRes.Snippet snippet = videoClient.getVideo(videoId).getItems().get(0).getSnippet(); + checkValidVideoType(snippet.getTitle()); wakeupSongService.buildAndSaveWakeupSong(snippet, videoId, videoUrl, member); return Response.created("기상송 신청 성공"); }); } - @Async + @Transactional(rollbackFor = Exception.class) public CompletableFuture createWakeupSongByYoutubeSearch(ApplyWakeupSongBySearchReq req){ + Member member = verifyAlreadyAppliedFromSession(); return CompletableFuture.supplyAsync(() -> { - Member member = verifyAlreadyAppliedFromSession(); - YoutubeApiRes.SearchItem searchItem = wakeupSongClient.searchVideoByKeyword( + YoutubeApiRes.SearchItem searchItem = videoClient.searchVideoByKeyword( req.title() + " " + req.artist(), 1).getItems().get(0); - checkIsMV(searchItem.getSnippet().getTitle()); + checkValidVideoType(searchItem.getSnippet().getTitle()); wakeupSongService.buildAndSaveWakeupSong(searchItem.getSnippet(), searchItem.getId().getVideoId(), "https://www.youtube.com/watch?v=" + searchItem.getId().getVideoId(), member); return Response.created("유튜브 검색을 통한 기상송 신청 성공"); }); } - private void checkIsMV(String title){ + private void checkValidVideoType(String title){ if(title.contains("MV")){ throw new UnsupportedVideoTypeException(); } @@ -91,24 +89,28 @@ private Member verifyAlreadyAppliedFromSession(){ return member; } + @Transactional(rollbackFor = Exception.class) public Response allow(int id){ WakeupSong wakeupSong = wakeupSongService.getById(id); wakeupSong.allow(memberSessionHolder.current()); return Response.ok("기상송 승인 성공"); } + @Transactional(rollbackFor = Exception.class) public Response deny(int id){ WakeupSong wakeupSong = wakeupSongService.getById(id); wakeupSong.deny(); return Response.ok("기상송 거절 성공"); } + @Transactional(rollbackFor = Exception.class) public Response delete(int id){ WakeupSong wakeupSong = wakeupSongService.getById(id); wakeupSongService.delete(wakeupSong); return Response.ok("기상송 삭제 성공"); } + @Transactional(rollbackFor = Exception.class) public Response deleteMyWakeupSong(int id) { WakeupSong wakeupSong = wakeupSongService.getById(id); wakeupSong.isApplicant(memberSessionHolder.current()); @@ -116,14 +118,13 @@ public Response deleteMyWakeupSong(int id) { return Response.ok("기상송 신청 취소 성공"); } - public ResponseData> getChartList() { - List chartList = chartClient.getList().join(); - return ResponseData.ok("차트 조회 성공", chartList); + public ResponseData>> getChartList() { + return ResponseData.ok("차트 조회 성공", chartClient.getList()); } public ResponseData> getYoutubeList(String keyword) { - List videoList = wakeupSongClient.searchVideoByKeyword(keyword, 5).getItems().stream() + List videoList = videoClient.searchVideoByKeyword(keyword, 5).getItems().stream() .map(YoutubeApiUtil::getYoutubeRes).toList(); return ResponseData.ok("유튜브 검색을 통한 기상송 조회 성공", videoList); } -} +} \ No newline at end of file diff --git a/dodam-core/src/main/java/b1nd/dodamcore/common/util/YoutubeApiUtil.java b/dodam-core/src/main/java/b1nd/dodamcore/common/util/YoutubeApiUtil.java index 32929c5e..c8d341fb 100644 --- a/dodam-core/src/main/java/b1nd/dodamcore/common/util/YoutubeApiUtil.java +++ b/dodam-core/src/main/java/b1nd/dodamcore/common/util/YoutubeApiUtil.java @@ -6,7 +6,10 @@ import java.util.Optional; -public class YoutubeApiUtil { +public final class YoutubeApiUtil { + + private YoutubeApiUtil() { + } static public YoutubeApiRes.Thumbnail getThumbnailUrl(YoutubeApiRes.Snippet snippet) { Optional standard = Optional.ofNullable(snippet.getThumbnails().getStandard()); diff --git a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/ChartClient.java b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/ChartClient.java deleted file mode 100644 index bfe1e3a9..00000000 --- a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/ChartClient.java +++ /dev/null @@ -1,11 +0,0 @@ -package b1nd.dodamcore.wakeupsong.application; - -import b1nd.dodamcore.wakeupsong.application.dto.res.ChartRes; - -import java.util.List; -import java.util.concurrent.CompletableFuture; - -public interface ChartClient { - - CompletableFuture> getList(); -} diff --git a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongClient.java b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongClient.java deleted file mode 100644 index 78d8291c..00000000 --- a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongClient.java +++ /dev/null @@ -1,10 +0,0 @@ -package b1nd.dodamcore.wakeupsong.application; - -import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeApiRes; - -public interface WakeupSongClient { - - YoutubeApiRes.Video getVideo(String videoId); - - YoutubeApiRes.Search searchVideoByKeyword(String keyword, int size); -} diff --git a/dodam-infra/src/main/java/b1nd/dodaminfra/api/melon/MelonClient.java b/dodam-infra/src/main/java/b1nd/dodaminfra/api/melon/MelonClient.java index 048717aa..950d3394 100644 --- a/dodam-infra/src/main/java/b1nd/dodaminfra/api/melon/MelonClient.java +++ b/dodam-infra/src/main/java/b1nd/dodaminfra/api/melon/MelonClient.java @@ -1,6 +1,6 @@ package b1nd.dodaminfra.api.melon; -import b1nd.dodamcore.wakeupsong.application.ChartClient; +import b1nd.dodamcore.wakeupsong.application.MusicChartClient; import b1nd.dodamcore.wakeupsong.application.dto.res.ChartRes; import b1nd.dodaminfra.webclient.WebClientSupport; import lombok.RequiredArgsConstructor; @@ -12,7 +12,7 @@ @Component @RequiredArgsConstructor -public class MelonClient implements ChartClient { +public class MelonClient implements MusicChartClient { private final MelonProperties melonProperties; private final WebClientSupport webClientSupport; diff --git a/dodam-infra/src/main/java/b1nd/dodaminfra/api/youtube/YoutubeClient.java b/dodam-infra/src/main/java/b1nd/dodaminfra/api/youtube/YoutubeClient.java index 767c6f85..699f6f2c 100644 --- a/dodam-infra/src/main/java/b1nd/dodaminfra/api/youtube/YoutubeClient.java +++ b/dodam-infra/src/main/java/b1nd/dodaminfra/api/youtube/YoutubeClient.java @@ -1,6 +1,6 @@ package b1nd.dodaminfra.api.youtube; -import b1nd.dodamcore.wakeupsong.application.WakeupSongClient; +import b1nd.dodamcore.wakeupsong.application.VideoClient; import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeApiRes; import b1nd.dodaminfra.webclient.WebClientSupport; import lombok.RequiredArgsConstructor; @@ -9,7 +9,7 @@ @Component @RequiredArgsConstructor -public class YoutubeClient implements WakeupSongClient { +public class YoutubeClient implements VideoClient { private final YoutubeProperties youtubeProperties; private final WebClientSupport webClientSupport; diff --git a/dodam-infra/src/main/java/b1nd/dodaminfra/security/MemberAuthenticationHolder.java b/dodam-infra/src/main/java/b1nd/dodaminfra/security/MemberAuthenticationHolder.java index 9ab10b67..6fb4e71e 100644 --- a/dodam-infra/src/main/java/b1nd/dodaminfra/security/MemberAuthenticationHolder.java +++ b/dodam-infra/src/main/java/b1nd/dodaminfra/security/MemberAuthenticationHolder.java @@ -4,7 +4,6 @@ import b1nd.dodamcore.member.domain.entity.Member; import b1nd.dodaminfra.security.common.MemberDetails; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.concurrent.DelegatingSecurityContextExecutor; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; diff --git a/dodam-infra/src/main/java/b1nd/dodaminfra/security/SecurityConfig.java b/dodam-infra/src/main/java/b1nd/dodaminfra/security/SecurityConfig.java index 6fab397b..c059fdef 100644 --- a/dodam-infra/src/main/java/b1nd/dodaminfra/security/SecurityConfig.java +++ b/dodam-infra/src/main/java/b1nd/dodaminfra/security/SecurityConfig.java @@ -115,11 +115,6 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http.build(); } - @Bean - public void setSecurityContextHolderStrategy() { - SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_GLOBAL); - } - @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); From 6c5c4815294364c6ad96c2244ef53b15c6379009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EC=B0=AC?= <129833370+dongchandev@users.noreply.github.com> Date: Sun, 9 Jun 2024 20:34:43 +0900 Subject: [PATCH 08/11] fix: youtube util core -> api --- .../dodamapi}/common/util/YoutubeApiUtil.java | 3 +- .../wakeupsong/usecase/WakeupSongUseCase.java | 20 ++++++++++-- .../application/WakeupSongService.java | 31 ++----------------- 3 files changed, 21 insertions(+), 33 deletions(-) rename {dodam-core/src/main/java/b1nd/dodamcore => dodam-api/src/main/java/b1nd/dodamapi}/common/util/YoutubeApiUtil.java (93%) diff --git a/dodam-core/src/main/java/b1nd/dodamcore/common/util/YoutubeApiUtil.java b/dodam-api/src/main/java/b1nd/dodamapi/common/util/YoutubeApiUtil.java similarity index 93% rename from dodam-core/src/main/java/b1nd/dodamcore/common/util/YoutubeApiUtil.java rename to dodam-api/src/main/java/b1nd/dodamapi/common/util/YoutubeApiUtil.java index c8d341fb..1de774e2 100644 --- a/dodam-core/src/main/java/b1nd/dodamcore/common/util/YoutubeApiUtil.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/common/util/YoutubeApiUtil.java @@ -1,5 +1,6 @@ -package b1nd.dodamcore.common.util; +package b1nd.dodamapi.common.util; +import b1nd.dodamcore.common.util.HtmlConverter; import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeApiRes; import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeRes; import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongUrlMalformedException; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java index aad3b12c..122cc248 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java @@ -2,7 +2,8 @@ import b1nd.dodamapi.common.response.Response; import b1nd.dodamapi.common.response.ResponseData; -import b1nd.dodamcore.common.util.YoutubeApiUtil; +import b1nd.dodamapi.common.util.YoutubeApiUtil; +import b1nd.dodamcore.common.util.HtmlConverter; import b1nd.dodamcore.member.application.MemberSessionHolder; import b1nd.dodamcore.member.domain.entity.Member; import b1nd.dodamcore.wakeupsong.application.MusicChartClient; @@ -20,6 +21,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import java.nio.file.WatchKey; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -57,7 +59,7 @@ public CompletableFuture createWakeupSong(String videoUrl) { String videoId = YoutubeApiUtil.getVideoId(videoUrl); YoutubeApiRes.Snippet snippet = videoClient.getVideo(videoId).getItems().get(0).getSnippet(); checkValidVideoType(snippet.getTitle()); - wakeupSongService.buildAndSaveWakeupSong(snippet, videoId, videoUrl, member); + buildAndSaveWakeupSong(snippet, videoId,videoUrl,member); return Response.created("기상송 신청 성공"); }); } @@ -69,12 +71,24 @@ public CompletableFuture createWakeupSongByYoutubeSearch(ApplyWakeupSo YoutubeApiRes.SearchItem searchItem = videoClient.searchVideoByKeyword( req.title() + " " + req.artist(), 1).getItems().get(0); checkValidVideoType(searchItem.getSnippet().getTitle()); - wakeupSongService.buildAndSaveWakeupSong(searchItem.getSnippet(), searchItem.getId().getVideoId(), + buildAndSaveWakeupSong(searchItem.getSnippet(), searchItem.getId().getVideoId(), "https://www.youtube.com/watch?v=" + searchItem.getId().getVideoId(), member); return Response.created("유튜브 검색을 통한 기상송 신청 성공"); }); } + private void buildAndSaveWakeupSong(YoutubeApiRes.Snippet snippet, String videoId, String videoUrl, Member member){ + WakeupSong wakeupSong = WakeupSong.builder() + .videoId(videoId) + .videoTitle(HtmlConverter.of(snippet.getTitle())) + .videoUrl(videoUrl) + .channelTitle(snippet.getChannelTitle()) + .thumbnailUrl(YoutubeApiUtil.getThumbnailUrl(snippet).getUrl()) + .member(member) + .build(); + wakeupSongService.saveWakeupSong(wakeupSong); + } + private void checkValidVideoType(String title){ if(title.contains("MV")){ throw new UnsupportedVideoTypeException(); diff --git a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java index 3a58f043..9cb1b41f 100644 --- a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java +++ b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java @@ -1,20 +1,10 @@ package b1nd.dodamcore.wakeupsong.application; -import b1nd.dodamcore.common.util.HtmlConverter; -import b1nd.dodamcore.common.util.YoutubeApiUtil; import b1nd.dodamcore.common.util.ZonedDateTimeUtil; -import b1nd.dodamcore.member.application.MemberSessionHolder; import b1nd.dodamcore.member.domain.entity.Member; -import b1nd.dodamcore.wakeupsong.application.dto.req.ApplyWakeupSongBySearchReq; -import b1nd.dodamcore.wakeupsong.application.dto.res.ChartRes; -import b1nd.dodamcore.wakeupsong.application.dto.res.WakeupSongRes; -import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeApiRes; -import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeRes; import b1nd.dodamcore.wakeupsong.domain.entity.WakeupSong; import b1nd.dodamcore.wakeupsong.domain.enums.WakeupSongStatus; -import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongAlreadyCreatedException; import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongNotFoundException; -import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongUrlMalformedException; import b1nd.dodamcore.wakeupsong.repository.WakeupSongRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -22,7 +12,6 @@ import java.time.LocalDate; import java.util.List; -import java.util.Optional; @Service @RequiredArgsConstructor @@ -42,25 +31,9 @@ public List getMyWakeupSong(Member member) { return wakeupSongRepository.findAllByMember_IdAndStatus(member.getId(), WakeupSongStatus.PENDING); } - private void save(WakeupSong wakeupSong) { - wakeupSongRepository.save(wakeupSong); - } - @Transactional(rollbackFor = Exception.class) - public void buildAndSaveWakeupSong(YoutubeApiRes.Snippet snippet, String videoId, String videoUrl, Member member){ - WakeupSong wakeupSong = buildWakeupSong(snippet, videoId, videoUrl, member); - save(wakeupSong); - } - - private WakeupSong buildWakeupSong(YoutubeApiRes.Snippet snippet, String videoId, String videoUrl, Member member){ - return WakeupSong.builder() - .videoId(videoId) - .videoTitle(HtmlConverter.of(snippet.getTitle())) - .videoUrl(videoUrl) - .channelTitle(snippet.getChannelTitle()) - .thumbnailUrl(YoutubeApiUtil.getThumbnailUrl(snippet).getUrl()) - .member(member) - .build(); + public void saveWakeupSong(WakeupSong wakeupSong){ + wakeupSongRepository.save(wakeupSong); } public Boolean existsByMemberAndCreatedAt(Member member){ From 782b08542581171956b882c93e04de1971d75dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EC=B0=AC?= <129833370+dongchandev@users.noreply.github.com> Date: Mon, 10 Jun 2024 14:46:38 +0900 Subject: [PATCH 09/11] =?UTF-8?q?fix:=20ErrorResponseEntity=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dodamapi/auth/handler/AuthController.java | 2 +- .../dodamapi/auth/usecase/AuthUseCase.java | 2 +- .../dodamapi/banner/BannerController.java | 4 +- .../java/b1nd/dodamapi/bus/BusController.java | 4 +- .../exception/CustomExceptionHandler.java | 76 +++++++++---------- .../dodamapi/common/util/YoutubeApiUtil.java | 3 + .../handler/ConferenceController.java | 2 +- .../conference/usecase/ConferenceUseCase.java | 2 +- .../b1nd/dodamapi/meal/MealController.java | 2 +- .../member/handler/MemberController.java | 4 +- .../member/usecase/MemberCommandUseCase.java | 2 +- .../member/usecase/MemberQueryUseCase.java | 2 +- .../handler/NightStudyController.java | 4 +- .../nightstudy/usecase/NightStudyUseCase.java | 4 +- .../outgoing/handler/OutGoingController.java | 4 +- .../outgoing/usecase/OutGoingUseCase.java | 4 +- .../handler/OutSleepingController.java | 4 +- .../usecase/OutSleepingUseCase.java | 4 +- .../point/handler/PointController.java | 4 +- .../point/usecase/PointReasonUseCase.java | 4 +- .../dodamapi/point/usecase/PointUseCase.java | 5 +- .../dodamapi/recruit/RecruitController.java | 4 +- .../dodamapi/schedule/ScheduleController.java | 4 +- .../dodamapi/upload/UploadController.java | 2 +- .../handler/WakeupSongController.java | 8 +- .../wakeupsong/usecase/WakeupSongUseCase.java | 8 +- .../common/exception/ErrorResponseEntity.java | 23 ------ .../common/response/ErrorResponseEntity.java | 31 ++++++++ .../dodamcore}/common/response/Response.java | 2 +- .../common/response/ResponseData.java | 2 +- .../security/common/ErrorResponseSender.java | 11 ++- 31 files changed, 122 insertions(+), 115 deletions(-) delete mode 100644 dodam-core/src/main/java/b1nd/dodamcore/common/exception/ErrorResponseEntity.java create mode 100644 dodam-core/src/main/java/b1nd/dodamcore/common/response/ErrorResponseEntity.java rename {dodam-api/src/main/java/b1nd/dodamapi => dodam-core/src/main/java/b1nd/dodamcore}/common/response/Response.java (94%) rename {dodam-api/src/main/java/b1nd/dodamapi => dodam-core/src/main/java/b1nd/dodamcore}/common/response/ResponseData.java (94%) diff --git a/dodam-api/src/main/java/b1nd/dodamapi/auth/handler/AuthController.java b/dodam-api/src/main/java/b1nd/dodamapi/auth/handler/AuthController.java index b3d38ccf..c9f49f3e 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/auth/handler/AuthController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/auth/handler/AuthController.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.auth.handler; import b1nd.dodamapi.auth.usecase.AuthUseCase; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.auth.application.dto.req.LoginReq; import b1nd.dodamcore.auth.application.dto.req.ReissueTokenReq; import b1nd.dodamcore.auth.application.dto.res.LoginRes; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/auth/usecase/AuthUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/auth/usecase/AuthUseCase.java index 92e6d3e6..c2bf0d05 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/auth/usecase/AuthUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/auth/usecase/AuthUseCase.java @@ -1,6 +1,6 @@ package b1nd.dodamapi.auth.usecase; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.auth.application.PasswordEncoder; import b1nd.dodamcore.auth.application.TokenClient; import b1nd.dodamcore.auth.application.dto.req.LoginReq; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/banner/BannerController.java b/dodam-api/src/main/java/b1nd/dodamapi/banner/BannerController.java index 1ade4011..f0cc1f7c 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/banner/BannerController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/banner/BannerController.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.banner; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.banner.application.BannerService; import b1nd.dodamcore.banner.application.dto.req.BannerReq; import b1nd.dodamcore.banner.domain.entity.Banner; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/bus/BusController.java b/dodam-api/src/main/java/b1nd/dodamapi/bus/BusController.java index 586cf9b4..f700c6c2 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/bus/BusController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/bus/BusController.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.bus; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.bus.application.BusService; import b1nd.dodamcore.bus.application.dto.req.BusReq; import b1nd.dodamcore.bus.application.dto.res.BusRes; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/common/exception/CustomExceptionHandler.java b/dodam-api/src/main/java/b1nd/dodamapi/common/exception/CustomExceptionHandler.java index 96e7af76..78d95e8b 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/common/exception/CustomExceptionHandler.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/common/exception/CustomExceptionHandler.java @@ -1,6 +1,6 @@ package b1nd.dodamapi.common.exception; -import b1nd.dodamcore.common.exception.ErrorResponseEntity; +import b1nd.dodamcore.common.response.ErrorResponseEntity; import b1nd.dodamcore.common.exception.ExceptionCode; import b1nd.dodamcore.common.exception.GlobalExceptionCode; import b1nd.dodamcore.common.exception.CustomException; @@ -43,14 +43,14 @@ protected ResponseEntity handleValidException(MethodArgumen log.error("Valid Fail Object : {}", e.getObjectName()); log.error("Valid Fail Message : \"{}\"", message); + ErrorResponseEntity.of(e.getStatusCode().value(), GlobalExceptionCode.PARAMETER_NOT_VALID.name(),message); return ResponseEntity .status(e.getStatusCode()) - .body(ErrorResponseEntity.builder() - .status(e.getStatusCode().value()) - .code(GlobalExceptionCode.PARAMETER_NOT_VALID.name()) - .message(message) - .build() - ); + .body(ErrorResponseEntity.of( + e.getStatusCode().value(), + GlobalExceptionCode.PARAMETER_NOT_VALID.name(), + message + )); } private String getValidExceptionMessages(List errors) { @@ -65,70 +65,70 @@ private String getValidExceptionMessages(List errors) { @ExceptionHandler(MissingServletRequestParameterException.class) protected ResponseEntity handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { + return ResponseEntity .status(400) - .body(ErrorResponseEntity.builder() - .status(GlobalExceptionCode.PARAMETER_NOT_FOUND.getStatus().value()) - .code(GlobalExceptionCode.PARAMETER_NOT_FOUND.name()) - .message(GlobalExceptionCode.PARAMETER_NOT_FOUND.getMessage()) - .build()); + .body(ErrorResponseEntity.of( + GlobalExceptionCode.PARAMETER_NOT_FOUND.getStatus().value(), + GlobalExceptionCode.PARAMETER_NOT_FOUND.name(), + GlobalExceptionCode.PARAMETER_NOT_FOUND.getMessage() + )); } @ExceptionHandler(HttpMessageNotReadableException.class) protected ResponseEntity handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { return ResponseEntity .status(400) - .body(ErrorResponseEntity.builder() - .status(GlobalExceptionCode.PARAMETER_NOT_FOUND.getStatus().value()) - .code(GlobalExceptionCode.PARAMETER_NOT_FOUND.name()) - .message(GlobalExceptionCode.PARAMETER_NOT_FOUND.getMessage()) - .build()); + .body(ErrorResponseEntity.of( + GlobalExceptionCode.PARAMETER_NOT_FOUND.getStatus().value(), + GlobalExceptionCode.PARAMETER_NOT_FOUND.name(), + GlobalExceptionCode.PARAMETER_NOT_FOUND.getMessage() + )); } @ExceptionHandler(HttpRequestMethodNotSupportedException.class) protected ResponseEntity handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { return ResponseEntity .status(400) - .body(ErrorResponseEntity.builder() - .status(GlobalExceptionCode.METHOD_NOT_SUPPORTED.getStatus().value()) - .code(GlobalExceptionCode.METHOD_NOT_SUPPORTED.name()) - .message(GlobalExceptionCode.METHOD_NOT_SUPPORTED.getMessage()) - .build()); + .body(ErrorResponseEntity.of( + GlobalExceptionCode.METHOD_NOT_SUPPORTED.getStatus().value(), + GlobalExceptionCode.METHOD_NOT_SUPPORTED.name(), + GlobalExceptionCode.METHOD_NOT_SUPPORTED.getMessage() + )); } @ExceptionHandler(HttpMediaTypeNotSupportedException.class) protected ResponseEntity handleHttpMediaTypeNotSupportedException() { return ResponseEntity .status(400) - .body(ErrorResponseEntity.builder() - .status(GlobalExceptionCode.MEDIA_TYPE_NOT_SUPPORTED.getStatus().value()) - .code(GlobalExceptionCode.MEDIA_TYPE_NOT_SUPPORTED.name()) - .message(GlobalExceptionCode.MEDIA_TYPE_NOT_SUPPORTED.getMessage()) - .build()); + .body(ErrorResponseEntity.of( + GlobalExceptionCode.MEDIA_TYPE_NOT_SUPPORTED.getStatus().value(), + GlobalExceptionCode.MEDIA_TYPE_NOT_SUPPORTED.name(), + GlobalExceptionCode.MEDIA_TYPE_NOT_SUPPORTED.getMessage() + )); } @ExceptionHandler(MethodArgumentTypeMismatchException.class) protected ResponseEntity handleMethodArgumentTypeMismatchException() { return ResponseEntity .status(400) - .body(ErrorResponseEntity.builder() - .status(GlobalExceptionCode.MEDIA_TYPE_MISS_MATCHED.getStatus().value()) - .code(GlobalExceptionCode.MEDIA_TYPE_MISS_MATCHED.name()) - .message(GlobalExceptionCode.MEDIA_TYPE_MISS_MATCHED.getMessage()) - .build()); + .body(ErrorResponseEntity.of( + GlobalExceptionCode.MEDIA_TYPE_MISS_MATCHED.getStatus().value(), + GlobalExceptionCode.MEDIA_TYPE_MISS_MATCHED.name(), + GlobalExceptionCode.MEDIA_TYPE_MISS_MATCHED.getMessage() + )); } @ExceptionHandler(Exception.class) protected ResponseEntity handleException(Exception e, HttpServletRequest request) { sendErrorNotice(e, request); - return ResponseEntity .status(500) - .body(ErrorResponseEntity.builder() - .status(GlobalExceptionCode.INTERNAL_SERVER.getStatus().value()) - .code(GlobalExceptionCode.INTERNAL_SERVER.name()) - .message(GlobalExceptionCode.INTERNAL_SERVER.getMessage()) - .build()); + .body(ErrorResponseEntity.of( + GlobalExceptionCode.INTERNAL_SERVER.getStatus().value(), + GlobalExceptionCode.INTERNAL_SERVER.name(), + GlobalExceptionCode.INTERNAL_SERVER.getMessage() + )); } private void sendErrorNotice(Exception e, HttpServletRequest request) { diff --git a/dodam-api/src/main/java/b1nd/dodamapi/common/util/YoutubeApiUtil.java b/dodam-api/src/main/java/b1nd/dodamapi/common/util/YoutubeApiUtil.java index 1de774e2..5fb4c137 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/common/util/YoutubeApiUtil.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/common/util/YoutubeApiUtil.java @@ -1,11 +1,14 @@ package b1nd.dodamapi.common.util; +import b1nd.dodamcore.common.response.ErrorResponseEntity; import b1nd.dodamcore.common.util.HtmlConverter; import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeApiRes; import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeRes; +import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongExceptionCode; import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongUrlMalformedException; import java.util.Optional; +import java.util.concurrent.CompletableFuture; public final class YoutubeApiUtil { diff --git a/dodam-api/src/main/java/b1nd/dodamapi/conference/handler/ConferenceController.java b/dodam-api/src/main/java/b1nd/dodamapi/conference/handler/ConferenceController.java index 884d519f..f890c73b 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/conference/handler/ConferenceController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/conference/handler/ConferenceController.java @@ -1,6 +1,6 @@ package b1nd.dodamapi.conference.handler; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamapi.conference.usecase.ConferenceUseCase; import b1nd.dodamcore.conference.application.dto.res.ConferenceRes; import lombok.RequiredArgsConstructor; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/conference/usecase/ConferenceUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/conference/usecase/ConferenceUseCase.java index 8c15387e..54c06083 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/conference/usecase/ConferenceUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/conference/usecase/ConferenceUseCase.java @@ -1,6 +1,6 @@ package b1nd.dodamapi.conference.usecase; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.conference.application.ConferenceClient; import b1nd.dodamcore.conference.application.dto.res.ConferenceRes; import lombok.RequiredArgsConstructor; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/meal/MealController.java b/dodam-api/src/main/java/b1nd/dodamapi/meal/MealController.java index 94856dd9..47c4ba80 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/meal/MealController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/meal/MealController.java @@ -1,6 +1,6 @@ package b1nd.dodamapi.meal; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.meal.application.MealService; import b1nd.dodamcore.meal.application.dto.Meal; import lombok.RequiredArgsConstructor; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/member/handler/MemberController.java b/dodam-api/src/main/java/b1nd/dodamapi/member/handler/MemberController.java index f6596279..c9a4c293 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/member/handler/MemberController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/member/handler/MemberController.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.member.handler; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamapi.member.usecase.MemberCommandUseCase; import b1nd.dodamapi.member.usecase.MemberQueryUseCase; import b1nd.dodamapi.member.usecase.req.*; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/member/usecase/MemberCommandUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/member/usecase/MemberCommandUseCase.java index aa970eca..d4edba98 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/member/usecase/MemberCommandUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/member/usecase/MemberCommandUseCase.java @@ -1,6 +1,6 @@ package b1nd.dodamapi.member.usecase; -import b1nd.dodamapi.common.response.Response; +import b1nd.dodamcore.common.response.Response; import b1nd.dodamapi.member.usecase.req.*; import b1nd.dodamcore.auth.application.PasswordEncoder; import b1nd.dodamcore.member.application.MemberService; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/member/usecase/MemberQueryUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/member/usecase/MemberQueryUseCase.java index 9acfdd47..40abc769 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/member/usecase/MemberQueryUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/member/usecase/MemberQueryUseCase.java @@ -1,6 +1,6 @@ package b1nd.dodamapi.member.usecase; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.member.application.MemberService; import b1nd.dodamcore.member.application.MemberSessionHolder; import b1nd.dodamcore.member.domain.entity.Member; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/nightstudy/handler/NightStudyController.java b/dodam-api/src/main/java/b1nd/dodamapi/nightstudy/handler/NightStudyController.java index 400d0352..8c01d380 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/nightstudy/handler/NightStudyController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/nightstudy/handler/NightStudyController.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.nightstudy.handler; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamapi.nightstudy.usecase.NightStudyUseCase; import b1nd.dodamapi.nightstudy.usecase.dto.req.ApplyNightStudyReq; import b1nd.dodamapi.nightstudy.usecase.dto.req.RejectNightStudyReq; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/nightstudy/usecase/NightStudyUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/nightstudy/usecase/NightStudyUseCase.java index 99559aa7..0e40750d 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/nightstudy/usecase/NightStudyUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/nightstudy/usecase/NightStudyUseCase.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.nightstudy.usecase; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.common.util.ZonedDateTimeUtil; import b1nd.dodamcore.member.application.MemberService; import b1nd.dodamcore.member.domain.entity.Student; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/outgoing/handler/OutGoingController.java b/dodam-api/src/main/java/b1nd/dodamapi/outgoing/handler/OutGoingController.java index 6a0c0870..1a1958b9 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/outgoing/handler/OutGoingController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/outgoing/handler/OutGoingController.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.outgoing.handler; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamapi.outgoing.usecase.OutGoingUseCase; import b1nd.dodamapi.outgoing.usecase.dto.req.RejectOutGoingReq; import b1nd.dodamapi.outgoing.usecase.dto.res.OutGoingRes; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/outgoing/usecase/OutGoingUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/outgoing/usecase/OutGoingUseCase.java index 78a767c7..19b1a52f 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/outgoing/usecase/OutGoingUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/outgoing/usecase/OutGoingUseCase.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.outgoing.usecase; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.common.util.ZonedDateTimeUtil; import b1nd.dodamcore.member.application.MemberService; import b1nd.dodamcore.member.domain.entity.Student; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/outsleeping/handler/OutSleepingController.java b/dodam-api/src/main/java/b1nd/dodamapi/outsleeping/handler/OutSleepingController.java index ef2ed24d..f9d461da 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/outsleeping/handler/OutSleepingController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/outsleeping/handler/OutSleepingController.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.outsleeping.handler; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamapi.outsleeping.usecase.OutSleepingUseCase; import b1nd.dodamapi.outsleeping.usecase.dto.req.ApplyOutSleepingReq; import b1nd.dodamapi.outsleeping.usecase.dto.req.RejectOutSleepingReq; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/outsleeping/usecase/OutSleepingUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/outsleeping/usecase/OutSleepingUseCase.java index 2c2b6293..667d206a 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/outsleeping/usecase/OutSleepingUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/outsleeping/usecase/OutSleepingUseCase.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.outsleeping.usecase; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.common.util.ZonedDateTimeUtil; import b1nd.dodamcore.member.application.MemberService; import b1nd.dodamcore.member.domain.entity.Student; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/point/handler/PointController.java b/dodam-api/src/main/java/b1nd/dodamapi/point/handler/PointController.java index ff8a2c6f..ca0384a3 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/point/handler/PointController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/point/handler/PointController.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.point.handler; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamapi.point.usecase.PointReasonUseCase; import b1nd.dodamapi.point.usecase.PointUseCase; import b1nd.dodamapi.point.usecase.req.IssuePointReq; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointReasonUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointReasonUseCase.java index d99ea0a9..72ec739e 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointReasonUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointReasonUseCase.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.point.usecase; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.point.application.PointReasonService; import b1nd.dodamapi.point.usecase.req.ModifyPointReasonReq; import b1nd.dodamapi.point.usecase.req.RegisterPointReasonReq; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java index d843ebc2..b38255ab 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/point/usecase/PointUseCase.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.point.usecase; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.member.application.MemberService; import b1nd.dodamcore.member.domain.entity.Member; import b1nd.dodamcore.member.domain.entity.Student; @@ -17,7 +17,6 @@ import b1nd.dodamcore.point.domain.entity.PointScore; import b1nd.dodamcore.point.domain.enums.PointType; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/recruit/RecruitController.java b/dodam-api/src/main/java/b1nd/dodamapi/recruit/RecruitController.java index 2871d886..6edee185 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/recruit/RecruitController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/recruit/RecruitController.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.recruit; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.recruit.application.RecruitService; import b1nd.dodamcore.recruit.application.dto.req.RecruitReq; import b1nd.dodamcore.recruit.application.dto.res.RecruitPageRes; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/schedule/ScheduleController.java b/dodam-api/src/main/java/b1nd/dodamapi/schedule/ScheduleController.java index ef5f7bd8..0c8da325 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/schedule/ScheduleController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/schedule/ScheduleController.java @@ -1,7 +1,7 @@ package b1nd.dodamapi.schedule; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.schedule.application.ScheduleService; import b1nd.dodamcore.schedule.application.dto.req.ScheduleReq; import b1nd.dodamcore.schedule.application.dto.res.ScheduleRes; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/upload/UploadController.java b/dodam-api/src/main/java/b1nd/dodamapi/upload/UploadController.java index e575f581..02f57d91 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/upload/UploadController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/upload/UploadController.java @@ -1,6 +1,6 @@ package b1nd.dodamapi.upload; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamcore.upload.application.UploadService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java index 3c24c198..fca229d5 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/handler/WakeupSongController.java @@ -1,9 +1,8 @@ package b1nd.dodamapi.wakeupsong.handler; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamapi.wakeupsong.usecase.WakeupSongUseCase; -import b1nd.dodamcore.wakeupsong.application.WakeupSongService; import b1nd.dodamcore.wakeupsong.application.dto.req.ApplyWakeupSongBySearchReq; import b1nd.dodamcore.wakeupsong.application.dto.req.ApplyWakeupSongReq; import b1nd.dodamcore.wakeupsong.application.dto.res.ChartRes; @@ -12,13 +11,10 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; @RestController @RequestMapping("/wakeup-song") diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java index 122cc248..286442a3 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java @@ -1,7 +1,9 @@ package b1nd.dodamapi.wakeupsong.usecase; -import b1nd.dodamapi.common.response.Response; -import b1nd.dodamapi.common.response.ResponseData; +import b1nd.dodamcore.common.exception.GlobalExceptionCode; +import b1nd.dodamcore.common.response.ErrorResponseEntity; +import b1nd.dodamcore.common.response.Response; +import b1nd.dodamcore.common.response.ResponseData; import b1nd.dodamapi.common.util.YoutubeApiUtil; import b1nd.dodamcore.common.util.HtmlConverter; import b1nd.dodamcore.member.application.MemberSessionHolder; @@ -18,10 +20,10 @@ import b1nd.dodamcore.wakeupsong.domain.exception.UnsupportedVideoTypeException; import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongAlreadyCreatedException; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import java.nio.file.WatchKey; import java.util.List; import java.util.concurrent.CompletableFuture; diff --git a/dodam-core/src/main/java/b1nd/dodamcore/common/exception/ErrorResponseEntity.java b/dodam-core/src/main/java/b1nd/dodamcore/common/exception/ErrorResponseEntity.java deleted file mode 100644 index a064094e..00000000 --- a/dodam-core/src/main/java/b1nd/dodamcore/common/exception/ErrorResponseEntity.java +++ /dev/null @@ -1,23 +0,0 @@ -package b1nd.dodamcore.common.exception; - -import lombok.Builder; -import lombok.Getter; -import org.springframework.http.ResponseEntity; - -@Getter -@Builder -public class ErrorResponseEntity { - private int status; - private String code; - private String message; - - public static ResponseEntity responseEntity(ExceptionCode e){ - return ResponseEntity - .status(e.getHttpStatus()) - .body(ErrorResponseEntity.builder() - .status(e.getHttpStatus().value()) - .code(e.getExceptionName()) - .message(e.getMessage()) - .build()); - } -} diff --git a/dodam-core/src/main/java/b1nd/dodamcore/common/response/ErrorResponseEntity.java b/dodam-core/src/main/java/b1nd/dodamcore/common/response/ErrorResponseEntity.java new file mode 100644 index 00000000..377f6708 --- /dev/null +++ b/dodam-core/src/main/java/b1nd/dodamcore/common/response/ErrorResponseEntity.java @@ -0,0 +1,31 @@ +package b1nd.dodamcore.common.response; + +import b1nd.dodamcore.common.exception.ExceptionCode; +import lombok.Builder; +import lombok.Getter; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +@Getter +@Builder +public class ErrorResponseEntity extends Response { + private final String code; + + private ErrorResponseEntity(int status, String code, String message) { + super(status, message); + this.code = code; + } + + public static ResponseEntity responseEntity(ExceptionCode e){ + return ResponseEntity + .status(e.getHttpStatus()) + .body(new ErrorResponseEntity( + e.getHttpStatus().value(), + e.getExceptionName(), + e.getMessage())); + } + + public static ErrorResponseEntity of(int status, String code, String message) { + return new ErrorResponseEntity(status, code, message); + } +} diff --git a/dodam-api/src/main/java/b1nd/dodamapi/common/response/Response.java b/dodam-core/src/main/java/b1nd/dodamcore/common/response/Response.java similarity index 94% rename from dodam-api/src/main/java/b1nd/dodamapi/common/response/Response.java rename to dodam-core/src/main/java/b1nd/dodamcore/common/response/Response.java index f46f733a..c7af5aae 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/common/response/Response.java +++ b/dodam-core/src/main/java/b1nd/dodamcore/common/response/Response.java @@ -1,4 +1,4 @@ -package b1nd.dodamapi.common.response; +package b1nd.dodamcore.common.response; import lombok.Builder; import lombok.Getter; diff --git a/dodam-api/src/main/java/b1nd/dodamapi/common/response/ResponseData.java b/dodam-core/src/main/java/b1nd/dodamcore/common/response/ResponseData.java similarity index 94% rename from dodam-api/src/main/java/b1nd/dodamapi/common/response/ResponseData.java rename to dodam-core/src/main/java/b1nd/dodamcore/common/response/ResponseData.java index fb7180f0..3a044c58 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/common/response/ResponseData.java +++ b/dodam-core/src/main/java/b1nd/dodamcore/common/response/ResponseData.java @@ -1,4 +1,4 @@ -package b1nd.dodamapi.common.response; +package b1nd.dodamcore.common.response; import lombok.Getter; import org.springframework.http.HttpStatus; diff --git a/dodam-infra/src/main/java/b1nd/dodaminfra/security/common/ErrorResponseSender.java b/dodam-infra/src/main/java/b1nd/dodaminfra/security/common/ErrorResponseSender.java index 8afa6f6b..3ac652c4 100644 --- a/dodam-infra/src/main/java/b1nd/dodaminfra/security/common/ErrorResponseSender.java +++ b/dodam-infra/src/main/java/b1nd/dodaminfra/security/common/ErrorResponseSender.java @@ -1,6 +1,6 @@ package b1nd.dodaminfra.security.common; -import b1nd.dodamcore.common.exception.ErrorResponseEntity; +import b1nd.dodamcore.common.response.ErrorResponseEntity; import b1nd.dodamcore.common.exception.ExceptionCode; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletResponse; @@ -29,11 +29,10 @@ public void send(HttpServletResponse response, ExceptionCode code) { } private ErrorResponseEntity getErrorResponseEntity(ExceptionCode code) { - return ErrorResponseEntity.builder() - .status(code.getHttpStatus().value()) - .code(code.getExceptionName()) - .message(code.getMessage()) - .build(); + return ErrorResponseEntity.of( + code.getHttpStatus(), + code.getExceptionName(), + code.getMessage()); } } From 3728de8d88dba17869bba5957d6236bb371f982c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EC=B0=AC?= <129833370+dongchandev@users.noreply.github.com> Date: Mon, 10 Jun 2024 18:23:09 +0900 Subject: [PATCH 10/11] =?UTF-8?q?chore:=20exceptionally=EB=A5=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=9C=20=EB=B9=84=EB=8F=99=EA=B8=B0=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dodamapi/common/util/YoutubeApiUtil.java | 3 -- .../wakeupsong/usecase/WakeupSongUseCase.java | 28 +++++++++++++++++-- .../common/response/ErrorResponseEntity.java | 1 - .../security/common/ErrorResponseSender.java | 2 +- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/dodam-api/src/main/java/b1nd/dodamapi/common/util/YoutubeApiUtil.java b/dodam-api/src/main/java/b1nd/dodamapi/common/util/YoutubeApiUtil.java index 5fb4c137..1de774e2 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/common/util/YoutubeApiUtil.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/common/util/YoutubeApiUtil.java @@ -1,14 +1,11 @@ package b1nd.dodamapi.common.util; -import b1nd.dodamcore.common.response.ErrorResponseEntity; import b1nd.dodamcore.common.util.HtmlConverter; import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeApiRes; import b1nd.dodamcore.wakeupsong.application.dto.res.YoutubeRes; -import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongExceptionCode; import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongUrlMalformedException; import java.util.Optional; -import java.util.concurrent.CompletableFuture; public final class YoutubeApiUtil { diff --git a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java index 286442a3..ea082f75 100644 --- a/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java +++ b/dodam-api/src/main/java/b1nd/dodamapi/wakeupsong/usecase/WakeupSongUseCase.java @@ -1,10 +1,11 @@ package b1nd.dodamapi.wakeupsong.usecase; +import b1nd.dodamapi.common.util.YoutubeApiUtil; +import b1nd.dodamcore.common.exception.ExceptionCode; import b1nd.dodamcore.common.exception.GlobalExceptionCode; import b1nd.dodamcore.common.response.ErrorResponseEntity; import b1nd.dodamcore.common.response.Response; import b1nd.dodamcore.common.response.ResponseData; -import b1nd.dodamapi.common.util.YoutubeApiUtil; import b1nd.dodamcore.common.util.HtmlConverter; import b1nd.dodamcore.member.application.MemberSessionHolder; import b1nd.dodamcore.member.domain.entity.Member; @@ -19,14 +20,19 @@ import b1nd.dodamcore.wakeupsong.domain.entity.WakeupSong; import b1nd.dodamcore.wakeupsong.domain.exception.UnsupportedVideoTypeException; import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongAlreadyCreatedException; +import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongExceptionCode; +import b1nd.dodamcore.wakeupsong.domain.exception.WakeupSongUrlMalformedException; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +@Slf4j @Component @RequiredArgsConstructor public class WakeupSongUseCase { @@ -63,7 +69,7 @@ public CompletableFuture createWakeupSong(String videoUrl) { checkValidVideoType(snippet.getTitle()); buildAndSaveWakeupSong(snippet, videoId,videoUrl,member); return Response.created("기상송 신청 성공"); - }); + }).exceptionally(this::handleExceptionOnCreateWakeupSong); } @Transactional(rollbackFor = Exception.class) @@ -76,7 +82,23 @@ public CompletableFuture createWakeupSongByYoutubeSearch(ApplyWakeupSo buildAndSaveWakeupSong(searchItem.getSnippet(), searchItem.getId().getVideoId(), "https://www.youtube.com/watch?v=" + searchItem.getId().getVideoId(), member); return Response.created("유튜브 검색을 통한 기상송 신청 성공"); - }); + }).exceptionally(this::handleExceptionOnCreateWakeupSong); + } + + private Response handleExceptionOnCreateWakeupSong(Throwable e) { + Throwable cause = (e instanceof CompletionException) ? e.getCause() : e; + ExceptionCode exceptionCode = mapExceptionToCodeOnCreateWakeupSong(cause); + return ErrorResponseEntity.of(exceptionCode.getHttpStatus().value(), exceptionCode.getExceptionName(), exceptionCode.getMessage()); + } + + private ExceptionCode mapExceptionToCodeOnCreateWakeupSong(Throwable cause) { + if (cause instanceof WakeupSongUrlMalformedException) { + return WakeupSongExceptionCode.URL_MALFORMED; + } else if (cause instanceof UnsupportedVideoTypeException) { + return WakeupSongExceptionCode.UNSUPPORTED_TYPE; + } else { + return GlobalExceptionCode.INTERNAL_SERVER; + } } private void buildAndSaveWakeupSong(YoutubeApiRes.Snippet snippet, String videoId, String videoUrl, Member member){ diff --git a/dodam-core/src/main/java/b1nd/dodamcore/common/response/ErrorResponseEntity.java b/dodam-core/src/main/java/b1nd/dodamcore/common/response/ErrorResponseEntity.java index 377f6708..fa8afa46 100644 --- a/dodam-core/src/main/java/b1nd/dodamcore/common/response/ErrorResponseEntity.java +++ b/dodam-core/src/main/java/b1nd/dodamcore/common/response/ErrorResponseEntity.java @@ -7,7 +7,6 @@ import org.springframework.http.ResponseEntity; @Getter -@Builder public class ErrorResponseEntity extends Response { private final String code; diff --git a/dodam-infra/src/main/java/b1nd/dodaminfra/security/common/ErrorResponseSender.java b/dodam-infra/src/main/java/b1nd/dodaminfra/security/common/ErrorResponseSender.java index 3ac652c4..42bbb1fb 100644 --- a/dodam-infra/src/main/java/b1nd/dodaminfra/security/common/ErrorResponseSender.java +++ b/dodam-infra/src/main/java/b1nd/dodaminfra/security/common/ErrorResponseSender.java @@ -30,7 +30,7 @@ public void send(HttpServletResponse response, ExceptionCode code) { private ErrorResponseEntity getErrorResponseEntity(ExceptionCode code) { return ErrorResponseEntity.of( - code.getHttpStatus(), + code.getHttpStatus().value(), code.getExceptionName(), code.getMessage()); } From 40ebcc7f1a38d3814746a56862c182a16ec8193a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EC=B0=AC?= <129833370+dongchandev@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:13:26 +0900 Subject: [PATCH 11/11] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20Transactional=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dodamcore/wakeupsong/application/WakeupSongService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java index 9cb1b41f..8a9d7a86 100644 --- a/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java +++ b/dodam-core/src/main/java/b1nd/dodamcore/wakeupsong/application/WakeupSongService.java @@ -31,7 +31,6 @@ public List getMyWakeupSong(Member member) { return wakeupSongRepository.findAllByMember_IdAndStatus(member.getId(), WakeupSongStatus.PENDING); } - @Transactional(rollbackFor = Exception.class) public void saveWakeupSong(WakeupSong wakeupSong){ wakeupSongRepository.save(wakeupSong); } @@ -45,7 +44,6 @@ public WakeupSong getById(int id){ .orElseThrow(WakeupSongNotFoundException::new); } - @Transactional(rollbackFor = Exception.class) public void delete(WakeupSong wakeupSong){ wakeupSongRepository.delete(wakeupSong); }