001package usecase.user;
002
003import model.entity.Ban;
004import model.entity.User;
005import model.repository.GenericRepository;
006import model.validation.BanExists;
007import model.validation.UserExists;
008import usecase.auth.AdminsOnly;
009
010import javax.enterprise.context.ApplicationScoped;
011import javax.inject.Inject;
012import javax.transaction.Transactional;
013import javax.validation.constraints.Future;
014import javax.validation.constraints.NotNull;
015import java.time.Instant;
016import java.util.ArrayList;
017import java.util.List;
018
019/**
020 * Classe che fornisce i servizi relativi ai ban.
021 */
022@ApplicationScoped
023@Transactional
024public class BanService {
025    private GenericRepository genericRepository;
026
027    protected BanService(){}
028
029    @Inject
030    protected BanService(GenericRepository genericRepository){
031        this.genericRepository = genericRepository;
032    }
033
034
035    /**
036     * Aggiunge un ban dato l'id di un utente.
037     * @param date data di fine ban
038     * @param userId identificativo utente
039     * @return entità ban aggiunta
040     */
041    @AdminsOnly
042    public int addBan(@NotNull @Future Instant date, @UserExists int userId) {
043        Ban ban = new Ban();
044        ban.setEndTime(date);
045        User user = new User();
046        user.setId(userId);
047        ban.setUser(user);
048        return genericRepository.insert(ban).getId();
049    }
050
051    /**
052     * Rimuove un ban dato il suo id
053     * @param banId identificativo del ban
054     */
055    @AdminsOnly
056    public void removeBan(@BanExists int banId){
057        genericRepository.remove(genericRepository.findById(Ban.class, banId));
058    }
059
060    /**
061     * Ritorna la lista dei ban di un utente
062     * @param userId identificativo utente
063     * @return lista dei ban relativi all'utente
064     */
065    @AdminsOnly
066    public List<BanDTO> retrieveUserBan(@UserExists int userId){
067        User user = genericRepository.findById(User.class, userId);
068        List<BanDTO> bans = new ArrayList<>();
069        List<Ban> temp = user.getBans();
070
071        for(Ban b : temp){
072            BanDTO ban = new BanDTO(b.getId(), b.getEndTime(), b.getUser().getId());
073            bans.add(ban);
074        }
075        return bans;
076    }
077}