UserDataDTOService.java

package edu.ucsb.cs156.dining.services;

import com.google.common.collect.Lists;
import edu.ucsb.cs156.dining.entities.Admin;
import edu.ucsb.cs156.dining.entities.Moderator;
import edu.ucsb.cs156.dining.entities.User;
import edu.ucsb.cs156.dining.models.UserDataDTO;
import edu.ucsb.cs156.dining.repositories.AdminRepository;
import edu.ucsb.cs156.dining.repositories.ModeratorRepository;
import edu.ucsb.cs156.dining.repositories.UserRepository;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

@Service
public class UserDataDTOService {
  private final UserRepository userRepository;
  private final AdminRepository adminRepository;
  private final ModeratorRepository moderatorRepository;

  @Autowired
  public UserDataDTOService(
      UserRepository userRepository,
      AdminRepository adminRepository,
      ModeratorRepository moderatorRepository) {
    this.userRepository = userRepository;
    this.adminRepository = adminRepository;
    this.moderatorRepository = moderatorRepository;
  }

  public Page<UserDataDTO> getUserDataDTOs(Pageable pageable) {
    Page<User> users = userRepository.findAll(pageable);
    List<Admin> admins = Lists.newArrayList(adminRepository.findAll());
    List<Moderator> moderators = Lists.newArrayList(moderatorRepository.findAll());

    List<UserDataDTO> userDTOs = new ArrayList<>();

    for (User user : users) {
      boolean isAdmin = admins.stream().anyMatch(a -> a.getEmail().equals(user.getEmail()));
      boolean isModerator = moderators.stream().anyMatch(m -> m.getEmail().equals(user.getEmail()));

      userDTOs.add(UserDataDTO.from(user, isAdmin, isModerator));
    }

    return new PageImpl<>(userDTOs, pageable, users.getTotalElements());
  }
}