|
| 1 | +package com.sprint.mission.discodeit.service.basic; |
| 2 | + |
| 3 | +import com.sprint.mission.discodeit.common.error.ErrorMessage; |
| 4 | +import com.sprint.mission.discodeit.common.error.channel.ChannelException; |
| 5 | +import com.sprint.mission.discodeit.common.error.user.UserException; |
| 6 | +import com.sprint.mission.discodeit.entity.channel.Channel; |
| 7 | +import com.sprint.mission.discodeit.entity.message.ChannelMessage; |
| 8 | +import com.sprint.mission.discodeit.entity.message.dto.ChannelMessageInfoResponse; |
| 9 | +import com.sprint.mission.discodeit.entity.message.dto.SendChannelMessageRequest; |
| 10 | +import com.sprint.mission.discodeit.entity.user.entity.User; |
| 11 | +import com.sprint.mission.discodeit.repository.jcf.channel.ChannelRepository; |
| 12 | +import com.sprint.mission.discodeit.repository.jcf.message.ChannelMessage.ChannelMessageRepository; |
| 13 | +import com.sprint.mission.discodeit.repository.jcf.user.UserRepository; |
| 14 | +import com.sprint.mission.discodeit.service.message.channelMessage.ChannelMessageService; |
| 15 | +import com.sprint.mission.discodeit.service.message.converter.ChannelMessageConverter; |
| 16 | +import java.util.UUID; |
| 17 | + |
| 18 | +public class BasicChannelMessageService implements ChannelMessageService { |
| 19 | + |
| 20 | + private final UserRepository userRepository; |
| 21 | + private final ChannelRepository channelRepository; |
| 22 | + private final ChannelMessageRepository channelMessageRepository; |
| 23 | + private final ChannelMessageConverter converter; |
| 24 | + |
| 25 | + private BasicChannelMessageService( |
| 26 | + UserRepository userRepository, |
| 27 | + ChannelRepository channelRepository, |
| 28 | + ChannelMessageRepository channelMessageRepository, |
| 29 | + ChannelMessageConverter converter |
| 30 | + ) { |
| 31 | + this.userRepository = userRepository; |
| 32 | + this.channelRepository = channelRepository; |
| 33 | + this.channelMessageRepository = channelMessageRepository; |
| 34 | + this.converter = converter; |
| 35 | + } |
| 36 | + |
| 37 | + public static ChannelMessageService getInstance( |
| 38 | + UserRepository userRepository, |
| 39 | + ChannelRepository channelRepository, |
| 40 | + ChannelMessageRepository channelMessageRepository |
| 41 | + ) { |
| 42 | + var converter = new ChannelMessageConverter(); |
| 43 | + return new BasicChannelMessageService(userRepository, channelRepository, channelMessageRepository, converter); |
| 44 | + } |
| 45 | + |
| 46 | + @Override |
| 47 | + public ChannelMessageInfoResponse sendMessage(SendChannelMessageRequest sendChannelMessageRequest) { |
| 48 | + // 유저 찾기 |
| 49 | + var foundUser = findUserByIdOrThrow(sendChannelMessageRequest.sendUserId()); |
| 50 | + // 채널 찾기 |
| 51 | + var foundChannel = findChannelByIdOrThrow(sendChannelMessageRequest.receiveChannelId()); |
| 52 | + // 메시지 생성 |
| 53 | + var channelMessage = ChannelMessage.ofMessageAndSenderAndReceiverChannel( |
| 54 | + sendChannelMessageRequest.message(), |
| 55 | + foundUser, |
| 56 | + foundChannel |
| 57 | + ); |
| 58 | + // 메시지 저장 |
| 59 | + var savedMessage = channelMessageRepository.save(channelMessage); |
| 60 | + // 메시지 전송 |
| 61 | + savedMessage.sendMessage(); |
| 62 | + // 생성된 메시지 반환 |
| 63 | + return converter.toDto(savedMessage); |
| 64 | + } |
| 65 | + |
| 66 | + /** |
| 67 | + * ==> 코드리뷰 부탁드립니다. 유저 서비스에 다른 서비스에서 이용하기 위한 메서드를 넣는게 바람직한가요? |
| 68 | + * ==> 제 생각은, 유저 서비스에 같은 기능으로 호출하는 기능이 필요하다면 추가하지만, 없다면 안넣는게 낫다고 생각함. 넣는다면 userRepository |
| 69 | + * 그런데, 유저 서비스에서 id로만 찾는 유저를 찾는 기능이 있는가? 구현한 내용은 유저 서비스 레이어 안에서만 private 구현 |
| 70 | + * 코드 중복이 너무 많이 발생함, 이를 해결하기 위해 userService, userRepository 둘 중 하나에 메서드를 만드는 방법 중 어디가 좋을까요? |
| 71 | + * |
| 72 | + * ==> 다른 서비스 레이어를 의존하도록 해서 호출해도 괜찮을까요 ? |
| 73 | + */ |
| 74 | + private User findUserByIdOrThrow(UUID userId) { |
| 75 | + var foundUser = userRepository.findById(userId) |
| 76 | + .filter(User::isNotUnregistered) |
| 77 | + .orElseThrow(() -> UserException.ofErrorMessageAndId( |
| 78 | + ErrorMessage.USER_NOT_FOUND, userId.toString() |
| 79 | + )); |
| 80 | + |
| 81 | + return foundUser; |
| 82 | + } |
| 83 | + |
| 84 | + |
| 85 | + private Channel findChannelByIdOrThrow(UUID channelId) { |
| 86 | + var foundChannel = channelRepository.findById(channelId) |
| 87 | + .orElseThrow(() -> ChannelException.ofErrorMessageAndNotExistChannelId( |
| 88 | + ErrorMessage.CHANNEL_NOT_FOUND, |
| 89 | + channelId |
| 90 | + )); |
| 91 | + return foundChannel; |
| 92 | + } |
| 93 | +} |
0 commit comments