package org.kalipo.service; import org.joda.time.DateTime; import org.kalipo.aop.KalipoExceptionHandler; import org.kalipo.aop.RateLimit; import org.kalipo.config.Constants; import org.kalipo.domain.Ban; import org.kalipo.domain.Site; import org.kalipo.domain.Thread; import org.kalipo.repository.BanRepository; import org.kalipo.repository.SiteRepository; import org.kalipo.repository.ThreadRepository; import org.kalipo.security.Privileges; import org.kalipo.security.SecurityUtils; import org.kalipo.service.util.Asserts; import org.kalipo.web.rest.KalipoException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; import javax.annotation.security.RolesAllowed; import javax.inject.Inject; import javax.validation.Valid; import java.util.List; import java.util.concurrent.Future; @SuppressWarnings("unused") @Service @KalipoExceptionHandler public class BanService { private final Logger log = LoggerFactory.getLogger(BanService.class); @Inject private BanRepository banRepository; @Inject private ThreadRepository threadRepository; @Inject private SiteRepository siteRepository; @Inject private NotificationService notificationService; @RateLimit public Ban create(@Valid Ban ban) throws KalipoException { Asserts.isNotNull(ban, "ban"); Asserts.isNull(ban.getId(), "id"); banRepository.save(ban); String userId = ban.getUserId(); String currentLogin = SecurityUtils.getCurrentLogin(); log.info("User '%s' bans '%s' on site %s until %s", currentLogin, userId, ban.getSiteId(), ban.getValidUntil()); notificationService.announceBan(userId, currentLogin); return banRepository.save(ban); } @Async public Future<List<Ban>> getBansWithPages(String siteId, int pageNumber) { PageRequest pageable = new PageRequest(pageNumber, 10, Sort.Direction.DESC, Constants.PARAM_CREATED_DATE); return new AsyncResult<>(banRepository.findBySiteId(siteId, pageable)); } public void delete(String id) { banRepository.delete(id); } @RolesAllowed(Privileges.BAN_USER) public void banUser(String userId, String threadId) throws KalipoException { Asserts.isNotNull(userId, "userId"); Asserts.isNotNull(threadId, "threadId"); Thread thread = threadRepository.findOne(threadId); Site site = siteRepository.findOne(thread.getSiteId()); // todo check permissons is mod of thread // cannot ban a mod userId Ban ban = new Ban(); ban.setUserId(userId); ban.setSiteId(site.getId()); DateTime until = DateTime.now().plusDays(3); ban.setValidUntil(until); create(ban); } public Ban get(String id) { return banRepository.findOne(id); } }