GroupChatService.java

package qwerty.chaekit.service.group;

import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import qwerty.chaekit.domain.group.ReadingGroup;
import qwerty.chaekit.domain.group.chat.GroupChat;
import qwerty.chaekit.domain.group.chat.repository.GroupChatRepository;
import qwerty.chaekit.domain.member.user.UserProfile;
import qwerty.chaekit.dto.group.chat.GroupChatRequest;
import qwerty.chaekit.dto.group.chat.GroupChatResponse;
import qwerty.chaekit.dto.page.PageResponse;
import qwerty.chaekit.global.enums.ErrorCode;
import qwerty.chaekit.global.exception.ForbiddenException;
import qwerty.chaekit.global.security.resolver.UserToken;
import qwerty.chaekit.service.util.EntityFinder;
import qwerty.chaekit.service.util.FileService;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class GroupChatService {
    private final GroupChatRepository groupChatRepository;
    private final EntityFinder entityFinder;
    private final FileService fileService;
    private final SimpMessagingTemplate simpMessagingTemplate;

    @Transactional
    public GroupChatResponse createChat(UserToken userToken, Long groupId, GroupChatRequest request) {
        UserProfile user = entityFinder.findUser(userToken.userId());
        ReadingGroup group = entityFinder.findGroup(groupId);

        if (group.isNotAcceptedMember(user)) {
            throw new ForbiddenException(ErrorCode.MEMBER_NOT_FOUND);
        }

        GroupChat chat = GroupChat.builder()
                .group(group)
                .author(user)
                .content(request.content())
                .build();
        
        GroupChat savedChat = groupChatRepository.save(chat);

        GroupChatResponse response = GroupChatResponse.builder()
                .chatId(savedChat.getId())
                .groupId(groupId)
                .authorId(user.getId())
                .authorName(user.getNickname())
                .authorProfileImage(fileService.convertToPublicImageURL(user.getProfileImageKey()))
                .content(request.content())
                .createdAt(savedChat.getCreatedAt())
                .build();

        simpMessagingTemplate.convertAndSend("/topic/group/" + response.groupId(), response);
        return response;
    }

    public PageResponse<GroupChatResponse> getChats(Long groupId, Pageable pageable) {//과거메세지 받아오는용도
        ReadingGroup group = entityFinder.findGroup(groupId);
        Page<GroupChat> savedChats = groupChatRepository.findByGroupOrderByCreatedAtDesc(group, pageable);
        //groupChatConsumer.subscribeToGroupChat(groupId);

        return PageResponse.of(savedChats.map(chat -> GroupChatResponse.of(
                chat,
                fileService.convertToPublicImageURL(chat.getAuthor().getProfileImageKey()))
        ));
    }
}