-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: ✨ Turn On/Off Chat Room's Notification Setting API (#226)
* feat: add chat-room-toggle-command * feat: impl chat-room-notification-toggle-service * feat: add static factory method $ validator in command * test: service layer slice test for transation verifying * feat: add notification turn on/off usecase * style: move toggle service from chat-member-usecase to chat-room-usecase * feat: open notification turn on/off api * docs: write notification turn on/off api swagger
- Loading branch information
1 parent
9598bd9
commit 2a12a8f
Showing
6 changed files
with
186 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
19 changes: 19 additions & 0 deletions
19
...n-service/src/main/java/kr/co/pennyway/domain/context/chat/dto/ChatRoomToggleCommand.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package kr.co.pennyway.domain.context.chat.dto; | ||
|
||
public record ChatRoomToggleCommand( | ||
Long userId, | ||
Long chatRoomId | ||
) { | ||
public ChatRoomToggleCommand { | ||
if (userId == null) { | ||
throw new IllegalArgumentException("userId must not be null"); | ||
} | ||
if (chatRoomId == null) { | ||
throw new IllegalArgumentException("chatRoomId must not be null"); | ||
} | ||
} | ||
|
||
public static ChatRoomToggleCommand of(Long userId, Long chatRoomId) { | ||
return new ChatRoomToggleCommand(userId, chatRoomId); | ||
} | ||
} |
37 changes: 37 additions & 0 deletions
37
...in/java/kr/co/pennyway/domain/context/chat/service/ChatRoomNotificationToggleService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package kr.co.pennyway.domain.context.chat.service; | ||
|
||
import kr.co.pennyway.common.annotation.DomainService; | ||
import kr.co.pennyway.domain.context.chat.dto.ChatRoomToggleCommand; | ||
import kr.co.pennyway.domain.domains.member.exception.ChatMemberErrorCode; | ||
import kr.co.pennyway.domain.domains.member.exception.ChatMemberErrorException; | ||
import kr.co.pennyway.domain.domains.member.service.ChatMemberRdbService; | ||
import lombok.RequiredArgsConstructor; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
@Slf4j | ||
@DomainService | ||
@RequiredArgsConstructor | ||
public class ChatRoomNotificationToggleService { | ||
private final ChatMemberRdbService chatMemberRdbService; | ||
|
||
@Transactional | ||
public void turnOn(ChatRoomToggleCommand command) { | ||
var chatMember = chatMemberRdbService.readChatMember(command.userId(), command.chatRoomId()) | ||
.orElseThrow(() -> new ChatMemberErrorException(ChatMemberErrorCode.NOT_FOUND)); | ||
|
||
chatMember.enableNotify(); | ||
|
||
log.info("{}님이 {} 채팅방의 알림을 켰습니다.", chatMember.getId(), command.chatRoomId()); | ||
} | ||
|
||
@Transactional | ||
public void turnOff(ChatRoomToggleCommand command) { | ||
var chatMember = chatMemberRdbService.readChatMember(command.userId(), command.chatRoomId()) | ||
.orElseThrow(() -> new ChatMemberErrorException(ChatMemberErrorCode.NOT_FOUND)); | ||
|
||
chatMember.disableNotify(); | ||
|
||
log.info("{}님이 {} 채팅방의 알림을 껐습니다.", chatMember.getId(), command.chatRoomId()); | ||
} | ||
} |
91 changes: 91 additions & 0 deletions
91
...way/domain/context/chat/integration/ChatRoomNotificationToggleServiceIntegrationTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
package kr.co.pennyway.domain.context.chat.integration; | ||
|
||
import kr.co.pennyway.domain.common.repository.ExtendedRepositoryFactory; | ||
import kr.co.pennyway.domain.config.DomainServiceIntegrationProfileResolver; | ||
import kr.co.pennyway.domain.config.DomainServiceTestInfraConfig; | ||
import kr.co.pennyway.domain.config.JpaTestConfig; | ||
import kr.co.pennyway.domain.context.chat.dto.ChatRoomToggleCommand; | ||
import kr.co.pennyway.domain.context.chat.service.ChatRoomNotificationToggleService; | ||
import kr.co.pennyway.domain.context.common.fixture.ChatRoomFixture; | ||
import kr.co.pennyway.domain.context.common.fixture.UserFixture; | ||
import kr.co.pennyway.domain.domains.chatroom.domain.ChatRoom; | ||
import kr.co.pennyway.domain.domains.chatroom.repository.ChatRoomRepository; | ||
import kr.co.pennyway.domain.domains.member.domain.ChatMember; | ||
import kr.co.pennyway.domain.domains.member.repository.ChatMemberRepository; | ||
import kr.co.pennyway.domain.domains.member.service.ChatMemberRdbService; | ||
import kr.co.pennyway.domain.domains.member.type.ChatMemberRole; | ||
import kr.co.pennyway.domain.domains.user.domain.User; | ||
import kr.co.pennyway.domain.domains.user.repository.UserRepository; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.junit.jupiter.api.DisplayName; | ||
import org.junit.jupiter.api.Test; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; | ||
import org.springframework.boot.autoconfigure.domain.EntityScan; | ||
import org.springframework.boot.test.context.SpringBootTest; | ||
import org.springframework.context.annotation.Import; | ||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; | ||
import org.springframework.test.context.ActiveProfiles; | ||
|
||
import static org.junit.jupiter.api.Assertions.assertFalse; | ||
import static org.junit.jupiter.api.Assertions.assertTrue; | ||
|
||
@Slf4j | ||
@EnableAutoConfiguration | ||
@SpringBootTest(classes = {ChatRoomNotificationToggleService.class, ChatMemberRdbService.class}) | ||
@EntityScan(basePackageClasses = {User.class, ChatRoom.class, ChatMember.class}) | ||
@EnableJpaRepositories( | ||
basePackageClasses = {UserRepository.class, ChatRoomRepository.class, ChatMemberRepository.class}, | ||
repositoryFactoryBeanClass = ExtendedRepositoryFactory.class | ||
) | ||
@ActiveProfiles(resolver = DomainServiceIntegrationProfileResolver.class) | ||
@Import(value = {JpaTestConfig.class}) | ||
public class ChatRoomNotificationToggleServiceIntegrationTest extends DomainServiceTestInfraConfig { | ||
@Autowired | ||
private ChatRoomNotificationToggleService sut; | ||
|
||
@Autowired | ||
private UserRepository userRepository; | ||
|
||
@Autowired | ||
private ChatRoomRepository chatRoomRepository; | ||
|
||
@Autowired | ||
private ChatMemberRepository chatMemberRepository; | ||
|
||
@Test | ||
@DisplayName("채팅방 알림을 켜면 알림이 켜진다.") | ||
void shouldTurnOnWhenChatMemberExists() { | ||
// given | ||
var user = userRepository.save(UserFixture.GENERAL_USER.toUser()); | ||
var chatRoom = chatRoomRepository.save(ChatRoomFixture.PUBLIC_CHAT_ROOM.toEntityWithId(1L)); | ||
var chatMember = ChatMember.of(user, chatRoom, ChatMemberRole.MEMBER); | ||
chatMember.disableNotify(); | ||
chatMember = chatMemberRepository.save(chatMember); | ||
|
||
// when | ||
sut.turnOn(ChatRoomToggleCommand.of(user.getId(), chatRoom.getId())); | ||
|
||
// then | ||
var updatedChatMember = chatMemberRepository.findById(chatMember.getId()).get(); | ||
assertTrue(updatedChatMember.isNotifyEnabled()); | ||
} | ||
|
||
@Test | ||
@DisplayName("채팅방 알림을 끄면 알림이 꺼진다.") | ||
void shouldTurnOffWhenChatMemberExists() { | ||
// given | ||
var user = userRepository.save(UserFixture.GENERAL_USER.toUser()); | ||
var chatRoom = chatRoomRepository.save(ChatRoomFixture.PUBLIC_CHAT_ROOM.toEntityWithId(2L)); | ||
var chatMember = ChatMember.of(user, chatRoom, ChatMemberRole.MEMBER); | ||
chatMember.enableNotify(); | ||
chatMember = chatMemberRepository.save(chatMember); | ||
|
||
// when | ||
sut.turnOff(ChatRoomToggleCommand.of(user.getId(), chatRoom.getId())); | ||
|
||
// then | ||
var updatedChatMember = chatMemberRepository.findById(chatMember.getId()).get(); | ||
assertFalse(updatedChatMember.isNotifyEnabled()); | ||
} | ||
} |