ChatRoomScheduler.java

package com.newbit.coffeeletter.scheduler;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.newbit.coffeeletter.domain.chat.CoffeeLetterRoom;
import com.newbit.coffeeletter.domain.chat.CoffeeLetterRoom.RoomStatus;
import com.newbit.coffeeletter.dto.CoffeeLetterRoomDTO;
import com.newbit.coffeeletter.repository.CoffeeLetterRoomRepository;
import com.newbit.coffeeletter.service.ChatService;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
@EnableScheduling
public class ChatRoomScheduler {

    private final CoffeeLetterRoomRepository roomRepository;
    private final ChatService chatService;
    
    public ChatRoomScheduler(CoffeeLetterRoomRepository roomRepository, ChatService chatService) {
        this.roomRepository = roomRepository;
        this.chatService = chatService;
    }

    @Scheduled(fixedRate = 300000)
    public void closeExpiredRooms() {
        LocalDateTime now = LocalDateTime.now();
        
        List<CoffeeLetterRoom> expiredRooms = roomRepository.findByStatus(RoomStatus.ACTIVE)
                .stream()
                .filter(room -> room.getEndTime() != null && room.getEndTime().isBefore(now))
                .collect(Collectors.toList());
        
        log.info("Closing {} expired chat rooms", expiredRooms.size());
        
        for (CoffeeLetterRoom room : expiredRooms) {
            log.info("Closing room: {}", room.getId());
            try {
                CoffeeLetterRoomDTO inactiveRoom = chatService.endRoom(room.getId());
                log.info("Room closed successfully: {}", inactiveRoom.getId());
            } catch (Exception e) {
                log.error("Error closing room {}: {}", room.getId(), e.getMessage());
            }
        }
    }
}