package org.iatoki.judgels.raguel.user; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import org.apache.commons.lang3.StringUtils; import org.iatoki.judgels.api.jophiel.JophielUser; import org.iatoki.judgels.jophiel.user.UserTokens; import org.iatoki.judgels.play.IdentityUtils; import org.iatoki.judgels.play.JudgelsPlayUtils; import org.iatoki.judgels.play.Page; import org.iatoki.judgels.raguel.RaguelUtils; import org.iatoki.judgels.raguel.avatar.AvatarCacheServiceImpl; import org.iatoki.judgels.raguel.jid.JidCacheServiceImpl; import javax.inject.Inject; import javax.inject.Singleton; import java.util.Arrays; import java.util.List; @Singleton public final class UserServiceImpl implements UserService { private final UserDao userDao; @Inject public UserServiceImpl(UserDao userDao) { this.userDao = userDao; } @Override public void upsertUser(String userJid, String accessToken, String idToken, String refreshToken, long expireTime) { if (userDao.existsByJid(userJid)) { UserModel userModel = userDao.findByJid(userJid); userModel.accessToken = accessToken; userModel.refreshToken = refreshToken; userModel.idToken = idToken; userModel.expirationTime = expireTime; userDao.edit(userModel, "guest", IdentityUtils.getIpAddress()); } else { UserModel userModel = new UserModel(); userModel.userJid = userJid; userModel.roles = StringUtils.join(RaguelUtils.getDefaultRoles(), ","); userModel.accessToken = accessToken; userModel.refreshToken = refreshToken; userModel.idToken = idToken; userModel.expirationTime = expireTime; userDao.persist(userModel, "guest", IdentityUtils.getIpAddress()); } } @Override public boolean existsByUserJid(String userJid) { return userDao.existsByJid(userJid); } @Override public User findUserById(long userId) throws UserNotFoundException { UserModel userModel = userDao.findById(userId); if (userModel == null) { throw new UserNotFoundException("User not found."); } return createUserFromUserModel(userModel); } @Override public User findUserByJid(String userJid) { UserModel userModel = userDao.findByJid(userJid); return createUserFromUserModel(userModel); } @Override public void createUser(String userJid, List<String> roles, String createUserJid, String createUserIpAddress) { UserModel userModel = new UserModel(); userModel.userJid = userJid; userModel.roles = StringUtils.join(roles, ","); userDao.persist(userModel, createUserJid, createUserIpAddress); } @Override public void updateUser(long userId, List<String> roles, String userJid, String userIpAddress) { UserModel userModel = userDao.findById(userId); userModel.roles = StringUtils.join(roles, ","); userDao.edit(userModel, userJid, userIpAddress); } @Override public void deleteUser(long userId) { UserModel userModel = userDao.findById(userId); userDao.remove(userModel); } @Override public Page<User> getPageOfUsers(long pageIndex, long pageSize, String orderBy, String orderDir, String filterString) { long totalPages = userDao.countByFilters(filterString, ImmutableMap.of(), ImmutableMap.of()); List<UserModel> userModels = userDao.findSortedByFilters(orderBy, orderDir, filterString, pageIndex * pageSize, pageSize); List<User> users = Lists.transform(userModels, m -> createUserFromUserModel(m)); return new Page<>(users, totalPages, pageIndex, pageSize); } @Override public void upsertUserFromJophielUser(JophielUser jophielUser, String userJid, String userIpAddress) { upsertUserFromJophielUser(jophielUser, RaguelUtils.getDefaultRoles(), userJid, userIpAddress); } @Override public void upsertUserFromJophielUser(JophielUser jophielUser, List<String> roles, String userJid, String userIpAddress) { if (!userDao.existsByJid(jophielUser.getJid())) { createUser(jophielUser.getJid(), roles, userJid, userIpAddress); } JidCacheServiceImpl.getInstance().putDisplayName(jophielUser.getJid(), JudgelsPlayUtils.getUserDisplayName(jophielUser.getUsername()), userJid, userIpAddress); AvatarCacheServiceImpl.getInstance().putImageUrl(jophielUser.getJid(), jophielUser.getProfilePictureUrl(), userJid, userIpAddress); } @Override public UserTokens getUserTokensByUserJid(String userJid) { UserModel userModel = userDao.findByJid(userJid); return createUserTokensFromUserModel(userModel); } private UserTokens createUserTokensFromUserModel(UserModel userModel) { return new UserTokens(userModel.userJid, userModel.accessToken, userModel.refreshToken, userModel.idToken, userModel.expirationTime); } private User createUserFromUserModel(UserModel userModel) { return new User(userModel.id, userModel.userJid, Arrays.asList(userModel.roles.split(","))); } }