Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
d1e4cc4
[feat] 피드 관련 알림 DB 저장 + 이벤트 퍼블리시 를 담당하는 인터페이스 추가 (#296)
seongjunnoh Sep 11, 2025
c926863
[feat] 모임방 관련 알림 DB 저장 + 이벤트 퍼블리시 를 담당하는 인터페이스 추가 (#296)
seongjunnoh Sep 11, 2025
a5f53b2
[feat] 피드 관련 알림 DB 저장 + 이벤트 퍼블리시 를 담당하는 구현체 추가 (#296)
seongjunnoh Sep 12, 2025
1dd9ac3
[feat] 모임방 관련 알림 DB 저장 + 이벤트 퍼블리시 를 담당하는 구현체 추가 (#296)
seongjunnoh Sep 12, 2025
fb61586
[feat] 알림센터에 저장할 title, content 의 생성을 담당하는 template 인터페이스 추가 (#296)
seongjunnoh Sep 12, 2025
4d1d316
[feat] 피드 관련 알림의 title, content 를 생성하는 template enum 객체 추가 (#296)
seongjunnoh Sep 12, 2025
cd10cdb
[feat] 모임방 관련 알림의 title, content 를 생성하는 template enum 객체 추가 (#296)
seongjunnoh Sep 12, 2025
ec18391
[feat] Notification 도메인 엔티티 내부에 정적 팩토리 메서드 추가 (#296)
seongjunnoh Sep 12, 2025
28d1bb0
[feat] notification DB save 관련 코드 추가 (#296)
seongjunnoh Sep 12, 2025
7a62726
[refactor] fcm 푸시알림을 위한 event dto 수정 (#296)
seongjunnoh Sep 12, 2025
47215b3
[refactor] fcm 푸시알림을 위한 이벤트 리스너 하위 코드 수정 (#296)
seongjunnoh Sep 12, 2025
9f28bd6
[refactor] 기존 이벤트 발생 관련 비즈니스 로직을 담당하는 service 코드 수정 (#296)
seongjunnoh Sep 12, 2025
3f0918e
[refactor] 기존 service 통합 테스트 코드에서 EventCommandPort 를 의존하는 코드들 수정 (#296)
seongjunnoh Sep 12, 2025
4b2d4ff
[refactor] 불필요한 teardown 메서드 삭제 (#296)
seongjunnoh Sep 12, 2025
4b34ea3
[refactor] 알림 센터 저장과 관련있는 기존 통합 테스트 코드들의 teardown 메서드 수정 (#296)
seongjunnoh Sep 12, 2025
90b8495
[rename] 기록 생성 api 통합 테스트 클래스 네이밍 수정 (#296)
seongjunnoh Sep 12, 2025
bb8d52b
[move] NotificationCategory enum의 패키지 위치 이동 (#296)
seongjunnoh Sep 12, 2025
597e8cf
[test] 피드 알림 헬퍼 서비스의 단위/통합 테스트 코드 추가 (#296)
seongjunnoh Sep 12, 2025
f5ceff7
[test] 모임방 알림 헬퍼 서비스의 단위/통합 테스트 코드 추가 (#296)
seongjunnoh Sep 12, 2025
48bacfb
[remove] dummy 파일 삭제 (#296)
seongjunnoh Sep 12, 2025
983abaf
[fix] FirebaseAdapter의 profile 설정 문법 오류 수정 (#296)
seongjunnoh Sep 12, 2025
05256bb
[refactor] SecurityConfig, JwtAuthenticationFilter 에서 모두 같은 whitelist…
seongjunnoh Sep 12, 2025
3f9abb9
[refactor] EventCommandPort 의 모든 메서드 시그니처에 title, content 파라미터 추가 (#296)
seongjunnoh Sep 12, 2025
b07e0a5
[refactor] EventCommandPort 구현체의 모든 메서드에 title, content 코드 추가 (#296)
seongjunnoh Sep 12, 2025
bed7c40
[feat] 공통 헬퍼 서비스 및 함수형 인터페이스 도입 (#296)
seongjunnoh Sep 12, 2025
64728a7
[refactor] 기존 NotificationOrchestrator 구현체가 헬퍼서비스를 호출함으로써 공통 로직을 수행하도…
seongjunnoh Sep 12, 2025
30bc7c9
[refactor] 기존 NotificationOrchestrator 구현체 단위 테스트 코드 수정 (#296)
seongjunnoh Sep 12, 2025
a2102fa
[refactor] 기존 NotificationOrchestrator 구현체 통합 테스트 코드 수정 (#296)
seongjunnoh Sep 12, 2025
af159e1
[feat] JwtAuthenticationFilter 화이트리스트 경로 매칭을 PathPattern 기반으로 개선 (#296)
seongjunnoh Sep 13, 2025
4c68d4c
[refactor] 푸시 알림 이벤트 퍼블리시 중 예외가 발생하더라도 이를 외부로 던지지 않도록 try-catch 문 도입 …
seongjunnoh Sep 13, 2025
6850a50
[test] NotificationExecutor 단위 테스트 코드 작성 (#296)
seongjunnoh Sep 13, 2025
7a05757
develop merge
seongjunnoh Sep 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
import konkuk.thip.comment.application.service.validator.CommentAuthorizationValidator;
import konkuk.thip.comment.domain.Comment;
import konkuk.thip.common.exception.InvalidStateException;
import konkuk.thip.message.application.port.out.FeedEventCommandPort;
import konkuk.thip.message.application.port.out.RoomEventCommandPort;
import konkuk.thip.notification.application.port.in.FeedNotificationOrchestrator;
import konkuk.thip.notification.application.port.in.RoomNotificationOrchestrator;
import konkuk.thip.post.application.port.out.dto.PostQueryDto;
import konkuk.thip.post.domain.CountUpdatable;
import konkuk.thip.post.application.service.handler.PostHandler;
Expand All @@ -26,7 +26,6 @@
import static konkuk.thip.common.exception.code.ErrorCode.INVALID_COMMENT_CREATE;
import static konkuk.thip.post.domain.PostType.*;


@Service
@RequiredArgsConstructor
public class CommentCreateService implements CommentCreateUseCase {
Expand All @@ -40,8 +39,8 @@ public class CommentCreateService implements CommentCreateUseCase {
private final PostHandler postHandler;
private final CommentAuthorizationValidator commentAuthorizationValidator;

private final FeedEventCommandPort feedEventCommandPort;
private final RoomEventCommandPort roomEventCommandPort;
private final FeedNotificationOrchestrator feedNotificationOrchestrator;
private final RoomNotificationOrchestrator roomNotificationOrchestrator;

@Override
@Transactional
Expand Down Expand Up @@ -96,10 +95,10 @@ private void sendNotificationsToPostWriter(PostQueryDto postQueryDto, User actor

if (postQueryDto.postType().equals(FEED.getType())) {
// 피드 댓글 알림 이벤트 발행
feedEventCommandPort.publishFeedCommentedEvent(postQueryDto.creatorId(), actorUser.getId(), actorUser.getNickname(), postQueryDto.postId());
feedNotificationOrchestrator.notifyFeedCommented(postQueryDto.creatorId(), actorUser.getId(), actorUser.getNickname(), postQueryDto.postId());
} else if (postQueryDto.postType().equals(RECORD.getType()) || postQueryDto.postType().equals(VOTE.getType())) {
// 모임방 게시글 댓글 알림 이벤트 발행
roomEventCommandPort.publishRoomPostCommentedEvent(postQueryDto.creatorId(), actorUser.getId(), actorUser.getNickname(), postQueryDto.roomId(), postQueryDto.page(), postQueryDto.postId(), postQueryDto.postType());
roomNotificationOrchestrator.notifyRoomPostCommented(postQueryDto.creatorId(), actorUser.getId(), actorUser.getNickname(), postQueryDto.roomId(), postQueryDto.page(), postQueryDto.postId(), postQueryDto.postType());
}
}

Expand All @@ -108,10 +107,10 @@ private void sendNotificationsToParentCommentWriter(PostQueryDto postQueryDto, C

if (postQueryDto.postType().equals(FEED.getType())) {
// 피드 답글 알림 이벤트 발행
feedEventCommandPort.publishFeedRepliedEvent(parentCommentDto.creatorId(), actorUser.getId(), actorUser.getNickname(), postQueryDto.postId());
feedNotificationOrchestrator.notifyFeedReplied(parentCommentDto.creatorId(), actorUser.getId(), actorUser.getNickname(), postQueryDto.postId());
} else if (postQueryDto.postType().equals(RECORD.getType()) || postQueryDto.postType().equals(VOTE.getType())) {
// 모임방 게시글 답글 알림 이벤트 발행
roomEventCommandPort.publishRoomPostCommentRepliedEvent(parentCommentDto.creatorId(), actorUser.getId(), actorUser.getNickname(), postQueryDto.roomId(), postQueryDto.page(), postQueryDto.postId(), postQueryDto.postType());
roomNotificationOrchestrator.notifyRoomPostCommentReplied(parentCommentDto.creatorId(), actorUser.getId(), actorUser.getNickname(), postQueryDto.roomId(), postQueryDto.page(), postQueryDto.postId(), postQueryDto.postType());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
import konkuk.thip.comment.application.port.out.CommentLikeQueryPort;
import konkuk.thip.comment.application.service.validator.CommentAuthorizationValidator;
import konkuk.thip.comment.domain.Comment;
import konkuk.thip.message.application.port.out.FeedEventCommandPort;
import konkuk.thip.message.application.port.out.RoomEventCommandPort;
import konkuk.thip.notification.application.port.in.FeedNotificationOrchestrator;
import konkuk.thip.notification.application.port.in.RoomNotificationOrchestrator;
import konkuk.thip.post.application.port.out.dto.PostQueryDto;
import konkuk.thip.post.application.service.handler.PostHandler;
import konkuk.thip.post.domain.CountUpdatable;
Expand All @@ -32,8 +32,8 @@ public class CommentLikeService implements CommentLikeUseCase {
private final PostHandler postHandler;
private final CommentAuthorizationValidator commentAuthorizationValidator;

private final FeedEventCommandPort feedEventCommandPort;
private final RoomEventCommandPort roomEventCommandPort;
private final FeedNotificationOrchestrator feedNotificationOrchestrator;
private final RoomNotificationOrchestrator roomNotificationOrchestrator;

@Override
@Transactional
Expand Down Expand Up @@ -73,11 +73,11 @@ private void sendNotifications(CommentIsLikeCommand command, Comment comment) {
User actorUser = userCommandPort.findById(command.userId());
// 좋아요 푸쉬알림 전송
if (comment.getPostType() == PostType.FEED) {
feedEventCommandPort.publishFeedCommentLikedEvent(comment.getCreatorId(), actorUser.getId(), actorUser.getNickname(), comment.getTargetPostId());
feedNotificationOrchestrator.notifyFeedCommentLiked(comment.getCreatorId(), actorUser.getId(), actorUser.getNickname(), comment.getTargetPostId());
}
if (comment.getPostType() == PostType.RECORD || comment.getPostType() == PostType.VOTE) {
PostQueryDto postQueryDto = postHandler.getPostQueryDto(comment.getPostType(), comment.getTargetPostId());
roomEventCommandPort.publishRoomCommentLikedEvent(comment.getCreatorId(), actorUser.getId(), actorUser.getNickname(), postQueryDto.roomId(), postQueryDto.page(), postQueryDto.postId(), postQueryDto.postType());
roomNotificationOrchestrator.notifyRoomCommentLiked(comment.getCreatorId(), actorUser.getId(), actorUser.getNickname(), postQueryDto.roomId(), postQueryDto.page(), postQueryDto.postId(), postQueryDto.postType());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package konkuk.thip.common.security.constant;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.Arrays;
import java.util.List;

@RequiredArgsConstructor
@Getter
public enum SecurityWhitelist {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enum으로 따로 분리하셧꾼요 좋네요 👍🏻👍🏻


SWAGGER_UI("/swagger-ui/**"),
API_DOCS("/api-docs/**"),
SWAGGER_UI_HTML("/swagger-ui.html"),
V3_API_DOCS("/v3/api-docs/**"),
OAUTH2_AUTHORIZATION("/oauth2/authorization/**"),
LOGIN_OAUTH2_CODE("/login/oauth2/code/**"),
ACTUATOR_HEALTH("/actuator/health"),
AUTH_USERS("/auth/users"),
AUTH_TOKEN("/auth/token"),
API_TEST("/api/test/**"),
AUTH_EXCHANGE_TEMP_TOKEN("/auth/exchange-temp-token"),
AUTH_SET_COOKIE("/auth/set-cookie");

private final String pattern;

// SecurityConfig 용 전체 리스트
public static String[] patterns() {
return Arrays.stream(values())
.map(SecurityWhitelist::getPattern)
.toArray(String[]::new);
}

// JwtAuthenticationFilter.shouldNotFilter() 용 편의 메서드
public static List<String> patternsList() {
return Arrays.asList(patterns());
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,29 @@
package konkuk.thip.common.security.filter;

import jakarta.annotation.PostConstruct;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import konkuk.thip.common.exception.AuthException;
import konkuk.thip.common.security.constant.SecurityWhitelist;
import konkuk.thip.common.security.oauth2.CustomOAuth2User;
import konkuk.thip.common.security.oauth2.LoginUser;
import konkuk.thip.common.security.util.JwtUtil;
import konkuk.thip.user.application.port.UserTokenBlacklistQueryPort;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.server.PathContainer;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.pattern.PathPattern;
import org.springframework.web.util.pattern.PathPatternParser;

import java.io.IOException;
import java.util.List;

import static konkuk.thip.common.exception.code.ErrorCode.*;
import static konkuk.thip.common.security.constant.AuthParameters.*;
Expand All @@ -30,6 +36,31 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
private final JwtUtil jwtUtil;
private final UserTokenBlacklistQueryPort userTokenBlacklistQueryPort;

private List<PathPattern> whitelistPatterns;
private final PathPatternParser pathPatternParser = new PathPatternParser();

@PostConstruct
void initWhitelistPatterns() {
this.whitelistPatterns = SecurityWhitelist.patternsList().stream()
.map(pathPatternParser::parse) // 애플리케이션 시작 시 1회 컴파일
.toList();
}

@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
// 컨텍스트 패스 고려한 실제 경로(= path) 추출
String requestUri = request.getRequestURI();
String contextPath = request.getContextPath();
String path = (contextPath != null && !contextPath.isEmpty() && requestUri.startsWith(contextPath))
? requestUri.substring(contextPath.length())
: requestUri;

PathContainer container = PathContainer.parsePath(path);

// PathPattern으로 세그먼트 기반 매칭
return whitelistPatterns.stream().anyMatch(p -> p.matches(container));
}
Comment on lines +42 to +62
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호 OOME를 피하고자 처음 시작시에만 정적으로 리스트를 만들어둔 건가요??

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

스프링 서버가 처음 뜰 때 한번만(= @PostConstruct) enum 으로 관리하는 whitelist 들을 PathPattern 객체로 변환하여 shouldNotFilter 메서드에서 계속 사용하는 것을 의도한 코드이긴 합니다!!
초기화 로직으로 생각해주시면 될 것 같습니다!!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네넵 좋습니다! Pattern 객체를 매 패턴 매치시에 사용하면 OOME가 발생할 수도 있는 문제는 것으로 알아서 성준님 코드처럼 미리 컴파일 시점에 객체를 만들어두고 사용하는 것이 안정성이 더 높은 것으로 알고 있습니다.

참고 블로그입니다! https://blogshine.tistory.com/687

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호 좋은 레퍼런스 공유 감사합니닷


@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
Expand Down Expand Up @@ -92,24 +123,4 @@ private String extractToken(HttpServletRequest request) {
log.info("토큰이 없습니다.");
return null;
}

@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
String path = request.getRequestURI();

// 화이트리스트 경로에 대해서는 JWT 필터 제외
return path.startsWith("/swagger-ui")
|| path.startsWith("/v3/api-docs")
|| path.startsWith("/api-docs")
|| path.startsWith("/actuator/health")
|| path.startsWith("/oauth2/authorization")
|| path.startsWith("/login/oauth2/code")
|| path.startsWith("/auth/users")
|| path.equals("/auth/token")

// || path.equals("/auth/set-cookie")
// || path.equals("/auth/exchange-temp-token")
;
}

}
14 changes: 2 additions & 12 deletions src/main/java/konkuk/thip/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package konkuk.thip.config;

import konkuk.thip.common.security.constant.SecurityWhitelist;
import konkuk.thip.common.security.filter.JwtAuthenticationEntryPoint;
import konkuk.thip.common.security.filter.JwtAuthenticationFilter;
import konkuk.thip.common.security.oauth2.CustomOAuth2UserService;
Expand Down Expand Up @@ -48,17 +49,6 @@ public class SecurityConfig {
private final CustomOAuth2UserService customOAuth2UserService;
private final CustomSuccessHandler customSuccessHandler;

private static final String[] WHITELIST = {
"/swagger-ui/**", "/api-docs/**", "/swagger-ui.html",
"/v3/api-docs/**","/oauth2/authorization/**",
"/login/oauth2/code/**", "/actuator/health",
"/auth/users", "/auth/token",

"/api/test/**", // for test

"/auth/exchange-temp-token", "/auth/set-cookie", // deprecated
};

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

Expand All @@ -75,7 +65,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.successHandler(customSuccessHandler) // OAuth2 로그인 성공 시 처리
)
.authorizeHttpRequests(auth -> auth
.requestMatchers(WHITELIST).permitAll()
.requestMatchers(SecurityWhitelist.patterns()).permitAll()
.anyRequest().authenticated()
)
.exceptionHandling(handler -> handler.authenticationEntryPoint(jwtAuthenticationEntryPoint))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import konkuk.thip.feed.domain.value.ContentList;
import konkuk.thip.feed.domain.value.Tag;
import konkuk.thip.feed.domain.value.TagList;
import konkuk.thip.message.application.port.out.FeedEventCommandPort;
import konkuk.thip.notification.application.port.in.FeedNotificationOrchestrator;
import konkuk.thip.user.application.port.out.UserCommandPort;
import konkuk.thip.user.application.port.out.UserQueryPort;
import konkuk.thip.user.domain.User;
Expand All @@ -33,7 +33,7 @@ public class FeedCreateService implements FeedCreateUseCase {
private final UserCommandPort userCommandPort;

private final ImageUrlValidationService imageUrlValidationService;
private final FeedEventCommandPort feedEventCommandPort;
private final FeedNotificationOrchestrator feedNotificationOrchestrator;

@Override
@Transactional
Expand Down Expand Up @@ -71,7 +71,7 @@ private void sendNotifications(FeedCreateCommand command, Long savedFeedId) {
List<User> targetUsers = userQueryPort.getAllFollowersByUserId(command.userId());
User actorUser = userCommandPort.findById(command.userId());
for (User targetUser : targetUsers) {
feedEventCommandPort.publishFolloweeNewPostEvent(targetUser.getId(), actorUser.getId(), actorUser.getNickname(), savedFeedId);
feedNotificationOrchestrator.notifyFolloweeNewPost(targetUser.getId(), actorUser.getId(), actorUser.getNickname(), savedFeedId);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,26 @@ public class FeedEventPublisherAdapter implements FeedEventCommandPort {
private final ApplicationEventPublisher publisher;

@Override
public void publishFollowEvent(Long targetUserId, Long actorUserId, String actorUsername) {
public void publishFollowEvent(
String title, String content,
Long targetUserId, Long actorUserId, String actorUsername) {
publisher.publishEvent(FeedEvents.FollowerEvent.builder()
.title(title)
.content(content)
.targetUserId(targetUserId)
.actorUserId(actorUserId)
.actorUsername(actorUsername)
.build());
}
Comment on lines +16 to 26
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인했습니다~


@Override
public void publishFeedCommentedEvent(Long targetUserId, Long actorUserId, String actorUsername,
Long feedId) {
public void publishFeedCommentedEvent(
String title, String content,
Long targetUserId, Long actorUserId, String actorUsername,
Long feedId) {
publisher.publishEvent(FeedEvents.FeedCommentedEvent.builder()
.title(title)
.content(content)
.targetUserId(targetUserId)
.actorUserId(actorUserId)
.actorUsername(actorUsername)
Expand All @@ -33,9 +41,13 @@ public void publishFeedCommentedEvent(Long targetUserId, Long actorUserId, Strin
}

@Override
public void publishFeedRepliedEvent(Long targetUserId, Long actorUserId, String actorUsername,
Long feedId) {
public void publishFeedRepliedEvent(
String title, String content,
Long targetUserId, Long actorUserId, String actorUsername,
Long feedId) {
publisher.publishEvent(FeedEvents.FeedCommentRepliedEvent.builder()
.title(title)
.content(content)
.targetUserId(targetUserId)
.actorUserId(actorUserId)
.actorUsername(actorUsername)
Expand All @@ -44,9 +56,13 @@ public void publishFeedRepliedEvent(Long targetUserId, Long actorUserId, String
}

@Override
public void publishFolloweeNewPostEvent(Long targetUserId, Long actorUserId, String actorUsername,
Long feedId) {
public void publishFolloweeNewPostEvent(
String title, String content,
Long targetUserId, Long actorUserId, String actorUsername,
Long feedId) {
publisher.publishEvent(FeedEvents.FolloweeNewPostEvent.builder()
.title(title)
.content(content)
.targetUserId(targetUserId)
.actorUserId(actorUserId)
.actorUsername(actorUsername)
Expand All @@ -55,9 +71,13 @@ public void publishFolloweeNewPostEvent(Long targetUserId, Long actorUserId, Str
}

@Override
public void publishFeedLikedEvent(Long targetUserId, Long actorUserId, String actorUsername,
Long feedId) {
public void publishFeedLikedEvent(
String title, String content,
Long targetUserId, Long actorUserId, String actorUsername,
Long feedId) {
publisher.publishEvent(FeedEvents.FeedLikedEvent.builder()
.title(title)
.content(content)
.targetUserId(targetUserId)
.actorUserId(actorUserId)
.actorUsername(actorUsername)
Expand All @@ -66,9 +86,13 @@ public void publishFeedLikedEvent(Long targetUserId, Long actorUserId, String ac
}

@Override
public void publishFeedCommentLikedEvent(Long targetUserId, Long actorUserId, String actorUsername,
Long feedId) {
public void publishFeedCommentLikedEvent(
String title, String content,
Long targetUserId, Long actorUserId, String actorUsername,
Long feedId) {
publisher.publishEvent(FeedEvents.FeedCommentLikedEvent.builder()
.title(title)
.content(content)
.targetUserId(targetUserId)
.actorUserId(actorUserId)
.actorUsername(actorUsername)
Expand Down
Loading