dirgantarasiahaan 8a7448210e fix menus
2023-05-29 22:00:14 +07:00

153 lines
6.9 KiB
Java

package com.iconplus.smartproc.service.authentication;
import com.iconplus.smartproc.configuration.JwtTokenUtil;
import com.iconplus.smartproc.exception.BusinessException;
import com.iconplus.smartproc.helper.service.BaseService;
import com.iconplus.smartproc.model.entity.TokenManagement;
import com.iconplus.smartproc.model.projection.MenusPermissionView;
import com.iconplus.smartproc.model.request.LoginRequest;
import com.iconplus.smartproc.model.response.LoginResponse;
import com.iconplus.smartproc.model.response.MenusPermissionResponse;
import com.iconplus.smartproc.model.token.TokenContent;
import com.iconplus.smartproc.repository.MenusRepository;
import com.iconplus.smartproc.repository.PermissionRepository;
import com.iconplus.smartproc.repository.UsersRepository;
import com.iconplus.smartproc.service.CommonService;
import com.iconplus.smartproc.util.Constants;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@Service
@Slf4j
public class LoginService implements BaseService<LoginRequest, LoginResponse> {
@Value("${jwt.expired-time.access-token:15}")
private Integer accessTokenExp;
@Value("${jwt.expired-time.refresh-token:60}")
private Integer refreshTokenExp;
private final UsersRepository usersRepository;
private final JwtTokenUtil jwtTokenUtil;
private final CommonService commonService;
private final MenusRepository menusRepository;
private final PermissionRepository permissionRepository;
public LoginService(UsersRepository userRepository,
JwtTokenUtil jwtTokenUtil,
CommonService commonService,
MenusRepository menusRepository,
PermissionRepository permissionRepository) {
this.usersRepository = userRepository;
this.jwtTokenUtil = jwtTokenUtil;
this.commonService = commonService;
this.menusRepository = menusRepository;
this.permissionRepository = permissionRepository;
}
@Transactional
@Override
public LoginResponse execute(LoginRequest input) {
var userRoleView= usersRepository.getByUsernameOrEmail(input.getEmail())
.orElseThrow(() -> new BusinessException(HttpStatus.CONFLICT,
Constants.ERR_CODE_10003,
Constants.ERR_TTL_10003,
String.format(Constants.ERR_MSG_10003, input.getEmail())));
String password = commonService.getPassword(input.getPassword());
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
boolean isValidPassword = bCryptPasswordEncoder.matches(password, userRoleView.getPassword());
if (!isValidPassword) {
throw new BusinessException(HttpStatus.CONFLICT,
Constants.ERR_CODE_10004,
Constants.ERR_TTL_10004,
Constants.ERR_MSG_10004);
}
Set<String> accessMenu = new HashSet<>();
List<MenusPermissionResponse> menusPermissionResponseList = new ArrayList<>();
var listMenusPermission = permissionRepository.getListMenusPermission(userRoleView.getRoleId());
for (MenusPermissionView menusPermissionView : listMenusPermission) {
if (BooleanUtils.isTrue(menusPermissionView.getCanView()) ||
BooleanUtils.isTrue(menusPermissionView.getCanCreate()) ||
BooleanUtils.isTrue(menusPermissionView.getCanUpdate()) ||
BooleanUtils.isTrue(menusPermissionView.getCanDelete()) ||
BooleanUtils.isTrue(menusPermissionView.getCanRead())) {
accessMenu.add(menusPermissionView.getNama());
}
MenusPermissionResponse menusPermissionResponse = MenusPermissionResponse.builder()
.id(menusPermissionView.getId())
.nama(menusPermissionView.getNama())
.parentId(menusPermissionView.getParentId())
.urutan(menusPermissionView.getUrutan())
.icon(menusPermissionView.getIcon())
.link(menusPermissionView.getLink())
.canView(menusPermissionView.getCanView())
.canRead(menusPermissionView.getCanRead())
.canCreate(menusPermissionView.getCanCreate())
.canUpdate(menusPermissionView.getCanUpdate())
.canDelete(menusPermissionView.getCanDelete())
.build();
menusPermissionResponseList.add(menusPermissionResponse);
}
var tokenContent = TokenContent.builder()
.userId(userRoleView.getId())
.username(userRoleView.getUsername())
.nama(userRoleView.getNama())
.roleId(userRoleView.getRoleId())
.role(userRoleView.getRole())
.instansiId(userRoleView.getInstansiId())
.instansi(userRoleView.getInstansi())
.bidangId(userRoleView.getBidangId())
.bidang(userRoleView.getBidang())
.jabatanId(userRoleView.getJabatanId())
.jabatan(userRoleView.getJabatan())
.accessMenu(accessMenu)
.build();
Map<String, Object> claims = new HashMap<>();
claims.put("userId", userRoleView.getId());
final String accessToken = jwtTokenUtil.generateToken(String.valueOf(userRoleView.getId()), tokenContent, accessTokenExp * 60000);
String refreshToken = jwtTokenUtil.doGenerateToken(claims, String.valueOf(userRoleView.getId()), refreshTokenExp * 60000);
if (StringUtils.isBlank(accessToken) || StringUtils.isBlank(refreshToken)) {
log.error("token null");
throw new BusinessException(Constants.ERR_CODE_10008,
Constants.ERR_TTL_10008,
Constants.ERR_MSG_10008);
}
commonService.saveUserToken(TokenManagement.builder()
.userId(userRoleView.getId())
.accessToken(accessToken)
.refreshToken(refreshToken)
.build(), accessTokenExp);
return LoginResponse.builder()
.accessToken(accessToken)
.validity(accessTokenExp * 60)
.refreshToken(refreshToken)
.userId(userRoleView.getId())
.username(userRoleView.getUsername())
.email(userRoleView.getEmail())
.roleId(userRoleView.getRoleId())
.role(userRoleView.getRole())
.menus(menusPermissionResponseList)
.build();
}
}