User Fixed

FMFI-PRE-PRODUCTION-2026
Wasiullah Khan Jadoon 1 month ago
parent 83a8ef6a21
commit bbdc59c302

@ -1,5 +1,6 @@
package com.mfsys.aconnect.security.controller; package com.mfsys.aconnect.security.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.mfsys.aconnect.security.constant.SecurityURI; import com.mfsys.aconnect.security.constant.SecurityURI;
import com.mfsys.aconnect.security.dto.ChangePasswordDTO; import com.mfsys.aconnect.security.dto.ChangePasswordDTO;
import com.mfsys.aconnect.security.dto.LoginRequest; import com.mfsys.aconnect.security.dto.LoginRequest;
@ -12,10 +13,8 @@ import com.mfsys.aconnect.usermanagement.service.UserService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -56,7 +55,7 @@ public class AuthenticationController {
} }
@PostMapping(SecurityURI.FIRST_LOGIN) @PostMapping(SecurityURI.FIRST_LOGIN)
public ResponseEntity<Map<String, String>> firstLogin(@RequestBody ChangePasswordDTO request) { public ResponseEntity<Map<String, String>> firstLogin(@RequestBody ChangePasswordDTO request) throws JsonProcessingException {
String message = userService.firstLogin(request); String message = userService.firstLogin(request);
Map<String, String> response = new HashMap<>(); Map<String, String> response = new HashMap<>();
response.put("message", message); response.put("message", message);

@ -1,5 +1,8 @@
package com.mfsys.aconnect.usermanagement.service; package com.mfsys.aconnect.usermanagement.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mfsys.aconnect.configuration.config.WebClientConfig;
import com.mfsys.aconnect.security.dto.ChangePasswordDTO; import com.mfsys.aconnect.security.dto.ChangePasswordDTO;
import com.mfsys.aconnect.security.dto.ResetPasswordDTO; import com.mfsys.aconnect.security.dto.ResetPasswordDTO;
import com.mfsys.aconnect.usermanagement.exceptions.EmailAlreadyExistException; import com.mfsys.aconnect.usermanagement.exceptions.EmailAlreadyExistException;
@ -11,21 +14,35 @@ import com.mfsys.aconnect.usermanagement.dto.UserDTOs;
import com.mfsys.aconnect.usermanagement.model.User; import com.mfsys.aconnect.usermanagement.model.User;
import com.mfsys.aconnect.usermanagement.repository.UserRepository; import com.mfsys.aconnect.usermanagement.repository.UserRepository;
import jakarta.persistence.EntityNotFoundException; import jakarta.persistence.EntityNotFoundException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.http.HttpHeaders;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
public class UserService { public class UserService {
@Value("${app.security.uri}")
private String securityURI;
private final UserRepository userRepository; private final UserRepository userRepository;
private final PasswordEncryptionService passwordEncryptionService; private final PasswordEncryptionService passwordEncryptionService;
private final WebClientConfig webClientConfig;
private final ObjectMapper objectMapper;
public UserService(UserRepository userRepository, PasswordEncryptionService passwordEncryptionService) { public UserService(UserRepository userRepository, PasswordEncryptionService passwordEncryptionService, WebClientConfig webClientConfig,
ObjectMapper objectMapper) {
this.userRepository = userRepository; this.userRepository = userRepository;
this.passwordEncryptionService = passwordEncryptionService; this.passwordEncryptionService = passwordEncryptionService;
this.webClientConfig = webClientConfig;
this.objectMapper = objectMapper;
} }
@Transactional @Transactional
@ -65,20 +82,61 @@ public class UserService {
} }
@Transactional @Transactional
public String firstLogin(ChangePasswordDTO request) { public String firstLogin(ChangePasswordDTO request) throws JsonProcessingException {
String url = securityURI + "/security/thirdparty/user/changePassword";
User user = userRepository.findById(request.getUserId()) User user = userRepository.findById(request.getUserId())
.orElseThrow(() -> new EntityNotFoundException("User not found with ID: " + request.getUserId())); .orElseThrow(() -> new EntityNotFoundException(
"User not found with ID: " + request.getUserId()));
boolean isPasswordValid = PasswordEncryptionService.verifyPassword(
request.getOldPassword(), user.getPassword());
boolean isPasswordValid = PasswordEncryptionService.verifyPassword(request.getOldPassword(), user.getPassword());
if (!isPasswordValid) { if (!isPasswordValid) {
throw new OldPasswordNotMatch(request.getPorOrgacode()); throw new OldPasswordNotMatch(request.getPorOrgacode());
} }
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("sus_usercode", request.getUserId());
headers.set("por_orgacode", request.getPorOrgacode());
// Build $set payload
Map<String, Object> setPayload = new HashMap<>();
setPayload.put("SUS_USERCODE", user.getUserId());
setPayload.put("SUS_PASSWORD", request.getNewPassword());
setPayload.put("OLD_PASSWORD", request.getOldPassword());
setPayload.put("POR_ORGACODE", user.getPorOrgacode());
// Build main payload
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("formId", "SH_SM_US_USER"); // your form ID
requestBody.put("porOrgacode", user.getPorOrgacode());
requestBody.put("set", objectMapper.writeValueAsString(setPayload));
requestBody.put("filter", buildFilter(user.getPorOrgacode(), user.getUserId()));
ResponseEntity<Object> ciihiveResponse =
webClientConfig.patch(url, requestBody, headers);
if (!ciihiveResponse.getStatusCode().is2xxSuccessful()) {
throw new RuntimeException("Failed to update password in ciihive: " + ciihiveResponse.getBody());
}
// Update local DB
user.setPassword(passwordEncryptionService.hashPassword(request.getNewPassword())); user.setPassword(passwordEncryptionService.hashPassword(request.getNewPassword()));
user.setFirstLogin(false); user.setFirstLogin(false);
userRepository.save(user); userRepository.save(user);
return "Password changed successfully"; return "Password changed successfully";
} }
private String buildFilter(String porOrgacode, String userId) {
return "{ \"$and\": [ " +
"{ \"SUS_USERCODE\": { \"$eq\": \"" + userId + "\" } }, " +
"{ \"POR_ORGACODE\": { \"$eq\": \"" + porOrgacode + "\" } } ] }";
}
@Transactional @Transactional
public String resetPassword(ResetPasswordDTO request) { public String resetPassword(ResetPasswordDTO request) {
User user = userRepository.findById(request.getUserId()) User user = userRepository.findById(request.getUserId())

Loading…
Cancel
Save