package io.kaif.service.impl; import static java.util.stream.Collectors.*; import java.time.Clock; import java.time.Instant; import java.time.LocalDate; import java.util.Arrays; import java.util.List; import javax.annotation.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.google.common.annotations.VisibleForTesting; import io.kaif.model.account.Account; import io.kaif.model.account.AccountDao; import io.kaif.model.vote.HonorRoll; import io.kaif.model.vote.HonorRollDao; import io.kaif.model.zone.Zone; import io.kaif.service.HonorRollService; @Service @Transactional public class HonorRollServiceImpl implements HonorRollService { private static final List<String> EXCLUDES_USER_NAME = Arrays.asList("koji", "IngramChen"); private static final int PAGE_SIZE = 25; private Clock clock = Clock.systemDefaultZone(); @Autowired HonorRollDao honorRollDao; @Autowired AccountDao accountDao; @VisibleForTesting void setClock(Clock clock) { this.clock = clock; } @Override public List<HonorRoll> listHonorRollsByUsername(String username) { Account account = accountDao.loadByUsername(username); return honorRollDao.listHonorRollByAccount(account.getAccountId(), Instant.now(clock)); } @Override public List<HonorRoll> listHonorRollsByZone(@Nullable Zone zone) { int pageSize = PAGE_SIZE + EXCLUDES_USER_NAME.size(); LocalDate bucket = honorRollDao.monthlyBucket(Instant.now(clock)); final List<HonorRoll> result; if (zone == null) { result = honorRollDao.listHonorRollWithCache(bucket, pageSize); } else { result = honorRollDao.listHonorRollByZoneWithCache(zone, bucket, pageSize); } return result.stream() .filter(honorRoll -> !EXCLUDES_USER_NAME.contains(honorRoll.getUsername())) .limit(PAGE_SIZE) .collect(toList()); } @Override public List<HonorRoll> listHonorAllByUsername(String username) { Account account = accountDao.loadByUsername(username); return honorRollDao.listHonorAllByAccount(account.getAccountId()); } }