From 353146a6d24248bf2a39dced34d434ff5c5a9417 Mon Sep 17 00:00:00 2001 From: pilyang Date: Tue, 12 Mar 2024 18:56:48 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20=ED=94=BC=EB=93=9C=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=EC=97=90=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=EB=90=9C=20=ED=94=BC=EB=93=9C=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FeedResponse, FeedImageResponse 사용 --- .../feed/application/FeedReadService.java | 7 +-- .../feed/application/FeedWriteService.java | 43 +++++++++++++------ .../application/dto/FeedImageResponse.java | 11 +++++ .../feed/application/event/FeedEvent.java | 11 ++++- .../converter/FeedEventConverterTest.java | 9 +++- 5 files changed, 58 insertions(+), 23 deletions(-) diff --git a/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedReadService.java b/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedReadService.java index 8e6b40feb..c7c815f79 100644 --- a/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedReadService.java +++ b/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedReadService.java @@ -101,12 +101,7 @@ private FeedResponse mapToResponse(final Feed feed, final MemberTeamPlace author private List mapToFeedImageResponse(final FeedThread feedThread) { final List images = feedThread.getImages(); - return images.stream().map(feedThreadImage -> - new FeedImageResponse( - feedThreadImage.getId(), - feedThreadImage.isExpired(), - feedThreadImage.getImageName().getValue(), - feedThreadImage.getImageUrl().getValue())) + return images.stream().map(FeedImageResponse::from) .toList(); } } diff --git a/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedWriteService.java b/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedWriteService.java index 07c0e291b..8ed9c0d14 100644 --- a/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedWriteService.java +++ b/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedWriteService.java @@ -7,6 +7,8 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import team.teamby.teambyteam.feed.application.dto.FeedImageResponse; +import team.teamby.teambyteam.feed.application.dto.FeedResponse; import team.teamby.teambyteam.feed.application.dto.FeedThreadWritingRequest; import team.teamby.teambyteam.feed.application.event.FeedEvent; import team.teamby.teambyteam.feed.domain.FeedRepository; @@ -22,9 +24,11 @@ import team.teamby.teambyteam.filesystem.util.FileUtil; import team.teamby.teambyteam.member.configuration.dto.MemberEmailDto; import team.teamby.teambyteam.member.domain.MemberRepository; +import team.teamby.teambyteam.member.domain.MemberTeamPlace; import team.teamby.teambyteam.member.domain.MemberTeamPlaceRepository; import team.teamby.teambyteam.member.domain.vo.Email; import team.teamby.teambyteam.member.exception.MemberException; +import team.teamby.teambyteam.member.exception.MemberTeamPlaceException; import java.util.List; import java.util.Objects; @@ -43,6 +47,7 @@ public class FeedWriteService { private final FeedRepository feedRepository; private final FeedThreadImageRepository feedThreadImageRepository; private final MemberRepository memberRepository; + private final MemberTeamPlaceRepository memberTeamPlaceRepository; private final FileStorageManager fileStorageManager; @Value("${aws.s3.image-directory}") @@ -61,14 +66,22 @@ public Long write( final Long memberId = memberRepository.findIdByEmail(new Email(memberEmailDto.email())) .orElseThrow(() -> new MemberException.MemberNotFoundException(memberEmailDto.email())) .id(); + final MemberTeamPlace author = memberTeamPlaceRepository.findByTeamPlaceIdAndMemberId(teamPlaceId, memberId) + .orElseThrow(() -> new MemberTeamPlaceException.NotFoundParticipatedTeamPlaceException(memberEmailDto.email(), teamPlaceId)); final FeedThread savedFeedThread = feedRepository.save(new FeedThread(teamPlaceId, new Content(content), memberId)); - saveImages(images, savedFeedThread); + final List imageResponses = saveImages(images, savedFeedThread); final Long threadId = savedFeedThread.getId(); log.info("스레드 생성 - 생성자 이메일 : {}, 스레드 아이디 : {}", memberEmailDto.email(), threadId); - sendFeedWritingEvent(savedFeedThread); + final FeedResponse responseForMe = FeedResponse.from( + savedFeedThread, + author, + imageResponses, + memberEmailDto.email() + ); + sendFeedWritingEvent(responseForMe); return threadId; } @@ -99,19 +112,21 @@ private void validateImage(final MultipartFile image) { } } - private void saveImages(final List images, final FeedThread savedFeedThread) { - images.forEach(image -> { - final String originalFilename = image.getOriginalFilename(); - final String generatedImageUrl = fileStorageManager.upload(image, imageDirectory + "/" + UUID.randomUUID(), originalFilename); - final ImageUrl imageUrl = new ImageUrl(generatedImageUrl); - final ImageName imageName = new ImageName(originalFilename); - final FeedThreadImage feedThreadImage = new FeedThreadImage(imageUrl, imageName); - feedThreadImage.confirmFeedThread(savedFeedThread); - feedThreadImageRepository.save(feedThreadImage); - }); + private List saveImages(final List images, final FeedThread savedFeedThread) { + return images.stream().map(image -> { + final String originalFilename = image.getOriginalFilename(); + final String generatedImageUrl = fileStorageManager.upload(image, imageDirectory + "/" + UUID.randomUUID(), originalFilename); + final ImageUrl imageUrl = new ImageUrl(generatedImageUrl); + final ImageName imageName = new ImageName(originalFilename); + final FeedThreadImage feedThreadImage = new FeedThreadImage(imageUrl, imageName); + feedThreadImage.confirmFeedThread(savedFeedThread); + return feedThreadImageRepository.save(feedThreadImage); + }) + .map(FeedImageResponse::from) + .toList(); } - private void sendFeedWritingEvent(final FeedThread savedFeedThread) { - applicationEventPublisher.publishEvent(new FeedEvent(savedFeedThread.getId())); + private void sendFeedWritingEvent(final FeedResponse response) { + applicationEventPublisher.publishEvent(new FeedEvent(response)); } } diff --git a/backend/src/main/java/team/teamby/teambyteam/feed/application/dto/FeedImageResponse.java b/backend/src/main/java/team/teamby/teambyteam/feed/application/dto/FeedImageResponse.java index 26c6659f4..3c68afa00 100644 --- a/backend/src/main/java/team/teamby/teambyteam/feed/application/dto/FeedImageResponse.java +++ b/backend/src/main/java/team/teamby/teambyteam/feed/application/dto/FeedImageResponse.java @@ -1,9 +1,20 @@ package team.teamby.teambyteam.feed.application.dto; +import team.teamby.teambyteam.feed.domain.image.FeedThreadImage; + public record FeedImageResponse( Long id, Boolean isExpired, String name, String url ) { + + public static FeedImageResponse from(final FeedThreadImage feedThreadImage) { + return new FeedImageResponse( + feedThreadImage.getId(), + feedThreadImage.isExpired(), + feedThreadImage.getImageName().getValue(), + feedThreadImage.getImageUrl().getValue() + ); + } } diff --git a/backend/src/main/java/team/teamby/teambyteam/feed/application/event/FeedEvent.java b/backend/src/main/java/team/teamby/teambyteam/feed/application/event/FeedEvent.java index 4126a1477..07431ded2 100644 --- a/backend/src/main/java/team/teamby/teambyteam/feed/application/event/FeedEvent.java +++ b/backend/src/main/java/team/teamby/teambyteam/feed/application/event/FeedEvent.java @@ -1,16 +1,23 @@ package team.teamby.teambyteam.feed.application.event; import team.teamby.teambyteam.common.domain.DomainEvent; +import team.teamby.teambyteam.feed.application.dto.FeedResponse; public class FeedEvent implements DomainEvent { private final Long feedId; + private final FeedResponse response; - public FeedEvent(final Long feedId) { - this.feedId = feedId; + public FeedEvent(final FeedResponse response) { + this.feedId = response.id(); + this.response = response; } @Override public Long getDomainId() { return feedId; } + + public FeedResponse response() { + return response; + } } diff --git a/backend/src/test/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverterTest.java b/backend/src/test/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverterTest.java index 827132b01..d86cf8154 100644 --- a/backend/src/test/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverterTest.java +++ b/backend/src/test/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverterTest.java @@ -54,7 +54,14 @@ void convert() { final Feed savedFeed = testFixtureBuilder.buildFeed(FeedThreadFixtures.CONTENT_ONLY_AND_IMAGE_EMPTY(savedTeamPlace.getId(), savedMember.getId())); - final FeedEvent testEvent = new FeedEvent(savedFeed.getId()); + final FeedResponse response = FeedResponse.from( + savedFeed, + savedMemberTeamplcae, + null, + savedMember.getEmailValue() + ); + + final FeedEvent testEvent = new FeedEvent(response); // when final TeamPlaceSseEvent sseEvent = feedEventConverter.convert(testEvent); From 68d919a3270909d7d0297b5be4e58cb9df47df51 Mon Sep 17 00:00:00 2001 From: pilyang Date: Tue, 12 Mar 2024 19:12:53 +0900 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20SSE=EC=9A=A9=20=EC=9D=B4?= =?UTF-8?q?=EB=B2=A4=ED=8A=B8=20=EB=B3=80=ED=99=98=EC=8B=9C=20db=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feed/application/FeedWriteService.java | 6 +- .../feed/application/event/FeedEvent.java | 8 +- .../domain/converter/FeedEventConverter.java | 84 ++++++------------- .../converter/FeedEventConverterTest.java | 2 +- 4 files changed, 37 insertions(+), 63 deletions(-) diff --git a/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedWriteService.java b/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedWriteService.java index 8ed9c0d14..e21e918ae 100644 --- a/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedWriteService.java +++ b/backend/src/main/java/team/teamby/teambyteam/feed/application/FeedWriteService.java @@ -81,7 +81,7 @@ public Long write( imageResponses, memberEmailDto.email() ); - sendFeedWritingEvent(responseForMe); + sendFeedWritingEvent(responseForMe, teamPlaceId); return threadId; } @@ -126,7 +126,7 @@ private List saveImages(final List images, fin .toList(); } - private void sendFeedWritingEvent(final FeedResponse response) { - applicationEventPublisher.publishEvent(new FeedEvent(response)); + private void sendFeedWritingEvent(final FeedResponse response, final Long teamPlaceId) { + applicationEventPublisher.publishEvent(new FeedEvent(response, teamPlaceId)); } } diff --git a/backend/src/main/java/team/teamby/teambyteam/feed/application/event/FeedEvent.java b/backend/src/main/java/team/teamby/teambyteam/feed/application/event/FeedEvent.java index 07431ded2..034fc86a0 100644 --- a/backend/src/main/java/team/teamby/teambyteam/feed/application/event/FeedEvent.java +++ b/backend/src/main/java/team/teamby/teambyteam/feed/application/event/FeedEvent.java @@ -5,11 +5,13 @@ public class FeedEvent implements DomainEvent { private final Long feedId; + private final Long teamPlaceId; private final FeedResponse response; - public FeedEvent(final FeedResponse response) { + public FeedEvent(final FeedResponse response, final Long teamPlaceId) { this.feedId = response.id(); this.response = response; + this.teamPlaceId = teamPlaceId; } @Override @@ -20,4 +22,8 @@ public Long getDomainId() { public FeedResponse response() { return response; } + + public Long getTeamPlaceId() { + return teamPlaceId; + } } diff --git a/backend/src/main/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverter.java b/backend/src/main/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverter.java index 39cd4f15e..1315b2c79 100644 --- a/backend/src/main/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverter.java +++ b/backend/src/main/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverter.java @@ -5,42 +5,23 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import team.teamby.teambyteam.common.domain.DomainEvent; -import team.teamby.teambyteam.feed.application.dto.FeedImageResponse; import team.teamby.teambyteam.feed.application.dto.FeedResponse; import team.teamby.teambyteam.feed.application.event.FeedEvent; -import team.teamby.teambyteam.feed.domain.Feed; -import team.teamby.teambyteam.feed.domain.FeedRepository; -import team.teamby.teambyteam.feed.domain.FeedThread; -import team.teamby.teambyteam.feed.domain.image.FeedThreadImage; -import team.teamby.teambyteam.member.domain.MemberTeamPlace; -import team.teamby.teambyteam.member.domain.MemberTeamPlaceRepository; import team.teamby.teambyteam.sse.domain.TeamPlaceSseEvent; import team.teamby.teambyteam.sse.domain.emitter.TeamPlaceEmitterId; -import java.util.List; - @Slf4j @Component @RequiredArgsConstructor public class FeedEventConverter implements TeamPlaceSseConverter { - private final FeedRepository feedRepository; - private final MemberTeamPlaceRepository memberTeamPlaceRepository; - @Override @Transactional(readOnly = true) public TeamPlaceSseEvent convert(final DomainEvent event) { - final Long feedId = event.getDomainId(); - final Feed feed = feedRepository.findById(feedId) - .orElseThrow(() -> { - final String message = "No FeedFound ID : " + feedId; - log.error(message); - return new RuntimeException(message); - }); - final MemberTeamPlace author = memberTeamPlaceRepository - .findByTeamPlaceIdAndMemberId(feed.getTeamPlaceId(), feed.getAuthorId()) - .orElse(MemberTeamPlace.UNKNOWN_MEMBER_TEAM_PLACE); - return new FeedSse(feed, author); + final FeedEvent feedEvent = (FeedEvent) event; + final Long teamplaceId = feedEvent.getTeamPlaceId(); + + return new FeedSse(feedEvent.response(), teamplaceId); } @Override @@ -53,32 +34,32 @@ private static class FeedSse implements TeamPlaceSseEvent { private static final String EVENT_NAME = "new_thread"; private final Long teamPlaceId; - private final FeedResponse forMe; + private FeedResponse forMe; private FeedResponse forOthers; - public FeedSse(final Feed feed, final MemberTeamPlace author) { - this.teamPlaceId = feed.getTeamPlaceId(); - this.forMe = new FeedResponse( - feed.getId(), - feed.getType().name().toLowerCase(), - feed.getAuthorId(), - author.getDisplayMemberNameValue(), - author.findMemberProfileImageUrl(), - feed.getCreatedAt(), - feed.getContent().getValue(), - convertImageResponses(((FeedThread) feed).getImages()), - true - ); + public FeedSse(final FeedResponse response, final Long teamPlaceId) { + this.teamPlaceId = teamPlaceId; + if (response.isMe()) { + forMe = response; + forOthers = reverseForMeField(response); + return; + } + forMe = reverseForMeField(response); + forOthers = response; } - private static List convertImageResponses(final List images) { - return images.stream().map(feedThreadImage -> - new FeedImageResponse( - feedThreadImage.getId(), - feedThreadImage.isExpired(), - feedThreadImage.getImageName().getValue(), - feedThreadImage.getImageUrl().getValue())) - .toList(); + private static FeedResponse reverseForMeField(final FeedResponse response) { + return new FeedResponse( + response.id(), + response.type(), + response.authorId(), + response.authorName(), + response.profileImageUrl(), + response.createdAt(), + response.content(), + response.images(), + !response.isMe() + ); } @Override @@ -96,19 +77,6 @@ public Object getEvent(final TeamPlaceEmitterId emitterId) { if (emitterId.isMemberId(forMe.authorId())) { return forMe; } - if (forOthers == null) { - return new FeedResponse( - forMe.id(), - forMe.type(), - forMe.authorId(), - forMe.authorName(), - forMe.profileImageUrl(), - forMe.createdAt(), - forMe.content(), - forMe.images(), - false - ); - } return forOthers; } } diff --git a/backend/src/test/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverterTest.java b/backend/src/test/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverterTest.java index d86cf8154..3c0fbbce5 100644 --- a/backend/src/test/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverterTest.java +++ b/backend/src/test/java/team/teamby/teambyteam/sse/domain/converter/FeedEventConverterTest.java @@ -61,7 +61,7 @@ void convert() { savedMember.getEmailValue() ); - final FeedEvent testEvent = new FeedEvent(response); + final FeedEvent testEvent = new FeedEvent(response, savedTeamPlace.getId()); // when final TeamPlaceSseEvent sseEvent = feedEventConverter.convert(testEvent);