package it.bgates.remotebe.service; import it.bgates.remotebe.entities.Distributor; import it.bgates.remotebe.entities.User; import it.bgates.remotebe.exception.PermissionDeniedException; import it.bgates.remotebe.exception.UserNotFoundException; import it.bgates.remotebe.repository.DistributorRepository; import it.bgates.remotebe.repository.UserRepository; import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.security.Principal; import java.util.List; import java.util.Optional; @Service @RequiredArgsConstructor public class DistributorService extends BaseService { private final DistributorRepository distributorRepository; private final UserRepository userRepository; private final EntityManager entityManager; /*** * returns the list of distributors accessible the currently logged user * If the user is an admin, returns all the distributors * If the user is a distributor, returns only itself * @param principal * @return */ public List getDistributors(Principal principal) throws UserNotFoundException { getUserDetails(principal); Optional user = userRepository.findByUsername(userDetails.getUsername()); if (user.isEmpty()) { return List.of(); } if (isSuperUser()) { return distributorRepository.findAllByOrderByName(); } if (isDistributor()) { return List.of(user.get().getDistributor()); } return List.of(); } public Distributor save(Distributor distributor, Principal principal) throws UserNotFoundException, PermissionDeniedException { getUserDetails(principal); if (!isSuperUser() && distributor.getId() == null) { throw new PermissionDeniedException("Accesso negato"); } return distributorRepository.save(distributor); } public Distributor getDistributorById(Integer id) { return distributorRepository.findById(id).orElse(null); } public List filter(String filter, Principal principal) throws UserNotFoundException { getUserDetails(principal); Optional user = userRepository.findByUsername(userDetails.getUsername()); if (user.isEmpty()) { return List.of(); } StringBuilder filterBuilder = new StringBuilder(); if (isDistributor()) { filterBuilder.append("WHERE d = :distributor"); } else if (isSuperUser()) { filterBuilder.append("WHERE true"); } else if (isUser()) { filterBuilder.append("WHERE false"); } List params = buildFilter(filterBuilder, filter, new String[] { "name", "vatNumber", "city" }); String sql = "SELECT d FROM Distributor d " + filterBuilder.toString(); TypedQuery query = entityManager.createQuery(sql, Distributor.class); for (int i = 0; i < params.size(); i++) { query.setParameter("param_" + i, params.get(i)); } for (int i = 0; i < params.size(); i++) { query.setParameter("param_" + i, params.get(i)); } if (isDistributor()) { query.setParameter("distributor", user.get().getDistributor()); } List distributors = query.getResultList(); return distributors; } }