NotificationQueryService.java

package com.hwhub.backend.application.service.notification;

import com.hwhub.backend.domain.enums.ProgramType;
import com.hwhub.backend.domain.model.notification.NotificationModel;
import com.hwhub.backend.domain.repository.NotificationRepository;
import com.hwhub.backend.domain.repository.UserRepository;
import java.time.LocalDateTime;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class NotificationQueryService {

  private final NotificationRepository notificationRepository;
  private final UserRepository userRepository;

  /**
   * 通知一覧取得
   *
   * @param targetUserId 対象ユーザー
   * @param limit 件数
   * @param markRead 一覧表示と同時に既読化するか
   */
  @Transactional
  public List<NotificationModel> getNotifications(Long targetUserId, int limit, boolean markRead) {
    if (!userRepository.isNotificationEnabled(targetUserId)) {
      return List.of();
    }

    List<NotificationModel> list =
        notificationRepository.findLatestByTargetUser(targetUserId, limit);

    if (markRead && !list.isEmpty()) {
      notificationRepository.markAllAsRead(
          targetUserId, LocalDateTime.now(), targetUserId, ProgramType.ONL_NTF_QRY.getCode());
    }

    return list;
  }

  @Transactional(readOnly = true)
  public long getUnreadCount(Long userId) {
    if (!userRepository.isNotificationEnabled(userId)) {
      return 0;
    }
    return notificationRepository.countUnreadByTargetUser(userId);
  }
}