NotificationPermissionService.java

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

import com.hwhub.backend.domain.enums.NotificationGroup;
import com.hwhub.backend.domain.enums.NotificationType;
import com.hwhub.backend.domain.model.notification.NotificationGroupResolver;
import com.hwhub.backend.domain.repository.UserNotificationSettingRepository;
import com.hwhub.backend.domain.repository.UserRepository;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class NotificationPermissionService {

  private final UserRepository userRepository;
  private final UserNotificationSettingRepository userNotificationSettingRepository;

  /**
   * 通知を受け取れるかどうかを返す。
   *
   * <p>差分運用のため、m_notification_settingsにレコードがない場合はデフォルトONであると判断する。
   *
   * <ul>
   *   <li>m_user.notification_enabled=false => false
   *   <li>m_user.notification_enabled=true かつ m_notification_settingsにレコードがない => true
   *   <li>m_user.notification_enabled=true かつ m_notification_settingsにレコードがある => その値
   * </ul>
   *
   * @param userId ユーザーID
   * @param type 通知タイプ
   * @return 通知を受け取れるかどうか
   */
  public boolean canReceive(Long userId, NotificationType type) {

    if (!userRepository.isNotificationEnabled(userId)) {
      return false;
    }

    NotificationGroup group = NotificationGroupResolver.resolve(type);

    Optional<Boolean> groupEnabled = userNotificationSettingRepository.findEnabled(userId, group);
    return groupEnabled.orElse(true);
  }
}