Skip to content
57 changes: 42 additions & 15 deletions src/main/java/com/oronaminc/join/room/service/RoomService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
package com.oronaminc.join.room.service;

import static com.oronaminc.join.global.exception.ErrorCode.*;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.oronaminc.join.answer.domain.Answer;
import com.oronaminc.join.answer.service.AnswerReader;
import com.oronaminc.join.document.domain.Document;
Expand All @@ -16,22 +28,23 @@
import com.oronaminc.join.room.dao.RoomRepository;
import com.oronaminc.join.room.domain.Room;
import com.oronaminc.join.room.domain.RoomStatus;
import com.oronaminc.join.room.dto.*;
import com.oronaminc.join.room.dto.CreateRoomRequest;
import com.oronaminc.join.room.dto.CreateRoomResponse;
import com.oronaminc.join.room.dto.JoinRoomRequest;
import com.oronaminc.join.room.dto.JoinRoomResponse;
import com.oronaminc.join.room.dto.ReportResponse;
import com.oronaminc.join.room.dto.RoomDetailResponse;
import com.oronaminc.join.room.dto.RoomJoinResponse;
import com.oronaminc.join.room.dto.RoomUpdateInfoResponse;
import com.oronaminc.join.room.dto.RoomUpdateRequest;
import com.oronaminc.join.room.dto.RoomUpdateStatusRequest;
import com.oronaminc.join.room.dto.TopQnAResponse;
import com.oronaminc.join.room.event.RoomDeleteEvent;
import com.oronaminc.join.room.util.CodeGenerator;
import com.oronaminc.join.room.util.RoomMapper;
import com.oronaminc.join.websocket.session.CurrentParticipantManager;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import static com.oronaminc.join.global.exception.ErrorCode.*;
import lombok.RequiredArgsConstructor;

@Service
@Transactional(readOnly = true)
Expand All @@ -49,6 +62,7 @@ public class RoomService {
private final RoomReader roomReader;
private final CurrentParticipantManager currentParticipantManager;
private final ApplicationEventPublisher publisher;
private final CacheManager cacheManager;

private static final int CODE_LENGTH = 6;

Expand Down Expand Up @@ -92,7 +106,6 @@ public RoomDetailResponse getRoomDetail(Long memberId, Long roomId) {
}

@Transactional
@CacheEvict(cacheNames = "roomById", key = "#roomId")
public void updateRoom(Long memberId, Long roomId, RoomUpdateRequest updateRoomRequest) {
participantService.validatePresenter(roomId, memberId);

Expand All @@ -105,10 +118,11 @@ public void updateRoom(Long memberId, Long roomId, RoomUpdateRequest updateRoomR
room.update(updateRoomRequest);
participantService.updateTeam(room, updateRoomRequest.teamEmail());
documentService.updateDocument(updateRoomRequest.documentUrl(), roomId);

clearCache(room.getId(), room.getSecretCode());
}

@Transactional
@CacheEvict(cacheNames = "roomById", key = "#roomId")
public void deleteRoom(Long memberId, Long roomId) {
participantService.validatePresenter(roomId, memberId);

Expand All @@ -119,18 +133,19 @@ public void deleteRoom(Long memberId, Long roomId) {
throw new ErrorException(BAD_REQUEST_ROOM_STARTED);
}

clearCache(room.getId(), room.getSecretCode());
publisher.publishEvent(new RoomDeleteEvent(roomId));
roomRepository.deleteById(roomId);
s3Service.deleteFile(document.getFileUrl());
}

@Transactional
@CacheEvict(cacheNames = "roomById", key = "#roomId")
public void updateRoomStatus(Long memberId, Long roomId,
RoomUpdateStatusRequest roomUpdateStatusRequest) {
RoomUpdateStatusRequest roomUpdateStatusRequest) {
participantService.validatePresenter(roomId, memberId);
Room room = roomReader.getById(roomId);

clearCache(room.getId(), room.getSecretCode());
RoomStatus updateStatus = roomUpdateStatusRequest.roomStatus();
List<RoomStatus> canUpdateStatus = List.of(RoomStatus.STARTED, RoomStatus.ENDED);
if (!canUpdateStatus.contains(roomUpdateStatusRequest.roomStatus())) {
Expand Down Expand Up @@ -222,4 +237,16 @@ public RoomJoinResponse subscribeRoom(Long roomId, Long memberId) {
currentParticipantManager.addParticipant(roomId, memberId, limit);
return new RoomJoinResponse(currentParticipantManager.getRoomParticipants(roomId).size());
}

private void clearCache(Long roomId, String secretCode) {
Cache roomByIdCache = cacheManager.getCache("roomById");
if (roomByIdCache != null) {
roomByIdCache.evict(roomId);
}

Cache roomBySecretCodeCache = cacheManager.getCache("roomBySecretCode");
if (roomBySecretCodeCache != null) {
roomBySecretCodeCache.evict(secretCode);
}
}
}
Loading