package org.iatoki.judgels.uriel.services.impls; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import org.apache.commons.lang3.StringUtils; import org.iatoki.judgels.play.IdentityUtils; import org.iatoki.judgels.play.JudgelsPlayUtils; import org.iatoki.judgels.play.Page; import org.iatoki.judgels.jophiel.Jophiel; import org.iatoki.judgels.jophiel.UserInfo; import org.iatoki.judgels.jophiel.UserTokens; import org.iatoki.judgels.uriel.UrielUtils; import org.iatoki.judgels.uriel.User; import org.iatoki.judgels.uriel.UserNotFoundException; import org.iatoki.judgels.uriel.models.daos.UserDao; import org.iatoki.judgels.uriel.models.entities.UserModel; import org.iatoki.judgels.uriel.services.UserService; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; import java.io.IOException; import java.util.Arrays; import java.util.List; @Singleton @Named("userService") public final class UserServiceImpl implements UserService { private final Jophiel jophiel; private final UserDao userDao; @Inject public UserServiceImpl(Jophiel jophiel, UserDao userDao) { this.jophiel = jophiel; this.userDao = userDao; } @Override public void upsertUser(String userJid, String accessToken, String idToken, String refreshToken, long expireTime) { if (userDao.existsByUserJid(userJid)) { UserModel userModel = userDao.findByUserJid(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(UrielUtils.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.existsByUserJid(userJid); } @Override public User findUserById(long userId) throws UserNotFoundException { UserModel userModel = userDao.findById(userId); if (userModel != null) { return createUserFromUserModel(userModel); } else { throw new UserNotFoundException("User not found."); } } @Override public User findUserByUserJid(String userJid) { UserModel userModel = userDao.findByUserJid(userJid); return createUserFromUserModel(userModel); } @Override public void createUser(String userJid, List<String> roles) { UserModel userModel = new UserModel(); userModel.userJid = userJid; userModel.roles = StringUtils.join(roles, ","); userDao.persist(userModel, IdentityUtils.getUserJid(), IdentityUtils.getIpAddress()); } @Override public void updateUser(long userId, List<String> roles) { UserModel userModel = userDao.findById(userId); userModel.roles = StringUtils.join(roles, ","); userDao.edit(userModel, IdentityUtils.getUserJid(), IdentityUtils.getIpAddress()); } @Override public void deleteUser(long userId) { UserModel userModel = userDao.findById(userId); userDao.remove(userModel); } @Override public Page<User> pageUsers(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, ImmutableMap.of(), ImmutableMap.of(), pageIndex * pageSize, pageSize); List<User> users = Lists.transform(userModels, m -> createUserFromUserModel(m)); return new Page<>(users, totalPages, pageIndex, pageSize); } @Override public void upsertUserFromJophielUserJid(String userJid) { upsertUserFromJophielUserJid(userJid, UrielUtils.getDefaultRoles()); } @Override public void upsertUserFromJophielUserJid(String userJid, List<String> roles) { try { UserInfo user = jophiel.getUserByUserJid(userJid); if (!userDao.existsByUserJid(userJid)) createUser(user.getJid(), roles); JidCacheServiceImpl.getInstance().putDisplayName(user.getJid(), JudgelsPlayUtils.getUserDisplayName(user.getUsername(), user.getName()), IdentityUtils.getUserJid(), IdentityUtils.getIpAddress()); AvatarCacheServiceImpl.getInstance().putImageUrl(user.getJid(), user.getProfilePictureUrl(), IdentityUtils.getUserJid(), IdentityUtils.getIpAddress()); } catch (IOException e) { // do nothing } } @Override public UserTokens getUserTokensByUserJid(String userJid) { UserModel userModel = userDao.findByUserJid(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(","))); } }