Skip to content

Commit

Permalink
Merge pull request #121
Browse files Browse the repository at this point in the history
배포
  • Loading branch information
devbattery authored Feb 7, 2025
2 parents bd103ab + d9f8d56 commit f8e62d5
Show file tree
Hide file tree
Showing 32 changed files with 477 additions and 104 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/be-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
run: |
chmod +x gradlew
echo "::group::Gradle Build Logs"
./gradlew build --exclude-task test --exclude-task asciidoctor
./gradlew build --warning-mode all
echo "::endgroup::"
working-directory: ${{ env.ROOT_PATH }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ public Map<String, Object> getAttributes() {

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
log.info("====== new SimpleGrantedAuthority(member.getRole())={}", new SimpleGrantedAuthority(member.getRole()));
return Collections.singletonList(
new SimpleGrantedAuthority(member.getRole())
);
Expand All @@ -60,15 +59,15 @@ public String getPassword() {
}

public MemberId getMemberId() {
if (member != null){
if (member != null) {
return member.getMemberId();
}

return null;
}

public Member getMember() {
if (member != null){
if (member != null) {
return member;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ public class OAuth2AuthenticationSuccessHandler extends SimpleUrlAuthenticationS
private final AuthCodeStorage authCodeStorage;
private final JwtTokenUtil jwtTokenUtil;


@Value("${share.url}")
private String url;

Expand All @@ -36,11 +35,9 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
// OAuth2User로부터 email을 가져옴
MyMemberDetails oAuth2User = (MyMemberDetails) authentication.getPrincipal();
String email = oAuth2User.getMember().getEmail();
log.info("OAuth2AuthenticationSuccessHandler의 Member email = {}", email);

String code = IdGenerator.generate();
authCodeStorage.saveCode(code, email);
log.info("======== code = {}, email = {}", code, email);

// 헤더 설정
String accessToken = jwtTokenUtil.generateAccessToken(email);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,6 @@ public ResponseEntity<?> exchangeToken(@RequestBody Map<String, String> body) {
final String accessToken = jwtTokenUtil.generateAccessToken(email);
final String refreshToken = jwtTokenUtil.generateRefreshToken(email);

log.info("======== accessToken={}", accessToken);
log.info("======== refreshToken={}", refreshToken);

refreshTokenStorage.saveRefreshToken(email, refreshToken);

authCodeStorage.removeCode(code);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,19 @@ public class GetBookController {
// BookBestseller 저장 api
@GetMapping("/saveBooks/bestseller")
public void BestsellersApiToDb() {
getBookBestService.repeatGet(20); // 한번에 최대 50개씩, 20번 실행
getBookBestService.repeatGet(10); // 한번에 최대 50개씩, 20번 실행
}

// BookNew 저장 api
@GetMapping("/saveBooks/bookNew")
public void BookNewApiToDb() {
getBookNewService.repeatGet(5); // 한번에 최대 50개씩, 20번 실행
getBookNewService.repeatGet(2); // 한번에 최대 50개씩, 20번 실행
}

// BookNewSpecial 저장 api
@GetMapping("/saveBooks/bookNewSpecial")
public void BookNewSpecialApiToDb() {
getBookNewSpecialService.repeatGet(10); // 한번에 최대 50개씩, 20번 실행
getBookNewSpecialService.repeatGet(5); // 한번에 최대 50개씩, 20번 실행
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse

// TODO: Oauth2 로그인 시에만 header가 넘어오지 않음
final String authorizationHeader = request.getHeader("Authorization");
log.info("===== [JwtRequestFilter] authorization Header= {} ", authorizationHeader);

String email = null;
String jwt = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ public void publishFollowNotification(MemberEntity follower, MemberEntity follow
// 알림 메세지 생성 : 'A'님이 'B'님을 팔로우합니다.
String message = NotificationMessage.generateFollowingMessage(follower.getNickname(), followee.getNickname());
String memberId = followee.getMemberId().getValue();
String url = basicUrl + "/members/" + memberId;
// 나를 팔로우한 사람(상대방)의 '마이페이지'로 이동
String url = basicUrl + "/members/" + follower.getMemberId().getValue();

// 알림 DTO 생성
NotificationDto notificationDto = new NotificationDto(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public MemberEntity findEntityById(MemberId memberId) {
entityManager.clear(); // 1차 캐시 초기화 (안하면, 프로필 업데이트된 멤버정보를 제대로 조회 안하고, JPA에서 프로필업데이트되기 전, 멤버정보를 조회한다)
MemberEntity memberEntity = memberRepository.findEntityById(memberId);

System.out.println("MemberReadService >>> 찾은 memberEntity " + memberEntity.toStringExceptLazyLoading());
System.out.println("::MemberReadService >>> 찾은 memberEntity " + memberEntity.toStringExceptLazyLoading());
return memberEntity;
}

Expand Down
32 changes: 28 additions & 4 deletions be/src/main/java/movlit/be/pub_sub/RedisListenerConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,31 +37,52 @@ public ChannelTopic updateRoomTopic() {
return new ChannelTopic("updateRoom");
}

@Bean
public ChannelTopic createOneononeChatroomTopic() {
return new ChannelTopic("createOneononeChatroom");
}

@Bean
public ChannelTopic readMessageTopic() {
return new ChannelTopic("readMessage");
}

/** 메시지 전송을 처리하는 subscriber 설정 추가*/
/**
* 메시지 전송을 처리하는 subscriber 설정 추가
*/
@Bean
public MessageListenerAdapter listenerAdapterSendMessage(RedisMessageSubscriber subscriber) {
// subscriber 내의 메서드명을 지정
return new MessageListenerAdapter(subscriber, "sendMessage");
}

/** 채팅방정보 변경을 처리하는 subscriber 설정 추가*/
/**
* 채팅방정보 변경을 처리하는 subscriber 설정 추가
*/
@Bean
public MessageListenerAdapter listenerAdapterUpdateRoom(RedisMessageSubscriber subscriber) {
return new MessageListenerAdapter(subscriber, "updateRoom");
}

/** 채팅 읽음을 처리하는 subscriber 설정 추가*/
/**
* 채팅 읽음을 처리하는 subscriber 설정 추가
*/
@Bean
public MessageListenerAdapter listenerAdapterReadMessage(RedisMessageSubscriber subscriber) {
return new MessageListenerAdapter(subscriber, "readMessage");
}

/** 알림 메시지를 처리하는 subscriber 설정 추가*/
/**
* 일대일 채팅방 시작되는 subscriber 설정 추가
*/
@Bean
public MessageListenerAdapter listenerAdapterCreateOneononeChatroom(RedisMessageSubscriber subscriber) {
return new MessageListenerAdapter(subscriber, "createOneononeChatroom");
}

/**
* 알림 메시지를 처리하는 subscriber 설정 추가
*/
@Bean
public MessageListenerAdapter listenerAdapterNotification(RedisNotificationSubscriber notificationSubscriber) {
return new MessageListenerAdapter(notificationSubscriber, "onNotification"); // 메서드명 변경
Expand All @@ -76,10 +97,12 @@ public RedisMessageListenerContainer redisMessageListener(
MessageListenerAdapter listenerAdapterSendMessage,
MessageListenerAdapter listenerAdapterUpdateRoom,
MessageListenerAdapter listenerAdapterReadMessage,
MessageListenerAdapter listenerAdapterCreateOneononeChatroom,
MessageListenerAdapter listenerAdapterNotification,
ChannelTopic sendMessageTopic,
ChannelTopic updateRoomTopic,
ChannelTopic readMessageTopic,
ChannelTopic createOneononeChatroomTopic,
ChannelTopic notificationTopic
) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
Expand All @@ -88,6 +111,7 @@ public RedisMessageListenerContainer redisMessageListener(
container.addMessageListener(listenerAdapterSendMessage, sendMessageTopic);
container.addMessageListener(listenerAdapterUpdateRoom, updateRoomTopic);
container.addMessageListener(listenerAdapterReadMessage, readMessageTopic);
container.addMessageListener(listenerAdapterCreateOneononeChatroom, createOneononeChatroomTopic);
container.addMessageListener(listenerAdapterNotification, notificationTopic);
return container;
}
Expand Down
11 changes: 11 additions & 0 deletions be/src/main/java/movlit/be/pub_sub/RedisMessagePublisher.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import movlit.be.pub_sub.chatMessage.presentation.dto.response.ChatMessageDto;
import movlit.be.pub_sub.chatRoom.presentation.dto.OneononeChatroomCreatePubDto;
import movlit.be.pub_sub.chatRoom.presentation.dto.UpdateRoomDto;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
Expand All @@ -19,9 +20,11 @@ public class RedisMessagePublisher {
private final RedisTemplate<String, Object> redisTemplate;
private final ChannelTopic sendMessageTopic;
private final ChannelTopic updateRoomTopic;
private final ChannelTopic createOneononeChatroomTopic;

/**
* 채팅 보내기(sendMessage) 토픽 발행하는 메서드
*
* @param chatMessageDto
*/
public void sendMessage(ChatMessageDto chatMessageDto) {
Expand All @@ -40,4 +43,12 @@ public void updateRoom(UpdateRoomDto updateRoomDto) {
redisTemplate.convertAndSend(updateRoomTopic.getTopic(), updateRoomDto);
}

/**
* 일대일 채팅방 생성 토픽 발행하는 메서드
*/
public void createOneononeChatroom(OneononeChatroomCreatePubDto oneononeChatroomCreatePubDto) {
log.info("Publishing create oneononeChatroom {}", oneononeChatroomCreatePubDto);
redisTemplate.convertAndSend(createOneononeChatroomTopic.getTopic(), oneononeChatroomCreatePubDto);
}

}
28 changes: 24 additions & 4 deletions be/src/main/java/movlit/be/pub_sub/RedisMessageSubscriber.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,24 @@

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import movlit.be.common.exception.ContentTypeNotExistException;
import movlit.be.common.util.ids.GroupChatroomId;
import movlit.be.pub_sub.chatMessage.presentation.dto.response.ChatMessageDto;
import movlit.be.pub_sub.chatMessage.presentation.dto.response.MessageType;
import movlit.be.pub_sub.chatRoom.presentation.dto.GroupChatroomMemberResponse;
import movlit.be.pub_sub.chatRoom.presentation.dto.OneononeChatroomCreatePubDto;
import movlit.be.pub_sub.chatRoom.presentation.dto.UpdateRoomDto;
import movlit.be.pub_sub.chatRoom.presentation.dto.UpdateRoomDto.EventType;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* 메시지 수신자(Subscriber) 구현
*/
Expand Down Expand Up @@ -105,7 +107,7 @@ public void updateRoom(String publishMessage) {
log.info("RedisMessageSubscriber의 cachedMembers 개수 : {}", cachedMembers.size());

messagingTemplate.convertAndSend("/topic/chat/room/" + groupChatroomId.getValue(), response);
} else if (updateRoomDto.getEventType().equals(EventType.MEMBER_LEAVE)){
} else if (updateRoomDto.getEventType().equals(EventType.MEMBER_LEAVE)) {
// 기존 멤버 나가는 이벤트 처리
// eventMessage와 cachedMembers 함께 전송
Map<String, Object> response = new HashMap<>();
Expand All @@ -121,6 +123,24 @@ public void updateRoom(String publishMessage) {
}
}

public void createOneononeChatroom(String publishMessage) {
try {
OneononeChatroomCreatePubDto oneononeChatroomCreatePubDto = objectMapper.readValue(publishMessage,
OneononeChatroomCreatePubDto.class);
log.info("Received message to 'createOneononeChatroom' : {}", publishMessage);
messagingTemplate.convertAndSend(
"/topic/oneononeChatroom/create/publish/" + oneononeChatroomCreatePubDto.getTopicReceiverId()
.getValue(),
oneononeChatroomCreatePubDto
);

} catch (Exception e) {
log.error("Exception in OneononeChatroom publish : {}", e);
}


}

public void readMessage(String publishMessage) {
try {
ChatMessageDto chatMessageDto = objectMapper.readValue(publishMessage, ChatMessageDto.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,14 @@ private void publishNewGroupChatroomNoti(String contentId, String roomName,
List<MemberId> heartingMemberIds = new ArrayList<>();
// 콘텐츠명 (영화 이름, 책 이름)
String contentName = "";
// 해당 콘텐츠의 상세페이지 url (채팅방 가입 유도)
String url = basicUrl;

if (contentType.equals("MV")) {
Long movieId = Long.parseLong(pureContentId);
contentName = movieReadService.fetchByMovieId(movieId).getTitle();
heartingMemberIds = movieHeartService.fetchHeartingMemberIdsByMovieId(movieId);
url += "/movie/" + pureContentId;
} else if (contentType.equals("BK")) {
BookId bookId = new BookId(pureContentId);
String bookName = bookDetailReadService.fetchByBookId(bookId).getTitle();
Expand All @@ -148,13 +151,13 @@ private void publishNewGroupChatroomNoti(String contentId, String roomName,
}
heartingMemberIds =
bookHeartReadService.fetchHeartingMemberIdsByBookId(bookId);
url += "/book/" + pureContentId;
}

// 멤버들에게 알림 발송
if (!heartingMemberIds.isEmpty()) {
for (MemberId heartigMemberId : heartingMemberIds) {
log.info(">> 알림발송할 멤버 " + heartigMemberId.getValue());
String url = basicUrl + "/chatMain/" + createdChatroom.getGroupChatroomId().getValue() + "/group";
NotificationDto notification = new NotificationDto(
heartigMemberId.getValue(),
NotificationMessage.generateNewGroupChatroomNotiMessage(contentType, contentName, roomName),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.time.Duration;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import movlit.be.common.exception.FailedDeserializeException;
Expand All @@ -14,15 +12,21 @@
import movlit.be.common.util.ids.OneononeChatroomId;
import movlit.be.member.application.service.MemberReadService;
import movlit.be.member.domain.entity.MemberEntity;
import movlit.be.pub_sub.RedisMessagePublisher;
import movlit.be.pub_sub.chatRoom.domain.MemberROneononeChatroom;
import movlit.be.pub_sub.chatRoom.domain.OneononeChatroom;
import movlit.be.pub_sub.chatRoom.domain.repository.OneononeChatroomRepository;
import movlit.be.pub_sub.chatRoom.presentation.dto.OneononeChatroomCreatePubDto;
import movlit.be.pub_sub.chatRoom.presentation.dto.OneononeChatroomCreatePubRequest;
import movlit.be.pub_sub.chatRoom.presentation.dto.OneononeChatroomRequest;
import movlit.be.pub_sub.chatRoom.presentation.dto.OneononeChatroomResponse;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.Duration;
import java.util.List;

@Service
@RequiredArgsConstructor
@Slf4j
Expand All @@ -32,6 +36,7 @@ public class OneononeChatroomService {
private final OneononeChatroomRepository oneOnOneChatroomRepository;
private final RedisTemplate<String, String> redisTemplate;
private final ObjectMapper objectMapper;
private final RedisMessagePublisher messagePublisher;

@Transactional
public OneononeChatroomResponse createOneononeChatroom(MemberId memberId,
Expand Down Expand Up @@ -63,6 +68,20 @@ public OneononeChatroomResponse createOneononeChatroom(MemberId memberId,
return senderResponse;
}

public void publishOneononeChatroomCreate(MemberId topicSenderId, OneononeChatroomCreatePubRequest request) {
MemberEntity topicSender = memberReadService.findEntityByMemberId(topicSenderId);
OneononeChatroomCreatePubDto oneononeChatroomCreatePubDto =
new OneononeChatroomCreatePubDto(
request.getRoomId(),
request.getTopicReceiverId(),
topicSenderId,
topicSender.getNickname(),
topicSender.getProfileImgUrl(),
request.getChatMessage()
);
messagePublisher.createOneononeChatroom(oneononeChatroomCreatePubDto);
}

private void validateAlreadyExist(MemberEntity sender, MemberEntity receiver) {
if (oneOnOneChatroomRepository.existsOneOnOneChatroomBySenderAndReceiver(
sender.getMemberId(),
Expand Down
Loading

0 comments on commit f8e62d5

Please sign in to comment.