package org.iatoki.judgels.raguel.forum.member;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import org.iatoki.judgels.play.Page;
import org.iatoki.judgels.raguel.forum.ForumDao;
import org.iatoki.judgels.raguel.forum.ForumModel;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.List;
@Singleton
public final class ForumMemberServiceImpl implements ForumMemberService {
private final ForumDao forumDao;
private final ForumMemberDao forumMemberDao;
@Inject
public ForumMemberServiceImpl(ForumDao forumDao, ForumMemberDao forumMemberDao) {
this.forumDao = forumDao;
this.forumMemberDao = forumMemberDao;
}
@Override
public boolean isMemberInForum(String forumJid, String forumMemberJid) {
return forumMemberDao.existsInForumByMemberJid(forumJid, forumMemberJid);
}
@Override
public ForumMember findMemberInForumById(long forumMemberId) throws ForumMemberNotFoundException {
ForumMemberModel forumMemberModel = forumMemberDao.findById(forumMemberId);
if (forumMemberModel == null) {
throw new ForumMemberNotFoundException("Forum Member not found.");
}
return createForumMemberFromModel(forumMemberModel);
}
@Override
public ForumMember findMemberInForumAndJid(String forumJid, String forumMemberJid) {
ForumMemberModel forumMemberModel = forumMemberDao.findInForumByMemberJid(forumJid, forumMemberJid);
return createForumMemberFromModel(forumMemberModel);
}
@Override
public List<ForumMember> getMembersInForum(String forumJid) {
List<ForumMemberModel> forumMemberModels = forumMemberDao.findSortedByFiltersEq("id", "asc", "", ImmutableMap.of(ForumMemberModel_.forumJid, forumJid), 0, -1);
return Lists.transform(forumMemberModels, m -> createForumMemberFromModel(m));
}
@Override
public Page<ForumMember> getPageOfMembersInForum(String forumJid, long pageIndex, long pageSize, String orderBy, String orderDir, String filterString) {
long totalPages = forumMemberDao.countByFiltersEq(filterString, ImmutableMap.of(ForumMemberModel_.forumJid, forumJid));
List<ForumMemberModel> forumMemberModels = forumMemberDao.findSortedByFiltersEq(orderBy, orderDir, filterString, ImmutableMap.of(ForumMemberModel_.forumJid, forumJid), pageIndex * pageSize, pageSize);
List<ForumMember> forumMembers = Lists.transform(forumMemberModels, m -> createForumMemberFromModel(m));
return new Page<>(forumMembers, totalPages, pageIndex, pageSize);
}
@Override
public void createForumMember(String forumJid, String userJid, String createUserJid, String createUserIpAddress) {
ForumModel forumModel = forumDao.findByJid(forumJid);
ForumMemberModel forumMemberModel = new ForumMemberModel();
forumMemberModel.forumJid = forumModel.jid;
forumMemberModel.userJid = userJid;
forumMemberDao.persist(forumMemberModel, createUserJid, createUserIpAddress);
forumDao.edit(forumModel, createUserJid, createUserIpAddress);
}
@Override
public void deleteForumMember(long forumMemberId) {
ForumMemberModel forumMemberModel = forumMemberDao.findById(forumMemberId);
forumMemberDao.remove(forumMemberModel);
}
private static ForumMember createForumMemberFromModel(ForumMemberModel forumMemberModel) {
return new ForumMember(forumMemberModel.id, forumMemberModel.forumJid, forumMemberModel.userJid);
}
}