package org.iatoki.judgels.uriel.services.impls; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import org.iatoki.judgels.play.IdentityUtils; import org.iatoki.judgels.play.Page; import org.iatoki.judgels.uriel.ContestContestant; import org.iatoki.judgels.uriel.ContestContestantNotFoundException; import org.iatoki.judgels.uriel.ContestContestantStatus; import org.iatoki.judgels.uriel.models.daos.ContestContestantDao; import org.iatoki.judgels.uriel.models.daos.ContestDao; import org.iatoki.judgels.uriel.models.entities.ContestContestantModel; import org.iatoki.judgels.uriel.models.entities.ContestContestantModel_; import org.iatoki.judgels.uriel.models.entities.ContestModel; import org.iatoki.judgels.uriel.services.ContestContestantService; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; import java.util.List; @Singleton @Named("contestContestantService") public final class ContestContestantServiceImpl implements ContestContestantService { private final ContestDao contestDao; private final ContestContestantDao contestContestantDao; @Inject public ContestContestantServiceImpl(ContestDao contestDao, ContestContestantDao contestContestantDao) { this.contestDao = contestDao; this.contestContestantDao = contestContestantDao; } @Override public boolean isContestContestantInContestByUserJid(String contestJid, String contestContestantJid) { return contestContestantDao.existsByContestJidAndContestantJid(contestJid, contestContestantJid); } @Override public boolean isContestStarted(String contestJid, String contestContestantJid) { return contestContestantDao.isContestStarted(contestJid, contestContestantJid); } @Override public ContestContestant findContestContestantByContestContestantId(long contestContestantId) throws ContestContestantNotFoundException { ContestContestantModel contestContestantModel = contestContestantDao.findById(contestContestantId); if (contestContestantModel != null) { return createContestContestantFromModel(contestContestantModel); } else { throw new ContestContestantNotFoundException("Contest Contestant not found."); } } @Override public ContestContestant findContestContestantByContestJidAndContestContestantJid(String contestJid, String contestContestantJid) { ContestContestantModel contestContestantModel = contestContestantDao.findByContestJidAndContestantJid(contestJid, contestContestantJid); return createContestContestantFromModel(contestContestantModel); } @Override public List<ContestContestant> findAllContestContestantsByContestJid(String contestJid) { List<ContestContestantModel> contestContestantModels = contestContestantDao.findSortedByFilters("id", "asc", "", ImmutableMap.of(ContestContestantModel_.contestJid, contestJid), ImmutableMap.of(), 0, -1); return Lists.transform(contestContestantModels, m -> createContestContestantFromModel(m)); } @Override public Page<ContestContestant> pageContestContestantsByContestJid(String contestJid, long pageIndex, long pageSize, String orderBy, String orderDir, String filterString) { long totalPages = contestContestantDao.countByFilters(filterString, ImmutableMap.of(ContestContestantModel_.contestJid, contestJid), ImmutableMap.of()); List<ContestContestantModel> contestContestantModels = contestContestantDao.findSortedByFilters(orderBy, orderDir, filterString, ImmutableMap.of(ContestContestantModel_.contestJid, contestJid), ImmutableMap.of(), pageIndex * pageSize, pageSize); List<ContestContestant> contestContestants = Lists.transform(contestContestantModels, m -> createContestContestantFromModel(m)); return new Page<>(contestContestants, totalPages, pageIndex, pageSize); } @Override public long getContestContestantCount(String contestJid) { return contestContestantDao.countContestContestantByContestJid(contestJid); } @Override public void createContestContestant(long contestId, String userJid, ContestContestantStatus status) { ContestModel contestModel = contestDao.findById(contestId); ContestContestantModel contestContestantModel = new ContestContestantModel(); contestContestantModel.contestJid = contestModel.jid; contestContestantModel.userJid = userJid; contestContestantModel.status = status.name(); contestContestantDao.persist(contestContestantModel, IdentityUtils.getUserJid(), IdentityUtils.getIpAddress()); } @Override public void updateContestContestant(long contestContestantId, ContestContestantStatus status) { ContestContestantModel contestContestantModel = contestContestantDao.findById(contestContestantId); contestContestantModel.status = status.name(); contestContestantDao.edit(contestContestantModel, IdentityUtils.getUserJid(), IdentityUtils.getIpAddress()); } @Override public void deleteContestContestant(long contestContestantId) { ContestContestantModel contestContestantModel = contestContestantDao.findById(contestContestantId); contestContestantDao.remove(contestContestantModel); } @Override public void startContestAsContestant(String contestJid, String userJid) { ContestContestantModel contestContestantModel = contestContestantDao.findByContestJidAndContestantJid(contestJid, userJid); if (contestContestantModel.contestStartTime == 0) { contestContestantModel.contestStartTime = System.currentTimeMillis(); contestContestantDao.edit(contestContestantModel, IdentityUtils.getUserJid(), IdentityUtils.getIpAddress()); } } private ContestContestant createContestContestantFromModel(ContestContestantModel contestContestantModel) { return new ContestContestant(contestContestantModel.id, contestContestantModel.contestJid, contestContestantModel.userJid, ContestContestantStatus.valueOf(contestContestantModel.status), contestContestantModel.contestStartTime); } }