package com.openisle.service; import com.openisle.model.*; import com.openisle.repository.NotificationRepository; import com.openisle.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; /** Service for creating and retrieving notifications. */ @Service @RequiredArgsConstructor public class NotificationService { private final NotificationRepository notificationRepository; private final UserRepository userRepository; public Notification createNotification(User user, NotificationType type, Post post, Comment comment, Boolean approved) { return createNotification(user, type, post, comment, approved, null, null, null); } public Notification createNotification(User user, NotificationType type, Post post, Comment comment, Boolean approved, User fromUser, ReactionType reactionType, String content) { Notification n = new Notification(); n.setUser(user); n.setType(type); n.setPost(post); n.setComment(comment); n.setApproved(approved); n.setFromUser(fromUser); n.setReactionType(reactionType); n.setContent(content); return notificationRepository.save(n); } /** * Create notifications for all admins when a user submits a register request. * Old register request notifications from the same applicant are removed first. */ public void createRegisterRequestNotifications(User applicant, String reason) { notificationRepository.deleteByTypeAndFromUser(NotificationType.REGISTER_REQUEST, applicant); for (User admin : userRepository.findByRole(Role.ADMIN)) { createNotification(admin, NotificationType.REGISTER_REQUEST, null, null, null, applicant, null, reason); } } public List listNotifications(String username, Boolean read) { User user = userRepository.findByUsername(username) .orElseThrow(() -> new com.openisle.exception.NotFoundException("User not found")); if (read == null) { return notificationRepository.findByUserOrderByCreatedAtDesc(user); } return notificationRepository.findByUserAndReadOrderByCreatedAtDesc(user, read); } public void markRead(String username, List ids) { User user = userRepository.findByUsername(username) .orElseThrow(() -> new com.openisle.exception.NotFoundException("User not found")); List notifs = notificationRepository.findAllById(ids); for (Notification n : notifs) { if (n.getUser().getId().equals(user.getId())) { n.setRead(true); } } notificationRepository.saveAll(notifs); } public long countUnread(String username) { User user = userRepository.findByUsername(username) .orElseThrow(() -> new com.openisle.exception.NotFoundException("User not found")); return notificationRepository.countByUserAndRead(user, false); } }