From f749b719cfd1d6a15728fc60e99dbb1de08f84a4 Mon Sep 17 00:00:00 2001 From: Ramadurai Pandian Date: Sun, 19 Jan 2020 10:18:00 +0530 Subject: [PATCH 1/2] MOS-30861 Registerdevice error code space removed --- .../kernel/masterdata/constant/RegisteredDeviceErrorCode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/constant/RegisteredDeviceErrorCode.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/constant/RegisteredDeviceErrorCode.java index 5fd283788b0..fca38ec87bc 100644 --- a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/constant/RegisteredDeviceErrorCode.java +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/constant/RegisteredDeviceErrorCode.java @@ -4,7 +4,7 @@ public enum RegisteredDeviceErrorCode { DEVICE_PROVIDER_NOT_EXIST("ADM-DPM-032","Device Provider ID/Name does not exist in the list of Registered Device Providers"), - REGISTERED_DEVICE_INSERTION_EXCEPTION(" ADM-DPM-035","Error occurred while storing Registered Device Details"), + REGISTERED_DEVICE_INSERTION_EXCEPTION("ADM-DPM-035","Error occurred while storing Registered Device Details"), SERIALNUM_NOT_EXIST("ADM-DPM-042","%s Cannot register device as it is not a white-listed device"), STATUS_CODE_VALIDATION_EXCEPTION("ADM-DPM-028", "Error occured while validating Status Code"), TYPE_VALIDATION_EXCEPTION("KER-DPM-sss", "Error occured while validating Type Value"), From d3d1d06bdc469c6fbf53bc4d13b55828c15f3d4a Mon Sep 17 00:00:00 2001 From: Ramadurai Pandian Date: Sun, 19 Jan 2020 13:52:53 +0530 Subject: [PATCH 2/2] MOS-30861_Feature Signed Register device --- .../RegisteredDeviceController.java | 186 ++- .../dto/registerdevice/DeviceData.java | 23 + .../dto/registerdevice/DeviceInfo.java | 33 + .../dto/registerdevice/DeviceResponse.java | 16 + .../dto/registerdevice/DigitalId.java | 70 + .../dto/registerdevice/HeaderRequest.java | 19 + .../RegisterDeviceResponse.java | 29 + .../RegisteredDevicePostDto.java | 11 + .../dto/registerdevice/SignRequestDto.java | 16 + .../dto/registerdevice/SignResponseDto.java | 32 + .../registerdevice/SignatureRequestDto.java | 39 + .../registerdevice/SignatureResponseDto.java | 31 + .../service/RegisteredDeviceService.java | 85 +- .../impl/RegisteredDeviceServiceImpl.java | 693 +++++---- .../kernel/masterdata/utils/MapperUtils.java | 1286 +++++++++-------- .../resources/application-local.properties | 4 + .../MasterdataIntegrationTest.java | 223 ++- .../src/test/resources/application.properties | 3 + 18 files changed, 1618 insertions(+), 1181 deletions(-) create mode 100644 kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceData.java create mode 100644 kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceInfo.java create mode 100644 kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceResponse.java create mode 100644 kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DigitalId.java create mode 100644 kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/HeaderRequest.java create mode 100644 kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/RegisterDeviceResponse.java create mode 100644 kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/RegisteredDevicePostDto.java create mode 100644 kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignRequestDto.java create mode 100644 kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignResponseDto.java create mode 100644 kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignatureRequestDto.java create mode 100644 kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignatureResponseDto.java diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/controller/RegisteredDeviceController.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/controller/RegisteredDeviceController.java index 05c0ce92f55..78b5688cd57 100644 --- a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/controller/RegisteredDeviceController.java +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/controller/RegisteredDeviceController.java @@ -1,97 +1,89 @@ -package io.mosip.kernel.masterdata.controller; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import io.mosip.kernel.core.http.RequestWrapper; -import io.mosip.kernel.core.http.ResponseFilter; -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.kernel.masterdata.dto.DeviceDeRegisterResponse; -import io.mosip.kernel.masterdata.dto.DeviceRegisterResponseDto; -import io.mosip.kernel.masterdata.dto.EncodedRegisteredDeviceResponse; -import io.mosip.kernel.masterdata.dto.RegisteredDevicePostReqDto; -import io.mosip.kernel.masterdata.dto.getresponse.ResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.extn.RegisteredDeviceExtnDto; -import io.mosip.kernel.masterdata.service.RegisteredDeviceService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; - -/** - * Controller for CURD operation on Registered Device Details - * - * @author Megha Tanga - * @since 1.0.0 - * - */ -@RestController -@RequestMapping(value = "/registereddevices") -@Api(tags = { "Registered Device" }) -public class RegisteredDeviceController { - - @Autowired - RegisteredDeviceService registeredDeviceService; - - /** - * Api to Register Device. - * - * @param registeredDevicePostReqDto - * the request DTO. - * @return response - */ - - @ResponseFilter - @PreAuthorize("hasAnyRole('ZONAL_ADMIN')") - @PostMapping - @ApiOperation(value = "Service to save Registered Device", notes = "Saves Registered Device Detail and return Registered Device") - @ApiResponses({ @ApiResponse(code = 201, message = "When Registered Device successfully created"), - @ApiResponse(code = 400, message = "When Request body passed is null or invalid"), - @ApiResponse(code = 404, message = "When No Registered Device found"), - @ApiResponse(code = 500, message = "While creating Registered Device any error occured") }) - public ResponseWrapper createRegisteredDevice( - @Valid @RequestBody RequestWrapper registeredDevicePostReqDto) { - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponse(registeredDeviceService.createRegisteredDevice(registeredDevicePostReqDto.getRequest())); - return response; - } - - /** - * Api to de-register Device. - * - * @param request - * the request DTO. - * @return the {@link DeviceRegisterResponseDto}. - */ - @PreAuthorize("hasAnyRole('ZONAL_ADMIN')") - @ApiOperation(value = "DeRegister Device") - @DeleteMapping("/deregister/{deviceCode}") - @ResponseFilter - public ResponseWrapper deRegisterDevice(@Valid @PathVariable String deviceCode) { - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponse(registeredDeviceService.deRegisterDevice(deviceCode)); - return response; - } - - @PreAuthorize("hasAnyRole('ZONAL_ADMIN')") - @ApiOperation(value = "Update status of the devive") - @PutMapping("/update/status") - public ResponseEntity deRegisterDevice(@NotBlank @RequestParam(name="deviceCode",required=true) String deviceCode, - @NotBlank @RequestParam(name="statusCode",required=true) String statusCode) { - return new ResponseEntity<>(registeredDeviceService.updateStatus(deviceCode, statusCode), HttpStatus.OK); - } - -} +package io.mosip.kernel.masterdata.controller; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import io.mosip.kernel.core.http.RequestWrapper; +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.masterdata.dto.DeviceDeRegisterResponse; +import io.mosip.kernel.masterdata.dto.DeviceRegisterResponseDto; +import io.mosip.kernel.masterdata.dto.getresponse.ResponseDto; +import io.mosip.kernel.masterdata.dto.registerdevice.RegisteredDevicePostDto; +import io.mosip.kernel.masterdata.service.RegisteredDeviceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +/** + * Controller for CURD operation on Registered Device Details + * + * @author Megha Tanga + * @since 1.0.0 + * + */ +@RestController +@RequestMapping(value = "/registereddevices") +@Api(tags = { "Registered Device" }) +public class RegisteredDeviceController { + + @Autowired + RegisteredDeviceService registeredDeviceService; + + + /** + * Api to Register Device. + * + * Digitally signed device + * + * @param registeredDevicePostDto + * @return ResponseWrapper + */ + @ResponseFilter + @PreAuthorize("hasAnyRole('ZONAL_ADMIN')") + @PostMapping + public ResponseWrapper signedRegisteredDevice( + @Valid @RequestBody RequestWrapper registeredDevicePostDto) { + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponse(registeredDeviceService.signedRegisteredDevice(registeredDevicePostDto.getRequest())); + return response; + } + + /** + * Api to de-register Device. + * + * @param request + * the request DTO. + * @return the {@link DeviceRegisterResponseDto}. + */ + @PreAuthorize("hasAnyRole('ZONAL_ADMIN')") + @ApiOperation(value = "DeRegister Device") + @DeleteMapping("/deregister/{deviceCode}") + @ResponseFilter + public ResponseWrapper deRegisterDevice(@Valid @PathVariable String deviceCode) { + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponse(registeredDeviceService.deRegisterDevice(deviceCode)); + return response; + } + + @PreAuthorize("hasAnyRole('ZONAL_ADMIN')") + @ApiOperation(value = "Update status of the devive") + @PutMapping("/update/status") + public ResponseEntity deRegisterDevice(@NotBlank @RequestParam(name="deviceCode",required=true) String deviceCode, + @NotBlank @RequestParam(name="statusCode",required=true) String statusCode) { + return new ResponseEntity<>(registeredDeviceService.updateStatus(deviceCode, statusCode), HttpStatus.OK); + } + +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceData.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceData.java new file mode 100644 index 00000000000..a7a1809a87f --- /dev/null +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceData.java @@ -0,0 +1,23 @@ +/** + * + */ +package io.mosip.kernel.masterdata.dto.registerdevice; + +import lombok.Data; + +/** + * @author Ramadurai Pandian + * + */ +@Data +public class DeviceData { + + private String deviceId; + + private String purpose; + + private DeviceInfo deviceInfo; + + private String foundationalTrustProviderId; + +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceInfo.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceInfo.java new file mode 100644 index 00000000000..68214d0f566 --- /dev/null +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceInfo.java @@ -0,0 +1,33 @@ +/** + * + */ +package io.mosip.kernel.masterdata.dto.registerdevice; + +import java.time.LocalDateTime; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + +/** + * @author Ramadurai Pandian + * + */ +@Data +public class DeviceInfo { + + private String deviceSubId; + + private String certification; + + private String digitalId; + + private String firmware; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + private LocalDateTime deviceExpiry; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + private LocalDateTime timeStamp; + +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceResponse.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceResponse.java new file mode 100644 index 00000000000..c44456cc9d1 --- /dev/null +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DeviceResponse.java @@ -0,0 +1,16 @@ +/** + * + */ +package io.mosip.kernel.masterdata.dto.registerdevice; + +import lombok.Data; + +/** + * @author Ramadurai Pandian + * + */ +@Data +public class DeviceResponse { + + private String response; +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DigitalId.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DigitalId.java new file mode 100644 index 00000000000..e3b470daa34 --- /dev/null +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/DigitalId.java @@ -0,0 +1,70 @@ +/** + * + */ +package io.mosip.kernel.masterdata.dto.registerdevice; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author Ramadurai Pandian + * + */ +@Data +public class DigitalId { + + /** The serial no. */ + @NotBlank + @Size(min = 0, max = 64) + @ApiModelProperty(value = "serialNumber", required = true, dataType = "java.lang.String") + private String serialNo; + + /** The Device Provider Name. */ + @NotBlank + @Size(min = 0, max = 128) + @ApiModelProperty(value = "providerName", required = true, dataType = "java.lang.String") + private String deviceProvider; + + /** The Device Provider id. */ + @NotBlank + @Size(min = 0, max = 36) + @ApiModelProperty(value = "providerId", required = true, dataType = "java.lang.String") + private String deviceProviderId; + + /** The make. */ + @NotBlank + @Size(min = 0, max = 36) + @ApiModelProperty(value = "make", required = true, dataType = "java.lang.String") + private String make; + + /** The model. */ + @NotBlank + @Size(min = 0, max = 36) + @ApiModelProperty(value = "model", required = true, dataType = "java.lang.String") + private String model; + + /** The date time. */ + private String dateTime; + + /** + * Field for deviceTypeCode + */ + @NotBlank + @Size(min = 0, max = 36) + @ApiModelProperty(value = "type", required = true, dataType = "java.lang.String") + private String type; + + /** + * Field for deviceSubTypeCode + */ + @NotBlank + @Size(min = 1, max = 36) + @ApiModelProperty(value = "subType", required = true, dataType = "java.lang.String") + private String subType; + + + +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/HeaderRequest.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/HeaderRequest.java new file mode 100644 index 00000000000..ea9974bab7c --- /dev/null +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/HeaderRequest.java @@ -0,0 +1,19 @@ +/** + * + */ +package io.mosip.kernel.masterdata.dto.registerdevice; + +import lombok.Data; + +/** + * @author Ramadurai Pandian + * + */ +@Data +public class HeaderRequest { + + private String alg; + + private String type; + +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/RegisterDeviceResponse.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/RegisterDeviceResponse.java new file mode 100644 index 00000000000..77c71a10ee9 --- /dev/null +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/RegisterDeviceResponse.java @@ -0,0 +1,29 @@ +/** + * + */ +package io.mosip.kernel.masterdata.dto.registerdevice; + +import java.time.LocalDateTime; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + +/** + * @author Ramadurai Pandian + * + */ +@Data +public class RegisterDeviceResponse { + + private String status; + + private String digitalId; + + private String deviceCode; + + private String env; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + private LocalDateTime timeStamp; +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/RegisteredDevicePostDto.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/RegisteredDevicePostDto.java new file mode 100644 index 00000000000..1bd2f5e1f30 --- /dev/null +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/RegisteredDevicePostDto.java @@ -0,0 +1,11 @@ +package io.mosip.kernel.masterdata.dto.registerdevice; + +import lombok.Data; + +@Data +public class RegisteredDevicePostDto { + + private String deviceData; + + +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignRequestDto.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignRequestDto.java new file mode 100644 index 00000000000..8c1707ed411 --- /dev/null +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignRequestDto.java @@ -0,0 +1,16 @@ +package io.mosip.kernel.masterdata.dto.registerdevice; + +import javax.validation.constraints.NotBlank; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SignRequestDto { + @NotBlank + private String data; + +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignResponseDto.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignResponseDto.java new file mode 100644 index 00000000000..e2fd040ca67 --- /dev/null +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignResponseDto.java @@ -0,0 +1,32 @@ +package io.mosip.kernel.masterdata.dto.registerdevice; + +import java.time.LocalDateTime; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * + * @author Srinivasan + * @since 1.0.0 + * + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SignResponseDto { + + /** + * encrypted data + */ + private String signature; + + /** + * response time. + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + private LocalDateTime timestamp; +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignatureRequestDto.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignatureRequestDto.java new file mode 100644 index 00000000000..02690c808c5 --- /dev/null +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignatureRequestDto.java @@ -0,0 +1,39 @@ +/* + * + * + * + * + */ +package io.mosip.kernel.masterdata.dto.registerdevice; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Crypto-Manager-Request model + * + * @author Urvil Joshi + * + * @since 1.0.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SignatureRequestDto { + + private String applicationId; + /** + * Refrence Id + */ + private String referenceId; + /** + * Timestamp + */ + private String timeStamp; + /** + * Data in BASE64 encoding to encrypt/decrypt + */ + private String data; + +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignatureResponseDto.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignatureResponseDto.java new file mode 100644 index 00000000000..ad3fa0c3778 --- /dev/null +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/dto/registerdevice/SignatureResponseDto.java @@ -0,0 +1,31 @@ +/* + * + * + * + * + */ +package io.mosip.kernel.masterdata.dto.registerdevice; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Crypto-Manager-Response model + * + * @author Urvil Joshi + * + * @since 1.0.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SignatureResponseDto { + /** + * Data Encrypted/Decrypted in BASE64 encoding + */ + private String data; + +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/RegisteredDeviceService.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/RegisteredDeviceService.java index 31d8b038fdb..af7add612e1 100644 --- a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/RegisteredDeviceService.java +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/RegisteredDeviceService.java @@ -1,32 +1,53 @@ -package io.mosip.kernel.masterdata.service; - -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; - -import io.mosip.kernel.masterdata.dto.DeviceDeRegisterResponse; -import io.mosip.kernel.masterdata.dto.EncodedRegisteredDeviceResponse; -import io.mosip.kernel.masterdata.dto.RegisteredDevicePostReqDto; -import io.mosip.kernel.masterdata.dto.getresponse.ResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.extn.RegisteredDeviceExtnDto; - -/** - * - * @author Megha Tanga - * - */ -public interface RegisteredDeviceService { - - /** - * Method to create Registered Device Provider - * - * @param dto - * Regisetered Device Provider Dto from user - * @return RegisteredDeviceExtnDto Registered device Dto which has created - */ - public RegisteredDeviceExtnDto createRegisteredDevice(RegisteredDevicePostReqDto dto); - - public DeviceDeRegisterResponse deRegisterDevice(@Valid String deviceCode); - - public ResponseDto updateStatus(@NotBlank String deviceCode, @NotBlank String statusCode); - -} +package io.mosip.kernel.masterdata.service; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; + +import io.mosip.kernel.masterdata.dto.DeviceDeRegisterResponse; +import io.mosip.kernel.masterdata.dto.EncodedRegisteredDeviceResponse; +import io.mosip.kernel.masterdata.dto.RegisteredDevicePostReqDto; +import io.mosip.kernel.masterdata.dto.getresponse.ResponseDto; +import io.mosip.kernel.masterdata.dto.getresponse.extn.RegisteredDeviceExtnDto; +import io.mosip.kernel.masterdata.dto.registerdevice.RegisteredDevicePostDto; + +/** + * + * @author Megha Tanga + * + */ +public interface RegisteredDeviceService { + + /** + * Method to create Registered Device Provider + * + * @param dto + * Regisetered Device Provider Dto from user + * @return RegisteredDeviceExtnDto Registered device Dto which has created + */ + //public RegisteredDeviceExtnDto createRegisteredDevice(RegisteredDevicePostReqDto dto); + + /** + * Method to De-Register a device + * + * @param deviceCode + * @return DeviceDeRegisterResponse + */ + public DeviceDeRegisterResponse deRegisterDevice(@Valid String deviceCode); + + /** + * Method to update status of a device + * + * @param deviceCode + * @param statusCode + * @return ResponseDto + */ + public ResponseDto updateStatus(@NotBlank String deviceCode, @NotBlank String statusCode); + + /** + * Method to create a signed Register device + * @param registeredDevicePostDto + * @return String + */ + public String signedRegisteredDevice(RegisteredDevicePostDto registeredDevicePostDto); + +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/impl/RegisteredDeviceServiceImpl.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/impl/RegisteredDeviceServiceImpl.java index 3d2fa428d55..f2c2cb0ecf5 100644 --- a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/impl/RegisteredDeviceServiceImpl.java +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/service/impl/RegisteredDeviceServiceImpl.java @@ -1,302 +1,391 @@ -package io.mosip.kernel.masterdata.service.impl; - -import java.io.IOException; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; - -import javax.transaction.Transactional; -import javax.validation.Valid; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DataAccessException; -import org.springframework.stereotype.Service; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.mosip.kernel.core.dataaccess.exception.DataAccessLayerException; -import io.mosip.kernel.core.util.CryptoUtil; -import io.mosip.kernel.masterdata.constant.DeviceRegisterErrorCode; -import io.mosip.kernel.masterdata.constant.MasterDataConstant; -import io.mosip.kernel.masterdata.constant.RegisteredDeviceErrorCode; -import io.mosip.kernel.masterdata.dto.DeviceDeRegisterResponse; -import io.mosip.kernel.masterdata.dto.DigitalIdDeviceRegisterDto; -import io.mosip.kernel.masterdata.dto.DigitalIdDto; -import io.mosip.kernel.masterdata.dto.EncodedRegisteredDeviceResponse; -import io.mosip.kernel.masterdata.dto.RegisteredDevicePostReqDto; -import io.mosip.kernel.masterdata.dto.getresponse.ResponseDto; -import io.mosip.kernel.masterdata.dto.getresponse.extn.RegisteredDeviceExtnDto; -import io.mosip.kernel.masterdata.entity.Device; -import io.mosip.kernel.masterdata.entity.DeviceProvider; -import io.mosip.kernel.masterdata.entity.RegisteredDevice; -import io.mosip.kernel.masterdata.entity.RegisteredDeviceHistory; -import io.mosip.kernel.masterdata.exception.DataNotFoundException; -import io.mosip.kernel.masterdata.exception.DeviceRegisterException; -import io.mosip.kernel.masterdata.exception.MasterDataServiceException; -import io.mosip.kernel.masterdata.exception.RequestException; -import io.mosip.kernel.masterdata.repository.DeviceProviderRepository; -import io.mosip.kernel.masterdata.repository.DeviceRepository; -import io.mosip.kernel.masterdata.repository.RegisteredDeviceHistoryRepository; -import io.mosip.kernel.masterdata.repository.RegisteredDeviceRepository; -import io.mosip.kernel.masterdata.repository.RegistrationDeviceSubTypeRepository; -import io.mosip.kernel.masterdata.repository.RegistrationDeviceTypeRepository; -import io.mosip.kernel.masterdata.service.RegisteredDeviceService; -import io.mosip.kernel.masterdata.utils.ExceptionUtils; -import io.mosip.kernel.masterdata.utils.MapperUtils; -import io.mosip.kernel.masterdata.utils.MetaDataUtils; -import io.mosip.kernel.masterdata.validator.registereddevice.RegisteredDeviceConstant; - -/** - * Service Class for Create RegisteredDevice - * - * @author Megha Tanga - * - */ - -@Service -public class RegisteredDeviceServiceImpl implements RegisteredDeviceService { - - @Autowired - RegisteredDeviceRepository registeredDeviceRepository; - - @Autowired - RegisteredDeviceHistoryRepository registeredDeviceHistoryRepo; - - @Autowired - DeviceProviderRepository deviceProviderRepository; - - @Autowired - RegistrationDeviceTypeRepository registrationDeviceTypeRepository; - - @Autowired - RegistrationDeviceSubTypeRepository registrationDeviceSubTypeRepository; - - @Autowired - ObjectMapper mapper; - - @Autowired - DeviceRepository deviceRepository; - - /** The registered. */ - private static String REGISTERED = "Registered"; - - /** The revoked. */ - private static String REVOKED = "Revoked"; - - /** The retired. */ - private static String RETIRED = "Retired"; - - /* - * (non-Javadoc) - * - * @see io.mosip.kernel.masterdata.service.RegisteredDeviceService# - * createRegisteredDevice(io.mosip.kernel.masterdata.dto. - * RegisteredDevicePostReqDto) - */ - @Transactional - @Override - public RegisteredDeviceExtnDto createRegisteredDevice(RegisteredDevicePostReqDto dto) { - RegisteredDevice entity = null; - RegisteredDevice mapEntity = null; - RegisteredDevice crtRegisteredDevice = null; - RegisteredDeviceExtnDto renRegisteredDeviceExtnDto = null; - EncodedRegisteredDeviceResponse encodedRegisteredDeviceResponse = new EncodedRegisteredDeviceResponse(); - DigitalIdDto digitalIdDto = null; - DigitalIdDeviceRegisterDto digitalIdDeviceRegisterDto=null; - String digitalIdJson; - String ecodedRegisteredDeviceExtnDto; - String strRegisteredDeviceExtnDto; - try { - DeviceProvider deviceProvider = deviceProviderRepository - .findByIdAndNameAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(dto.getDigitalIdDto().getDpId(), - dto.getDigitalIdDto().getDp()); - if (deviceProvider == null) { - throw new RequestException(RegisteredDeviceErrorCode.DEVICE_PROVIDER_NOT_EXIST.getErrorCode(), - RegisteredDeviceErrorCode.DEVICE_PROVIDER_NOT_EXIST.getErrorMessage()); - } - - if (registrationDeviceTypeRepository.findByCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue( - dto.getDigitalIdDto().getDeviceTypeCode()) == null) { - throw new RequestException(RegisteredDeviceErrorCode.DEVICE_TYPE_NOT_EXIST.getErrorCode(), - String.format(RegisteredDeviceErrorCode.DEVICE_TYPE_NOT_EXIST.getErrorMessage(), - dto.getDigitalIdDto().getDeviceTypeCode())); - } - - if (registrationDeviceSubTypeRepository.findByCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue( - dto.getDigitalIdDto().getDeviceSTypeCode()) == null) { - throw new RequestException(RegisteredDeviceErrorCode.DEVICE_SUB_TYPE_NOT_EXIST.getErrorCode(), - String.format(RegisteredDeviceErrorCode.DEVICE_SUB_TYPE_NOT_EXIST.getErrorMessage(), - dto.getDigitalIdDto().getDeviceSTypeCode())); - } - - digitalIdJson = mapper.writeValueAsString(dto.getDigitalIdDto()); - mapEntity = MapperUtils.mapRegisteredDeviceDto(dto, digitalIdJson); - entity = MetaDataUtils.setCreateMetaData(mapEntity, RegisteredDevice.class); - entity.setCode(generateCodeValue(dto)); - entity.setIsActive(true); - crtRegisteredDevice = registeredDeviceRepository.create(entity); - - // add new row to the history table - RegisteredDeviceHistory entityHistory = new RegisteredDeviceHistory(); - MapperUtils.map(crtRegisteredDevice, entityHistory); - MapperUtils.setBaseFieldValue(crtRegisteredDevice, entityHistory); - entityHistory.setDigitalId(digitalIdJson); - entityHistory.setEffectivetimes(crtRegisteredDevice.getCreatedDateTime()); - entityHistory.setCreatedDateTime(crtRegisteredDevice.getCreatedDateTime()); - registeredDeviceHistoryRepo.create(entityHistory); - - digitalIdDeviceRegisterDto = mapper.readValue(digitalIdJson, DigitalIdDeviceRegisterDto.class); - - renRegisteredDeviceExtnDto = MapperUtils.map(crtRegisteredDevice, RegisteredDeviceExtnDto.class); - renRegisteredDeviceExtnDto.setDigitalIdDto(digitalIdDeviceRegisterDto); - // DTO to String - strRegisteredDeviceExtnDto = mapper.writeValueAsString(renRegisteredDeviceExtnDto); - //ecodedRegisteredDeviceExtnDto = CryptoUtil.encodeBase64(strRegisteredDeviceExtnDto.getBytes()); - - //encodedRegisteredDeviceResponse.setEnocodedResponse(ecodedRegisteredDeviceExtnDto); - - } catch (DataAccessLayerException | DataAccessException | IOException ex) { - throw new MasterDataServiceException( - RegisteredDeviceErrorCode.REGISTERED_DEVICE_INSERTION_EXCEPTION.getErrorCode(), - RegisteredDeviceErrorCode.REGISTERED_DEVICE_INSERTION_EXCEPTION.getErrorMessage() + " " - + ExceptionUtils.parseException(ex)); - } - - return renRegisteredDeviceExtnDto; - } - - // check the value of purpose and Serial Num, based on this generate the code - // value - private String generateCodeValue(RegisteredDevicePostReqDto dto) { - String code = ""; - if (dto.getPurpose().equalsIgnoreCase(RegisteredDeviceConstant.REGISTRATION)) { - List device = deviceRepository.findDeviceBySerialNumberAndIsDeletedFalseorIsDeletedIsNullNoIsActive( - dto.getDigitalIdDto().getSerialNo()); - if (device.isEmpty()) { - throw new RequestException(RegisteredDeviceErrorCode.SERIALNUM_NOT_EXIST.getErrorCode(), - String.format(RegisteredDeviceErrorCode.SERIALNUM_NOT_EXIST.getErrorMessage(), - dto.getDigitalIdDto().getSerialNo())); - } - // copy Device id as code - code = device.get(0).getId(); - } else if (dto.getPurpose().equalsIgnoreCase(RegisteredDeviceConstant.AUTH)) { - // should be uniquely randomly generated - code = UUID.randomUUID().toString(); - } - return code; - } - - @Override - public DeviceDeRegisterResponse deRegisterDevice(@Valid String deviceCode) { - RegisteredDevice deviceRegisterEntity = null; - RegisteredDeviceHistory deviceRegisterHistory = new RegisteredDeviceHistory(); - try { - deviceRegisterEntity = registeredDeviceRepository.findByCodeAndIsActiveIsTrue(deviceCode); - if (deviceRegisterEntity != null) { - if (Arrays.asList(REVOKED, RETIRED).contains(deviceRegisterEntity.getStatusCode())) { - throw new MasterDataServiceException( - DeviceRegisterErrorCode.DEVICE_DE_REGISTERED_ALREADY.getErrorCode(), - DeviceRegisterErrorCode.DEVICE_DE_REGISTERED_ALREADY.getErrorMessage()); - } - deviceRegisterEntity.setStatusCode("Retired"); - deviceRegisterEntity = MetaDataUtils.setUpdateMetaData(deviceRegisterEntity, deviceRegisterEntity, false); - registeredDeviceRepository.update(deviceRegisterEntity); - MapperUtils.map(deviceRegisterEntity, deviceRegisterHistory); - deviceRegisterHistory.setEffectivetimes(deviceRegisterEntity.getUpdatedDateTime()); - registeredDeviceHistoryRepo.create(deviceRegisterHistory); - } else { - - throw new DataNotFoundException( - DeviceRegisterErrorCode.DEVICE_REGISTER_NOT_FOUND_EXCEPTION.getErrorCode(), - DeviceRegisterErrorCode.DEVICE_REGISTER_NOT_FOUND_EXCEPTION.getErrorMessage()); - } - - } catch (DataAccessLayerException | DataAccessException e) { - throw new MasterDataServiceException( - DeviceRegisterErrorCode.DEVICE_REGISTER_DELETED_EXCEPTION.getErrorCode(), - DeviceRegisterErrorCode.DEVICE_REGISTER_DELETED_EXCEPTION.getErrorMessage() + " " - + ExceptionUtils.parseException(e)); - } - DeviceDeRegisterResponse response = new DeviceDeRegisterResponse(); - response.setStatus("success"); - response.setMessage("Device deregistered successfully"); - return response; - } - - @Transactional - @Override - public ResponseDto updateStatus(String deviceCode, String statusCode) { - RegisteredDevice deviceRegister = null; - try { - deviceRegister = registeredDeviceRepository.findByCodeAndIsActiveIsTrue(deviceCode); - } catch (DataAccessException | DataAccessLayerException e) { - throw new MasterDataServiceException(DeviceRegisterErrorCode.DEVICE_REGISTER_FETCH_EXCEPTION.getErrorCode(), - DeviceRegisterErrorCode.DEVICE_REGISTER_FETCH_EXCEPTION.getErrorMessage() + " " - + ExceptionUtils.parseException(e)); - } - - if (deviceRegister == null) { - throw new DataNotFoundException(DeviceRegisterErrorCode.DATA_NOT_FOUND_EXCEPTION.getErrorCode(), - DeviceRegisterErrorCode.DATA_NOT_FOUND_EXCEPTION.getErrorMessage()); - } - if(deviceRegister.getStatusCode().equalsIgnoreCase(statusCode)) { - throw new MasterDataServiceException(DeviceRegisterErrorCode.DEVICE_REGISTERED_STATUS_ALREADY.getErrorCode(), - String.format(DeviceRegisterErrorCode.DEVICE_REGISTERED_STATUS_ALREADY.getErrorMessage(), statusCode)); - - } - - if (!Arrays.asList(REGISTERED, REVOKED, RETIRED).contains(statusCode)) { - throw new RequestException(DeviceRegisterErrorCode.INVALID_STATUS_CODE.getErrorCode(), - DeviceRegisterErrorCode.INVALID_STATUS_CODE.getErrorMessage()); - } - deviceRegister.setStatusCode(statusCode); - updateRegisterDetails(deviceRegister); - createHistoryDetails(deviceRegister); - ResponseDto responseDto = new ResponseDto(); - responseDto.setMessage(MasterDataConstant.DEVICE_REGISTER_UPDATE_MESSAGE); - responseDto.setStatus(MasterDataConstant.SUCCESS); - return responseDto; - } - - /** - * Creates the history details. - * - * @param deviceRegister - * the device register - */ - private void createHistoryDetails(RegisteredDevice deviceRegister) { - RegisteredDeviceHistory deviceRegisterHistory = new RegisteredDeviceHistory(); - MapperUtils.map(deviceRegister, deviceRegisterHistory); - deviceRegisterHistory.setEffectivetimes(LocalDateTime.now(ZoneId.of("UTC"))); - try { - registeredDeviceHistoryRepo.create(deviceRegisterHistory); - } catch (DataAccessException | DataAccessLayerException e) { - throw new MasterDataServiceException( - DeviceRegisterErrorCode.DEVICE_REGISTER_UPDATE_EXCEPTION.getErrorCode(), - DeviceRegisterErrorCode.DEVICE_REGISTER_UPDATE_EXCEPTION.getErrorMessage() + " " - + ExceptionUtils.parseException(e)); - } - - } - - /** - * Update register details. - * - * @param deviceRegister - * the device register - */ - private void updateRegisterDetails(RegisteredDevice deviceRegister) { - try { - deviceRegister = MetaDataUtils.setUpdateMetaData(deviceRegister, deviceRegister, false); - registeredDeviceRepository.update(deviceRegister); - } catch (DataAccessException | DataAccessLayerException e) { - throw new MasterDataServiceException( - DeviceRegisterErrorCode.DEVICE_REGISTER_UPDATE_EXCEPTION.getErrorCode(), - DeviceRegisterErrorCode.DEVICE_REGISTER_UPDATE_EXCEPTION.getErrorMessage() + " " - + ExceptionUtils.parseException(e)); - } - - } -} +package io.mosip.kernel.masterdata.service.impl; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +import javax.transaction.Transactional; +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DataAccessException; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.dataaccess.exception.DataAccessLayerException; +import io.mosip.kernel.core.http.RequestWrapper; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.util.CryptoUtil; +import io.mosip.kernel.masterdata.constant.DeviceRegisterErrorCode; +import io.mosip.kernel.masterdata.constant.MasterDataConstant; +import io.mosip.kernel.masterdata.constant.RegisteredDeviceErrorCode; +import io.mosip.kernel.masterdata.dto.DeviceDeRegisterResponse; +import io.mosip.kernel.masterdata.dto.getresponse.ResponseDto; +import io.mosip.kernel.masterdata.dto.registerdevice.DeviceData; +import io.mosip.kernel.masterdata.dto.registerdevice.DeviceResponse; +import io.mosip.kernel.masterdata.dto.registerdevice.DigitalId; +import io.mosip.kernel.masterdata.dto.registerdevice.HeaderRequest; +import io.mosip.kernel.masterdata.dto.registerdevice.RegisterDeviceResponse; +import io.mosip.kernel.masterdata.dto.registerdevice.RegisteredDevicePostDto; +import io.mosip.kernel.masterdata.dto.registerdevice.SignRequestDto; +import io.mosip.kernel.masterdata.dto.registerdevice.SignResponseDto; +import io.mosip.kernel.masterdata.entity.Device; +import io.mosip.kernel.masterdata.entity.DeviceProvider; +import io.mosip.kernel.masterdata.entity.RegisteredDevice; +import io.mosip.kernel.masterdata.entity.RegisteredDeviceHistory; +import io.mosip.kernel.masterdata.exception.DataNotFoundException; +import io.mosip.kernel.masterdata.exception.MasterDataServiceException; +import io.mosip.kernel.masterdata.exception.RequestException; +import io.mosip.kernel.masterdata.repository.DeviceProviderRepository; +import io.mosip.kernel.masterdata.repository.DeviceRepository; +import io.mosip.kernel.masterdata.repository.RegisteredDeviceHistoryRepository; +import io.mosip.kernel.masterdata.repository.RegisteredDeviceRepository; +import io.mosip.kernel.masterdata.repository.RegistrationDeviceSubTypeRepository; +import io.mosip.kernel.masterdata.repository.RegistrationDeviceTypeRepository; +import io.mosip.kernel.masterdata.service.RegisteredDeviceService; +import io.mosip.kernel.masterdata.utils.ExceptionUtils; +import io.mosip.kernel.masterdata.utils.MapperUtils; +import io.mosip.kernel.masterdata.utils.MetaDataUtils; +import io.mosip.kernel.masterdata.validator.registereddevice.RegisteredDeviceConstant; + +/** + * Service Class for Create RegisteredDevice + * + * @author Megha Tanga + * + */ + +@Service +public class RegisteredDeviceServiceImpl implements RegisteredDeviceService { + + @Autowired + RegisteredDeviceRepository registeredDeviceRepository; + + @Autowired + RegisteredDeviceHistoryRepository registeredDeviceHistoryRepo; + + @Autowired + DeviceProviderRepository deviceProviderRepository; + + @Autowired + RegistrationDeviceTypeRepository registrationDeviceTypeRepository; + + @Autowired + RegistrationDeviceSubTypeRepository registrationDeviceSubTypeRepository; + + @Autowired + ObjectMapper mapper; + + @Autowired + DeviceRepository deviceRepository; + + /** The registered. */ + private static String REGISTERED = "Registered"; + + /** The revoked. */ + private static String REVOKED = "Revoked"; + + /** The retired. */ + private static String RETIRED = "Retired"; + + @Autowired + private RestTemplate restTemplate; + + @Value("${mosip.kernel.sign-url}") + private String signUrl; + + @Value("${spring.profiles.active}") + private String activeProfile; + + @Value("${masterdata.registerdevice.timestamp.validate:+5}") + private String registerDeviceTimeStamp; + + /* (non-Javadoc) + * @see io.mosip.kernel.masterdata.service.RegisteredDeviceService#signedRegisteredDevice(io.mosip.kernel.masterdata.dto.registerdevice.RegisteredDevicePostDto) + */ + @Override + public String signedRegisteredDevice(RegisteredDevicePostDto registeredDevicePostDto) { + RegisteredDevice entity = null; + RegisteredDevice mapEntity = null; + RegisteredDevice crtRegisteredDevice = null; + String digitalIdJson; + DeviceResponse response = new DeviceResponse(); + DeviceData deviceData = null; + DigitalId digitalId = null; + DeviceProvider deviceProvider = null; + RegisterDeviceResponse registerDeviceResponse = new RegisterDeviceResponse(); + String deviceDataPayLoad = getPayLoad(registeredDevicePostDto.getDeviceData()); + String headerString, signedResponse, registerDevice = null; + try { + deviceData = mapper.readValue(CryptoUtil.decodeBase64(deviceDataPayLoad), DeviceData.class); + validate(deviceData); + digitalId = mapper.readValue(CryptoUtil.decodeBase64(deviceData.getDeviceInfo().getDigitalId()), + DigitalId.class); + deviceProvider = deviceProviderRepository.findByIdAndNameAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue( + digitalId.getDeviceProviderId(), digitalId.getDeviceProvider()); + if (deviceProvider == null) { + throw new RequestException(RegisteredDeviceErrorCode.DEVICE_PROVIDER_NOT_EXIST.getErrorCode(), + RegisteredDeviceErrorCode.DEVICE_PROVIDER_NOT_EXIST.getErrorMessage()); + } + + if (registrationDeviceTypeRepository + .findByCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(digitalId.getType()) == null) { + throw new RequestException(RegisteredDeviceErrorCode.DEVICE_TYPE_NOT_EXIST.getErrorCode(), + String.format(RegisteredDeviceErrorCode.DEVICE_TYPE_NOT_EXIST.getErrorMessage(), + digitalId.getType())); + } + + if (registrationDeviceSubTypeRepository + .findByCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(digitalId.getSubType()) == null) { + throw new RequestException(RegisteredDeviceErrorCode.DEVICE_SUB_TYPE_NOT_EXIST.getErrorCode(), + String.format(RegisteredDeviceErrorCode.DEVICE_SUB_TYPE_NOT_EXIST.getErrorMessage(), + digitalId.getSubType())); + } + + digitalIdJson = mapper.writeValueAsString(digitalId); + mapEntity = MapperUtils.mapRegisteredDeviceDto(registeredDevicePostDto, digitalIdJson, deviceData, + digitalId); + entity = MetaDataUtils.setCreateMetaData(mapEntity, RegisteredDevice.class); + entity.setCode(generateCodeValue(registeredDevicePostDto, deviceData, digitalId)); + entity.setIsActive(true); + crtRegisteredDevice = registeredDeviceRepository.create(entity); + + // add new row to the history table + RegisteredDeviceHistory entityHistory = new RegisteredDeviceHistory(); + MapperUtils.map(crtRegisteredDevice, entityHistory); + MapperUtils.setBaseFieldValue(crtRegisteredDevice, entityHistory); + entityHistory.setDigitalId(digitalIdJson); + entityHistory.setEffectivetimes(crtRegisteredDevice.getCreatedDateTime()); + entityHistory.setCreatedDateTime(crtRegisteredDevice.getCreatedDateTime()); + registeredDeviceHistoryRepo.create(entityHistory); + + digitalId = mapper.readValue(digitalIdJson, DigitalId.class); + + registerDeviceResponse = MapperUtils.mapRegisteredDeviceResponse(entity); + registerDeviceResponse + .setDigitalId(CryptoUtil.encodeBase64(mapper.writeValueAsString(digitalId).getBytes("UTF-8"))); + registerDeviceResponse.setEnv(activeProfile); + HeaderRequest header = new HeaderRequest(); + header.setAlg("RS256"); + header.setType("JWS"); + headerString = mapper.writeValueAsString(header); + signedResponse = getSignedResponse(registerDeviceResponse); + registerDevice = mapper.writeValueAsString(registerDeviceResponse); + response.setResponse(convertToJWS(headerString, registerDevice, signedResponse)); + + } catch (DataAccessLayerException | DataAccessException | IOException ex) { + throw new MasterDataServiceException( + RegisteredDeviceErrorCode.REGISTERED_DEVICE_INSERTION_EXCEPTION.getErrorCode(), + RegisteredDeviceErrorCode.REGISTERED_DEVICE_INSERTION_EXCEPTION.getErrorMessage() + " " + + ExceptionUtils.parseException(ex)); + } + + return response.getResponse(); + } + + private void validate(DeviceData deviceData) { + if (deviceData.getDeviceInfo() != null) { + LocalDateTime timeStamp = deviceData.getDeviceInfo().getTimeStamp(); + String prefix = registerDeviceTimeStamp.substring(0, 1); + String timeString = registerDeviceTimeStamp.replaceAll("\\" + prefix, ""); + if (prefix.equals("+")) { + if (timeStamp.isAfter(timeStamp.plusMinutes(TimeUnit.MINUTES.toMillis(Long.valueOf(timeString))))) { + throw new MasterDataServiceException("MSD-RDS-001", "Time Stamp is not proper"); + } + } else if (prefix.equals("-")) { + if (timeStamp.isBefore(timeStamp.plusMinutes(TimeUnit.MINUTES.toMillis(Long.valueOf(timeString))))) { + throw new MasterDataServiceException("MSD-RDS-001", "Time Stamp is not proper"); + } + } + + } + + } + + private String getPayLoad(String jws) { + String[] split = jws.split("\\."); + if (split.length >= 2) { + return split[1]; + } + return jws; + } + + private String convertToJWS(String headerString, String registerDevice, String signedResponse) { + + return CryptoUtil.encodeBase64String(headerString.getBytes()) + "." + + CryptoUtil.encodeBase64String(registerDevice.getBytes()) + "." + + CryptoUtil.encodeBase64String(signedResponse.getBytes()); + } + + private String getSignedResponse(RegisterDeviceResponse registerDeviceResponse) { + RequestWrapper request = new RequestWrapper<>(); + SignRequestDto signatureRequestDto = new SignRequestDto(); + SignResponseDto signResponse = new SignResponseDto(); + HttpEntity> httpEntity = new HttpEntity<>(request, new HttpHeaders()); + try { + signatureRequestDto + .setData(CryptoUtil.encodeBase64String(mapper.writeValueAsBytes(registerDeviceResponse))); + request.setRequest(signatureRequestDto); + ResponseEntity response = restTemplate.exchange(signUrl, HttpMethod.POST, httpEntity, String.class); + ResponseWrapper responseObject; + try { + responseObject = mapper.readValue(response.getBody(), ResponseWrapper.class); + signResponse = mapper.readValue(mapper.writeValueAsString(responseObject.getResponse()), + SignResponseDto.class); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (JsonProcessingException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + + return signResponse.getSignature(); + } + + private String generateCodeValue(RegisteredDevicePostDto registeredDevicePostDto, DeviceData deviceData, + DigitalId digitalId) { + String code = ""; + if (deviceData.getPurpose().equalsIgnoreCase(RegisteredDeviceConstant.REGISTRATION)) { + List device = deviceRepository + .findDeviceBySerialNumberAndIsDeletedFalseorIsDeletedIsNullNoIsActive(digitalId.getSerialNo()); + if (device.isEmpty()) { + throw new RequestException(RegisteredDeviceErrorCode.SERIALNUM_NOT_EXIST.getErrorCode(), String.format( + RegisteredDeviceErrorCode.SERIALNUM_NOT_EXIST.getErrorMessage(), digitalId.getSerialNo())); + } + // copy Device id as code + code = device.get(0).getId(); + } else if (deviceData.getPurpose().equalsIgnoreCase(RegisteredDeviceConstant.AUTH)) { + // should be uniquely randomly generated + code = UUID.randomUUID().toString(); + } + return code; + } + + @Override + public DeviceDeRegisterResponse deRegisterDevice(@Valid String deviceCode) { + RegisteredDevice deviceRegisterEntity = null; + RegisteredDeviceHistory deviceRegisterHistory = new RegisteredDeviceHistory(); + try { + deviceRegisterEntity = registeredDeviceRepository.findByCodeAndIsActiveIsTrue(deviceCode); + if (deviceRegisterEntity != null) { + if (Arrays.asList(REVOKED, RETIRED).contains(deviceRegisterEntity.getStatusCode())) { + throw new MasterDataServiceException( + DeviceRegisterErrorCode.DEVICE_DE_REGISTERED_ALREADY.getErrorCode(), + DeviceRegisterErrorCode.DEVICE_DE_REGISTERED_ALREADY.getErrorMessage()); + } + deviceRegisterEntity.setStatusCode("Retired"); + deviceRegisterEntity = MetaDataUtils.setUpdateMetaData(deviceRegisterEntity, deviceRegisterEntity, + false); + registeredDeviceRepository.update(deviceRegisterEntity); + MapperUtils.map(deviceRegisterEntity, deviceRegisterHistory); + deviceRegisterHistory.setEffectivetimes(deviceRegisterEntity.getUpdatedDateTime()); + registeredDeviceHistoryRepo.create(deviceRegisterHistory); + } else { + + throw new DataNotFoundException( + DeviceRegisterErrorCode.DEVICE_REGISTER_NOT_FOUND_EXCEPTION.getErrorCode(), + DeviceRegisterErrorCode.DEVICE_REGISTER_NOT_FOUND_EXCEPTION.getErrorMessage()); + } + + } catch (DataAccessLayerException | DataAccessException e) { + throw new MasterDataServiceException( + DeviceRegisterErrorCode.DEVICE_REGISTER_DELETED_EXCEPTION.getErrorCode(), + DeviceRegisterErrorCode.DEVICE_REGISTER_DELETED_EXCEPTION.getErrorMessage() + " " + + ExceptionUtils.parseException(e)); + } + DeviceDeRegisterResponse response = new DeviceDeRegisterResponse(); + response.setStatus("success"); + response.setMessage("Device deregistered successfully"); + return response; + } + + @Transactional + @Override + public ResponseDto updateStatus(String deviceCode, String statusCode) { + RegisteredDevice deviceRegister = null; + try { + deviceRegister = registeredDeviceRepository.findByCodeAndIsActiveIsTrue(deviceCode); + } catch (DataAccessException | DataAccessLayerException e) { + throw new MasterDataServiceException(DeviceRegisterErrorCode.DEVICE_REGISTER_FETCH_EXCEPTION.getErrorCode(), + DeviceRegisterErrorCode.DEVICE_REGISTER_FETCH_EXCEPTION.getErrorMessage() + " " + + ExceptionUtils.parseException(e)); + } + + if (deviceRegister == null) { + throw new DataNotFoundException(DeviceRegisterErrorCode.DATA_NOT_FOUND_EXCEPTION.getErrorCode(), + DeviceRegisterErrorCode.DATA_NOT_FOUND_EXCEPTION.getErrorMessage()); + } + if (deviceRegister.getStatusCode().equalsIgnoreCase(statusCode)) { + throw new MasterDataServiceException( + DeviceRegisterErrorCode.DEVICE_REGISTERED_STATUS_ALREADY.getErrorCode(), String.format( + DeviceRegisterErrorCode.DEVICE_REGISTERED_STATUS_ALREADY.getErrorMessage(), statusCode)); + + } + + if (!Arrays.asList(REGISTERED, REVOKED, RETIRED).contains(statusCode)) { + throw new RequestException(DeviceRegisterErrorCode.INVALID_STATUS_CODE.getErrorCode(), + DeviceRegisterErrorCode.INVALID_STATUS_CODE.getErrorMessage()); + } + deviceRegister.setStatusCode(statusCode); + updateRegisterDetails(deviceRegister); + createHistoryDetails(deviceRegister); + ResponseDto responseDto = new ResponseDto(); + responseDto.setMessage(MasterDataConstant.DEVICE_REGISTER_UPDATE_MESSAGE); + responseDto.setStatus(MasterDataConstant.SUCCESS); + return responseDto; + } + + /** + * Creates the history details. + * + * @param deviceRegister + * the device register + */ + private void createHistoryDetails(RegisteredDevice deviceRegister) { + RegisteredDeviceHistory deviceRegisterHistory = new RegisteredDeviceHistory(); + MapperUtils.map(deviceRegister, deviceRegisterHistory); + deviceRegisterHistory.setEffectivetimes(LocalDateTime.now(ZoneId.of("UTC"))); + try { + registeredDeviceHistoryRepo.create(deviceRegisterHistory); + } catch (DataAccessException | DataAccessLayerException e) { + throw new MasterDataServiceException( + DeviceRegisterErrorCode.DEVICE_REGISTER_UPDATE_EXCEPTION.getErrorCode(), + DeviceRegisterErrorCode.DEVICE_REGISTER_UPDATE_EXCEPTION.getErrorMessage() + " " + + ExceptionUtils.parseException(e)); + } + + } + + /** + * Update register details. + * + * @param deviceRegister + * the device register + */ + private void updateRegisterDetails(RegisteredDevice deviceRegister) { + try { + deviceRegister = MetaDataUtils.setUpdateMetaData(deviceRegister, deviceRegister, false); + registeredDeviceRepository.update(deviceRegister); + } catch (DataAccessException | DataAccessLayerException e) { + throw new MasterDataServiceException( + DeviceRegisterErrorCode.DEVICE_REGISTER_UPDATE_EXCEPTION.getErrorCode(), + DeviceRegisterErrorCode.DEVICE_REGISTER_UPDATE_EXCEPTION.getErrorMessage() + " " + + ExceptionUtils.parseException(e)); + } + + } +} diff --git a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/utils/MapperUtils.java b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/utils/MapperUtils.java index 4698e5cff2f..d095b7cf2fc 100644 --- a/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/utils/MapperUtils.java +++ b/kernel/kernel-masterdata-service/src/main/java/io/mosip/kernel/masterdata/utils/MapperUtils.java @@ -1,621 +1,665 @@ - -package io.mosip.kernel.masterdata.utils; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.sql.Timestamp; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; - -import org.springframework.stereotype.Component; - -import io.mosip.kernel.core.dataaccess.exception.DataAccessLayerException; -import io.mosip.kernel.core.util.EmptyCheckUtils; -import io.mosip.kernel.masterdata.dto.DeviceLangCodeDtypeDto; -import io.mosip.kernel.masterdata.dto.ExceptionalHolidayDto; -import io.mosip.kernel.masterdata.dto.HolidayDto; -import io.mosip.kernel.masterdata.dto.ReasonCategoryDto; -import io.mosip.kernel.masterdata.dto.ReasonListDto; -import io.mosip.kernel.masterdata.dto.RegisteredDevicePostReqDto; -import io.mosip.kernel.masterdata.dto.getresponse.LocationHierarchyDto; -import io.mosip.kernel.masterdata.dto.getresponse.extn.BaseDto; -import io.mosip.kernel.masterdata.entity.BaseEntity; -import io.mosip.kernel.masterdata.entity.ExceptionalHoliday; -import io.mosip.kernel.masterdata.entity.Holiday; -import io.mosip.kernel.masterdata.entity.ReasonCategory; -import io.mosip.kernel.masterdata.entity.RegisteredDevice; - -/** - * MapperUtils class provides methods to map or copy values from source object - * to destination object. - * - * @author Bal Vikash Sharma - * @author Urvil Joshi - * @since 1.0.0 - * @see MapperUtils - * - */ -@Component -@SuppressWarnings("unchecked") -public class MapperUtils { - - /*@Autowired - private ObjectMapper mapper;*/ - - private MapperUtils() { - super(); - } - - private static final String UTC_DATETIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; - private static final String SOURCE_NULL_MESSAGE = "source should not be null"; - private static final String DESTINATION_NULL_MESSAGE = "destination should not be null"; - - /** - * This flag is used to restrict copy null values. - */ - private static Boolean mapNullValues = Boolean.TRUE; - - /** - * Parse a date string of pattern UTC_DATETIME_PATTERN into - * {@link LocalDateTime} - * - * @param dateTime - * of type {@link String} of pattern UTC_DATETIME_PATTERN - * @return a {@link LocalDateTime} of given pattern - */ - public static LocalDateTime parseToLocalDateTime(String dateTime) { - return LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern(UTC_DATETIME_PATTERN)); - } - - /* - * #############Public method used for mapping################################ - */ - - /** - * This method map the values from source to - * destination if name and type of the fields inside the given - * parameters are same.If any of the parameters are null this - * method return null.This method internally check whether the - * source or destinationClass is DTO or an Entity type and map accordingly. If - * any {@link Collection} type or Entity type field is their then only matched - * name fields value will be set but not the embedded IDs and super class - * values. - * - * @param - * is a type parameter - * @param - * is a type parameter - * @param source - * which value is going to be mapped - * @param destination - * where values is going to be mapped - * @param mapNullValues - * by default marked as true so, it will map null values but if - * marked as false then null values will be ignored - * @return the destination object - * @throws NullPointerException - * if either source or destination is null - */ - public static D map(final S source, D destination, Boolean mapNullValues) { - MapperUtils.mapNullValues = mapNullValues; - return map(source, destination); - } - - /** - * This method map the values from source to - * destination if name and type of the fields inside the given - * parameters are same.If any of the parameters are null this - * method return null.This method internally check whether the - * source or destinationClass is DTO or an Entity type and map accordingly. If - * any {@link Collection} type or Entity type field is their then only matched - * name fields value will be set but not the embedded IDs and super class - * values. - * - * @param - * is a type parameter - * @param - * is a type parameter - * @param source - * which value is going to be mapped - * @param destination - * where values is going to be mapped - * @return the destination object - * @throws NullPointerException - * if either source or destination is null - */ - public static D map(final S source, D destination) { - Objects.requireNonNull(source, SOURCE_NULL_MESSAGE); - Objects.requireNonNull(destination, DESTINATION_NULL_MESSAGE); - try { - mapValues(source, destination); - } catch (IllegalAccessException | InstantiationException e) { - throw new DataAccessLayerException("KER-MSD-991", "Exception in mapping vlaues from source : " - + source.getClass().getName() + " to destination : " + destination.getClass().getName(), e); - } - return destination; - } - - /** - * This method takes source and destinationClass, take - * all values from source and create an object of destinationClass - * and map all the values from source to destination if field name and type is - * same.This method internally check whether the source or destinationClass is - * DTO or an Entity type and map accordingly.If any {@link Collection} type or - * Entity type field is their then only matched name fields value will be set - * but not the embedded IDs and super class values. - * - * @param - * is a type parameter - * @param - * is a type parameter - * @param source - * which value is going to be mapped - * @param destinationClass - * where values is going to be mapped - * @return the object of destinationClass - * @throws DataAccessLayerException - * if exception occur during creating of - * destinationClass object - * @throws NullPointerException - * if either source or destinationClass is - * null - */ - public static D map(final S source, Class destinationClass) { - Objects.requireNonNull(source, SOURCE_NULL_MESSAGE); - Objects.requireNonNull(destinationClass, "destination class should not be null"); - Object destination = null; - try { - destination = destinationClass.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new DataAccessLayerException("KER-MSD-991", "Exception in mapping vlaues from source : " - + source.getClass().getName() + " to destination : " + destinationClass.getClass().getName(), e); - } - return (D) map(source, destination); - } - - /** - * This method takes sourceList and destinationClass, - * take all values from source and create an object of - * destinationClass and map all the values from source to - * destination if field name and type is same. - * - * @param - * is a type parameter - * - * @param - * is a type parameter - * @param sourceList - * which value is going to be mapped - * @param destinationClass - * where values is going to be mapped - * @return list of destinationClass objects - * @throws DataAccessLayerException - * if exception occur during creating of - * destinationClass object - * @throws NullPointerException - * if either sourceList or - * destinationClass is null - */ - public static List mapAll(final Collection sourceList, Class destinationClass) { - Objects.requireNonNull(sourceList, "sourceList should not be null"); - Objects.requireNonNull(destinationClass, "destinationClass should not be null"); - return sourceList.stream().map(entity -> map(entity, destinationClass)).collect(Collectors.toList()); - } - - /** - * This method map values of source object to - * destination object. It will map field values having same name - * and same type for the fields. It will not map any field which is static or - * final.It will simply ignore those values. - * - * @param - * is a type parameter - * - * @param - * is a type parameter - * @param source - * is any object which should not be null and have data which is - * going to be copied - * @param destination - * is an object in which source field values is going to be matched - * - * @throws DataAccessLayerException - * if error raised during mapping values - * @throws NullPointerException - * if either source or destination is null - */ - public static void mapFieldValues(S source, D destination) { - - Objects.requireNonNull(source, SOURCE_NULL_MESSAGE); - Objects.requireNonNull(destination, DESTINATION_NULL_MESSAGE); - Field[] sourceFields = source.getClass().getDeclaredFields(); - Field[] destinationFields = destination.getClass().getDeclaredFields(); - - mapFieldValues(source, destination, sourceFields, destinationFields); - - } - - /** - * Map values from {@link BaseEntity} class source object to destination or vice - * versa and this method will be used to map {@link BaseEntity} values from - * entity to entity. Like when both source and - * destination are object which extends {@link BaseEntity}. - * - * @param - * is a type parameter - * @param - * is a type parameter - * @param source - * which value is going to be mapped - * @param destination - * where values is going to be mapped - */ - public static void setBaseFieldValue(S source, D destination) { - Objects.requireNonNull(source, SOURCE_NULL_MESSAGE); - Objects.requireNonNull(destination, DESTINATION_NULL_MESSAGE); - String sourceSupername = source.getClass().getSuperclass().getName();// super class of source object - String destinationSupername = destination.getClass().getSuperclass().getName();// super class of destination - // object - String baseEntityClassName = BaseEntity.class.getName();// base entity fully qualified name - String objectClassName = Object.class.getName();// object class fully qualified name - - String baseDtoClassName = BaseDto.class.getName();// base entity fully qualified name - - if (sourceSupername.equals(baseEntityClassName) && destinationSupername.equals(baseDtoClassName)) { - Field[] sourceFields = source.getClass().getSuperclass().getDeclaredFields(); - Field[] destinationFields = destination.getClass().getSuperclass().getDeclaredFields(); - mapFieldValues(source, destination, sourceFields, destinationFields); - sourceFields = source.getClass().getDeclaredFields(); - mapFieldValues(source, destination, sourceFields, destinationFields); - return; - } - if (sourceSupername.equals(baseDtoClassName) && destinationSupername.equals(baseEntityClassName)) { - Field[] sourceFields = source.getClass().getSuperclass().getDeclaredFields(); - Field[] destinationFields = destination.getClass().getSuperclass().getDeclaredFields(); - mapFieldValues(source, destination, sourceFields, destinationFields); - destinationFields = destination.getClass().getDeclaredFields(); - mapFieldValues(source, destination, sourceFields, destinationFields); - return; - } - - // if source is an entity - if (sourceSupername.equals(baseEntityClassName) && !destinationSupername.equals(baseEntityClassName)) { - Field[] sourceFields = source.getClass().getSuperclass().getDeclaredFields(); - Field[] destinationFields = destination.getClass().getDeclaredFields(); - mapFieldValues(source, destination, sourceFields, destinationFields); - } else if (destinationSupername.equals(baseEntityClassName) && !sourceSupername.equals(baseEntityClassName)) { - // if destination is an entity - Field[] sourceFields = source.getClass().getDeclaredFields(); - Field[] destinationFields = destination.getClass().getSuperclass().getDeclaredFields(); - mapFieldValues(source, destination, sourceFields, destinationFields); - } else { - if (!sourceSupername.equals(objectClassName) && !destinationSupername.equals(objectClassName)) { - Field[] sourceFields = source.getClass().getSuperclass().getDeclaredFields(); - Field[] destinationFields = destination.getClass().getSuperclass().getDeclaredFields(); - mapFieldValues(source, destination, sourceFields, destinationFields); - } - } - - } - - /* - * #############Private method used for mapping################################ - */ - - /** - * Map values from source object to destination object. - * - * @param - * is a type parameter - * @param - * is a type parameter - * @param source - * which value is going to be mapped - * @param destination - * where values is going to be mapped - * @throws InstantiationException - * if not able to create instance of field having annotation - * {@link EmbeddedId} - * @throws IllegalAccessException - * if provided fields are not accessible - */ - private static void mapValues(S source, D destination) - throws IllegalAccessException, InstantiationException { - - mapFieldValues(source, destination);// this method simply map values if field name and type are same - - if (source.getClass().isAnnotationPresent(Entity.class)) { - mapEntityToDto(source, destination); - } else { - mapDtoToEntity(source, destination); - } - } - - /** - * This method map source DTO to a class object which extends {@link BaseEntity} - * - * @param - * is a type parameter - * @param - * is a type parameter - * @param source - * which value is going to be mapped - * @param destination - * where values is going to be mapped - * @throws InstantiationException - * if not able to create instance of field having annotation - * {@link EmbeddedId} - * @throws IllegalAccessException - * if provided fields are not accessible - */ - private static void mapDtoToEntity(S source, D destination) - throws InstantiationException, IllegalAccessException { - Field[] fields = destination.getClass().getDeclaredFields(); - setBaseFieldValue(source, destination);// map super class values - for (Field field : fields) { - /** - * Map DTO matching field values to super class field values - */ - if (field.isAnnotationPresent(EmbeddedId.class)) { - Object id = field.getType().newInstance(); - mapFieldValues(source, id); - field.setAccessible(true); - field.set(destination, id); - field.setAccessible(false); - break; - } - } - } - - /** - * Map source which extends {@link BaseEntity} to a DTO object. - * - * @param - * is a type parameter - * @param - * is a type parameter - * @param source - * which value is going to be mapped - * @param destination - * where values is going to be mapped - * @throws IllegalAccessException - * if provided fields are not accessible - */ - private static void mapEntityToDto(S source, D destination) throws IllegalAccessException { - Field[] sourceFields = source.getClass().getDeclaredFields(); - /* - * Here source is a Entity so we need to take values from Entity object and set - * the matching fields in the destination object mostly an DTO. - */ - boolean isIdMapped = false;// a flag to check if there any composite key is present and is mapped - boolean isSuperMapped = false;// a flag to check is class extends the BaseEntity and is mapped - for (Field sfield : sourceFields) { - sfield.setAccessible(true);// mark accessible true because fields my be private, for safety - if (!isIdMapped && sfield.isAnnotationPresent(EmbeddedId.class)) { - /** - * Map the composite key values from source to destination if field name is same - */ - /** - * Take the field and get the composite key object and map all values to - * destination object - */ - mapFieldValues(sfield.get(source), destination); - sfield.setAccessible(false); - isIdMapped = true;// set flag so no need to check and map again - } else if (!isSuperMapped) { - setBaseFieldValue(source, destination);// this method check whether source is entity or destination - // and maps values accordingly - isSuperMapped = true; - } - } - } - - /** - * Map values from source field to destination. - * - * @param - * is a type parameter - * @param - * is a type parameter - * @param source - * which value is going to be mapped - * @param destination - * where values is going to be mapped - * @param sf - * source fields - * @param dtf - * destination fields - */ - private static void mapFieldValues(S source, D destination, Field[] sourceFields, - Field[] destinationFields) { - try { - for (Field sfield : sourceFields) { - // Do not set values either static or final - if (Modifier.isStatic(sfield.getModifiers()) || Modifier.isFinal(sfield.getModifiers())) { - continue; - } - - // make field accessible possibly private - sfield.setAccessible(true); - - for (Field dfield : destinationFields) { - - Class sourceType = sfield.getType(); - Class destinationType = dfield.getType(); - - // map only those field whose name and type is same - if (sfield.getName().equals(dfield.getName()) && sourceType.equals(destinationType)) { - - // for normal field values - dfield.setAccessible(true); - setFieldValue(source, destination, sfield, dfield); - break; - } - } - } - } catch (IllegalAccessException e) { - - throw new DataAccessLayerException("KER-MSD-993", "Exception raised while mapping values form " - + source.getClass().getName() + " to " + destination.getClass().getName(), e); - } - } - - /** - * Take value from source field and insert value into destination field. - * - * @param - * is a type parameter - * @param - * is a type parameter - * @param source - * which value is going to be mapped - * @param destination - * where values is going to be mapped - * @param sf - * source fields - * @param dtf - * destination fields - * @throws IllegalAccessException - * if provided fields are not accessible - */ - private static void setFieldValue(S source, D destination, Field sf, Field dtf) - throws IllegalAccessException { - // check whether user wants to map null values into destination object or not - if (!mapNullValues && EmptyCheckUtils.isNullEmpty(sf.get(source))) { - return; - } - dtf.set(destination, sf.get(source)); - dtf.setAccessible(false); - sf.setAccessible(false); - } - // ---------------------------------------------------------------------------------------------------------------------------- - - public static List mapHolidays(List holidays) { - Objects.requireNonNull(holidays); - List holidayDtos = new ArrayList<>(); - holidays.forEach(holiday -> { - LocalDate date = holiday.getHolidayDate(); - HolidayDto dto = new HolidayDto(); - dto.setId(holiday.getHolidayId()); - dto.setHolidayDate(date); - dto.setHolidayName(holiday.getHolidayName()); - dto.setLangCode(holiday.getLangCode()); - dto.setHolidayYear(String.valueOf(date.getYear())); - dto.setHolidayMonth(String.valueOf(date.getMonth().getValue())); - dto.setHolidayDay(String.valueOf(date.getDayOfWeek().getValue())); - dto.setIsActive(holiday.getIsActive()); - dto.setLocationCode(holiday.getLocationCode()); - dto.setHolidayDesc(holiday.getHolidayDesc()); - holidayDtos.add(dto); - }); - return holidayDtos; - } - - public static List mapExceptionalHolidays(List exeptionalHolidayList) { - Objects.requireNonNull(exeptionalHolidayList); - List holidayDtos = new ArrayList<>(); - exeptionalHolidayList.forEach(holiday -> { - LocalDate date = holiday.getHolidayDate(); - ExceptionalHolidayDto dto = new ExceptionalHolidayDto(); - dto.setHolidayDate(date); - dto.setHolidayName(holiday.getHolidayName()); - dto.setLangCode(holiday.getLangCode()); - dto.setHolidayYear(String.valueOf(date.getYear())); - dto.setHolidayMonth(String.valueOf(date.getMonth().getValue())); - dto.setHolidayDay(String.valueOf(date.getDayOfWeek().getValue())); - dto.setIsActive(holiday.getIsActive()); - dto.setHolidayReason(holiday.getHolidayReason()); - holidayDtos.add(dto); - }); - return holidayDtos; - } - - public static List reasonConverter(List reasonCategories) { - Objects.requireNonNull(reasonCategories, "list cannot be null"); - List reasonCategoryDtos = null; - reasonCategoryDtos = reasonCategories.parallelStream() - .map(reasonCategory -> new ReasonCategoryDto(reasonCategory.getCode(), reasonCategory.getName(), - reasonCategory.getDescription(), reasonCategory.getLangCode(), reasonCategory.getIsActive(), - mapAll(reasonCategory.getReasonList(), ReasonListDto.class))) - .collect(Collectors.toList()); - - return reasonCategoryDtos; - - } - - public static List objectToDtoConverter(List locationList) { - - List locationHierarchyDtos = new ArrayList<>(); - for (Object[] object : locationList) { - LocationHierarchyDto locationHierarchyDto = new LocationHierarchyDto(); - locationHierarchyDto.setLocationHierarchylevel((Short) object[0]); - locationHierarchyDto.setLocationHierarchyName((String) object[1]); - locationHierarchyDto.setIsActive((Boolean) object[2]); - locationHierarchyDtos.add(locationHierarchyDto); - } - return locationHierarchyDtos; - } - - public static List mapDeviceDto(List objects) { - List deviceLangCodeDtypeDtoList = new ArrayList<>(); - objects.forEach(arr -> { - DeviceLangCodeDtypeDto deviceLangCodeDtypeDto = new DeviceLangCodeDtypeDto(); - deviceLangCodeDtypeDto.setId((String) arr[0]); - deviceLangCodeDtypeDto.setName((String) arr[1]); - deviceLangCodeDtypeDto.setMacAddress((String) arr[2]); - deviceLangCodeDtypeDto.setSerialNum((String) arr[3]); - deviceLangCodeDtypeDto.setIpAddress((String) arr[4]); - deviceLangCodeDtypeDto.setDeviceSpecId((String) arr[5]); - deviceLangCodeDtypeDto.setLangCode((String) arr[6]); - deviceLangCodeDtypeDto.setIsActive((boolean) arr[7]); - if (arr[8] != null) { - deviceLangCodeDtypeDto.setValidityEndDateTime(((Timestamp) arr[8]).toLocalDateTime()); - } - deviceLangCodeDtypeDto.setDeviceTypeCode((String) arr[10]); - deviceLangCodeDtypeDtoList.add(deviceLangCodeDtypeDto); - - }); - return deviceLangCodeDtypeDtoList; - } - - public static RegisteredDevice mapRegisteredDeviceDto(RegisteredDevicePostReqDto dto, String digitalIdJson) { - - RegisteredDevice entity = new RegisteredDevice(); - entity.setDeviceTypeCode(dto.getDigitalIdDto().getDeviceTypeCode()); - entity.setDeviceSTypeCode(dto.getDigitalIdDto().getDeviceSTypeCode()); - entity.setStatusCode(dto.getStatusCode()); - entity.setDeviceId(dto.getDeviceId()); - entity.setDeviceSubId(dto.getDeviceSubId()); - - - entity.setDigitalId(digitalIdJson); - entity.setSerialNo(dto.getDigitalIdDto().getSerialNo()); - entity.setDpId(dto.getDigitalIdDto().getDpId()); - entity.setDp(dto.getDigitalIdDto().getDp()); - entity.setMake(dto.getDigitalIdDto().getMake()); - entity.setModel(dto.getDigitalIdDto().getModel()); - - - entity.setPurpose(dto.getPurpose()); - entity.setFirmware(dto.getFirmware()); - entity.setExpiryDate(dto.getExpiryDate()); - entity.setCertificationLevel(dto.getCertificationLevel()); - entity.setFoundationalTPId(dto.getFoundationalTPId()); - /* entity.setFoundationalTrustSignature(dto.getFoundationalTrustSignature()); - entity.setFoundationalTrustCertificate(dto.getFoundationalTrustCertificate()); - entity.setDeviceProviderSignature(dto.getDeviceProviderSignature());*/ - - return entity; - - } - -} + +package io.mosip.kernel.masterdata.utils; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.sql.Timestamp; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; + +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.dataaccess.exception.DataAccessLayerException; +import io.mosip.kernel.core.util.EmptyCheckUtils; +import io.mosip.kernel.masterdata.dto.DeviceLangCodeDtypeDto; +import io.mosip.kernel.masterdata.dto.ExceptionalHolidayDto; +import io.mosip.kernel.masterdata.dto.HolidayDto; +import io.mosip.kernel.masterdata.dto.ReasonCategoryDto; +import io.mosip.kernel.masterdata.dto.ReasonListDto; +import io.mosip.kernel.masterdata.dto.RegisteredDevicePostReqDto; +import io.mosip.kernel.masterdata.dto.getresponse.LocationHierarchyDto; +import io.mosip.kernel.masterdata.dto.getresponse.extn.BaseDto; +import io.mosip.kernel.masterdata.dto.registerdevice.DeviceData; +import io.mosip.kernel.masterdata.dto.registerdevice.DigitalId; +import io.mosip.kernel.masterdata.dto.registerdevice.RegisterDeviceResponse; +import io.mosip.kernel.masterdata.dto.registerdevice.RegisteredDevicePostDto; +import io.mosip.kernel.masterdata.entity.BaseEntity; +import io.mosip.kernel.masterdata.entity.ExceptionalHoliday; +import io.mosip.kernel.masterdata.entity.Holiday; +import io.mosip.kernel.masterdata.entity.ReasonCategory; +import io.mosip.kernel.masterdata.entity.RegisteredDevice; + +/** + * MapperUtils class provides methods to map or copy values from source object + * to destination object. + * + * @author Bal Vikash Sharma + * @author Urvil Joshi + * @since 1.0.0 + * @see MapperUtils + * + */ +@Component +@SuppressWarnings("unchecked") +public class MapperUtils { + + /*@Autowired + private ObjectMapper mapper;*/ + + private MapperUtils() { + super(); + } + + private static final String UTC_DATETIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + private static final String SOURCE_NULL_MESSAGE = "source should not be null"; + private static final String DESTINATION_NULL_MESSAGE = "destination should not be null"; + + /** + * This flag is used to restrict copy null values. + */ + private static Boolean mapNullValues = Boolean.TRUE; + + /** + * Parse a date string of pattern UTC_DATETIME_PATTERN into + * {@link LocalDateTime} + * + * @param dateTime + * of type {@link String} of pattern UTC_DATETIME_PATTERN + * @return a {@link LocalDateTime} of given pattern + */ + public static LocalDateTime parseToLocalDateTime(String dateTime) { + return LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern(UTC_DATETIME_PATTERN)); + } + + /* + * #############Public method used for mapping################################ + */ + + /** + * This method map the values from source to + * destination if name and type of the fields inside the given + * parameters are same.If any of the parameters are null this + * method return null.This method internally check whether the + * source or destinationClass is DTO or an Entity type and map accordingly. If + * any {@link Collection} type or Entity type field is their then only matched + * name fields value will be set but not the embedded IDs and super class + * values. + * + * @param + * is a type parameter + * @param + * is a type parameter + * @param source + * which value is going to be mapped + * @param destination + * where values is going to be mapped + * @param mapNullValues + * by default marked as true so, it will map null values but if + * marked as false then null values will be ignored + * @return the destination object + * @throws NullPointerException + * if either source or destination is null + */ + public static D map(final S source, D destination, Boolean mapNullValues) { + MapperUtils.mapNullValues = mapNullValues; + return map(source, destination); + } + + /** + * This method map the values from source to + * destination if name and type of the fields inside the given + * parameters are same.If any of the parameters are null this + * method return null.This method internally check whether the + * source or destinationClass is DTO or an Entity type and map accordingly. If + * any {@link Collection} type or Entity type field is their then only matched + * name fields value will be set but not the embedded IDs and super class + * values. + * + * @param + * is a type parameter + * @param + * is a type parameter + * @param source + * which value is going to be mapped + * @param destination + * where values is going to be mapped + * @return the destination object + * @throws NullPointerException + * if either source or destination is null + */ + public static D map(final S source, D destination) { + Objects.requireNonNull(source, SOURCE_NULL_MESSAGE); + Objects.requireNonNull(destination, DESTINATION_NULL_MESSAGE); + try { + mapValues(source, destination); + } catch (IllegalAccessException | InstantiationException e) { + throw new DataAccessLayerException("KER-MSD-991", "Exception in mapping vlaues from source : " + + source.getClass().getName() + " to destination : " + destination.getClass().getName(), e); + } + return destination; + } + + /** + * This method takes source and destinationClass, take + * all values from source and create an object of destinationClass + * and map all the values from source to destination if field name and type is + * same.This method internally check whether the source or destinationClass is + * DTO or an Entity type and map accordingly.If any {@link Collection} type or + * Entity type field is their then only matched name fields value will be set + * but not the embedded IDs and super class values. + * + * @param + * is a type parameter + * @param + * is a type parameter + * @param source + * which value is going to be mapped + * @param destinationClass + * where values is going to be mapped + * @return the object of destinationClass + * @throws DataAccessLayerException + * if exception occur during creating of + * destinationClass object + * @throws NullPointerException + * if either source or destinationClass is + * null + */ + public static D map(final S source, Class destinationClass) { + Objects.requireNonNull(source, SOURCE_NULL_MESSAGE); + Objects.requireNonNull(destinationClass, "destination class should not be null"); + Object destination = null; + try { + destination = destinationClass.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new DataAccessLayerException("KER-MSD-991", "Exception in mapping vlaues from source : " + + source.getClass().getName() + " to destination : " + destinationClass.getClass().getName(), e); + } + return (D) map(source, destination); + } + + /** + * This method takes sourceList and destinationClass, + * take all values from source and create an object of + * destinationClass and map all the values from source to + * destination if field name and type is same. + * + * @param + * is a type parameter + * + * @param + * is a type parameter + * @param sourceList + * which value is going to be mapped + * @param destinationClass + * where values is going to be mapped + * @return list of destinationClass objects + * @throws DataAccessLayerException + * if exception occur during creating of + * destinationClass object + * @throws NullPointerException + * if either sourceList or + * destinationClass is null + */ + public static List mapAll(final Collection sourceList, Class destinationClass) { + Objects.requireNonNull(sourceList, "sourceList should not be null"); + Objects.requireNonNull(destinationClass, "destinationClass should not be null"); + return sourceList.stream().map(entity -> map(entity, destinationClass)).collect(Collectors.toList()); + } + + /** + * This method map values of source object to + * destination object. It will map field values having same name + * and same type for the fields. It will not map any field which is static or + * final.It will simply ignore those values. + * + * @param + * is a type parameter + * + * @param + * is a type parameter + * @param source + * is any object which should not be null and have data which is + * going to be copied + * @param destination + * is an object in which source field values is going to be matched + * + * @throws DataAccessLayerException + * if error raised during mapping values + * @throws NullPointerException + * if either source or destination is null + */ + public static void mapFieldValues(S source, D destination) { + + Objects.requireNonNull(source, SOURCE_NULL_MESSAGE); + Objects.requireNonNull(destination, DESTINATION_NULL_MESSAGE); + Field[] sourceFields = source.getClass().getDeclaredFields(); + Field[] destinationFields = destination.getClass().getDeclaredFields(); + + mapFieldValues(source, destination, sourceFields, destinationFields); + + } + + /** + * Map values from {@link BaseEntity} class source object to destination or vice + * versa and this method will be used to map {@link BaseEntity} values from + * entity to entity. Like when both source and + * destination are object which extends {@link BaseEntity}. + * + * @param + * is a type parameter + * @param + * is a type parameter + * @param source + * which value is going to be mapped + * @param destination + * where values is going to be mapped + */ + public static void setBaseFieldValue(S source, D destination) { + Objects.requireNonNull(source, SOURCE_NULL_MESSAGE); + Objects.requireNonNull(destination, DESTINATION_NULL_MESSAGE); + String sourceSupername = source.getClass().getSuperclass().getName();// super class of source object + String destinationSupername = destination.getClass().getSuperclass().getName();// super class of destination + // object + String baseEntityClassName = BaseEntity.class.getName();// base entity fully qualified name + String objectClassName = Object.class.getName();// object class fully qualified name + + String baseDtoClassName = BaseDto.class.getName();// base entity fully qualified name + + if (sourceSupername.equals(baseEntityClassName) && destinationSupername.equals(baseDtoClassName)) { + Field[] sourceFields = source.getClass().getSuperclass().getDeclaredFields(); + Field[] destinationFields = destination.getClass().getSuperclass().getDeclaredFields(); + mapFieldValues(source, destination, sourceFields, destinationFields); + sourceFields = source.getClass().getDeclaredFields(); + mapFieldValues(source, destination, sourceFields, destinationFields); + return; + } + if (sourceSupername.equals(baseDtoClassName) && destinationSupername.equals(baseEntityClassName)) { + Field[] sourceFields = source.getClass().getSuperclass().getDeclaredFields(); + Field[] destinationFields = destination.getClass().getSuperclass().getDeclaredFields(); + mapFieldValues(source, destination, sourceFields, destinationFields); + destinationFields = destination.getClass().getDeclaredFields(); + mapFieldValues(source, destination, sourceFields, destinationFields); + return; + } + + // if source is an entity + if (sourceSupername.equals(baseEntityClassName) && !destinationSupername.equals(baseEntityClassName)) { + Field[] sourceFields = source.getClass().getSuperclass().getDeclaredFields(); + Field[] destinationFields = destination.getClass().getDeclaredFields(); + mapFieldValues(source, destination, sourceFields, destinationFields); + } else if (destinationSupername.equals(baseEntityClassName) && !sourceSupername.equals(baseEntityClassName)) { + // if destination is an entity + Field[] sourceFields = source.getClass().getDeclaredFields(); + Field[] destinationFields = destination.getClass().getSuperclass().getDeclaredFields(); + mapFieldValues(source, destination, sourceFields, destinationFields); + } else { + if (!sourceSupername.equals(objectClassName) && !destinationSupername.equals(objectClassName)) { + Field[] sourceFields = source.getClass().getSuperclass().getDeclaredFields(); + Field[] destinationFields = destination.getClass().getSuperclass().getDeclaredFields(); + mapFieldValues(source, destination, sourceFields, destinationFields); + } + } + + } + + /* + * #############Private method used for mapping################################ + */ + + /** + * Map values from source object to destination object. + * + * @param + * is a type parameter + * @param + * is a type parameter + * @param source + * which value is going to be mapped + * @param destination + * where values is going to be mapped + * @throws InstantiationException + * if not able to create instance of field having annotation + * {@link EmbeddedId} + * @throws IllegalAccessException + * if provided fields are not accessible + */ + private static void mapValues(S source, D destination) + throws IllegalAccessException, InstantiationException { + + mapFieldValues(source, destination);// this method simply map values if field name and type are same + + if (source.getClass().isAnnotationPresent(Entity.class)) { + mapEntityToDto(source, destination); + } else { + mapDtoToEntity(source, destination); + } + } + + /** + * This method map source DTO to a class object which extends {@link BaseEntity} + * + * @param + * is a type parameter + * @param + * is a type parameter + * @param source + * which value is going to be mapped + * @param destination + * where values is going to be mapped + * @throws InstantiationException + * if not able to create instance of field having annotation + * {@link EmbeddedId} + * @throws IllegalAccessException + * if provided fields are not accessible + */ + private static void mapDtoToEntity(S source, D destination) + throws InstantiationException, IllegalAccessException { + Field[] fields = destination.getClass().getDeclaredFields(); + setBaseFieldValue(source, destination);// map super class values + for (Field field : fields) { + /** + * Map DTO matching field values to super class field values + */ + if (field.isAnnotationPresent(EmbeddedId.class)) { + Object id = field.getType().newInstance(); + mapFieldValues(source, id); + field.setAccessible(true); + field.set(destination, id); + field.setAccessible(false); + break; + } + } + } + + /** + * Map source which extends {@link BaseEntity} to a DTO object. + * + * @param + * is a type parameter + * @param + * is a type parameter + * @param source + * which value is going to be mapped + * @param destination + * where values is going to be mapped + * @throws IllegalAccessException + * if provided fields are not accessible + */ + private static void mapEntityToDto(S source, D destination) throws IllegalAccessException { + Field[] sourceFields = source.getClass().getDeclaredFields(); + /* + * Here source is a Entity so we need to take values from Entity object and set + * the matching fields in the destination object mostly an DTO. + */ + boolean isIdMapped = false;// a flag to check if there any composite key is present and is mapped + boolean isSuperMapped = false;// a flag to check is class extends the BaseEntity and is mapped + for (Field sfield : sourceFields) { + sfield.setAccessible(true);// mark accessible true because fields my be private, for safety + if (!isIdMapped && sfield.isAnnotationPresent(EmbeddedId.class)) { + /** + * Map the composite key values from source to destination if field name is same + */ + /** + * Take the field and get the composite key object and map all values to + * destination object + */ + mapFieldValues(sfield.get(source), destination); + sfield.setAccessible(false); + isIdMapped = true;// set flag so no need to check and map again + } else if (!isSuperMapped) { + setBaseFieldValue(source, destination);// this method check whether source is entity or destination + // and maps values accordingly + isSuperMapped = true; + } + } + } + + /** + * Map values from source field to destination. + * + * @param + * is a type parameter + * @param + * is a type parameter + * @param source + * which value is going to be mapped + * @param destination + * where values is going to be mapped + * @param sf + * source fields + * @param dtf + * destination fields + */ + private static void mapFieldValues(S source, D destination, Field[] sourceFields, + Field[] destinationFields) { + try { + for (Field sfield : sourceFields) { + // Do not set values either static or final + if (Modifier.isStatic(sfield.getModifiers()) || Modifier.isFinal(sfield.getModifiers())) { + continue; + } + + // make field accessible possibly private + sfield.setAccessible(true); + + for (Field dfield : destinationFields) { + + Class sourceType = sfield.getType(); + Class destinationType = dfield.getType(); + + // map only those field whose name and type is same + if (sfield.getName().equals(dfield.getName()) && sourceType.equals(destinationType)) { + + // for normal field values + dfield.setAccessible(true); + setFieldValue(source, destination, sfield, dfield); + break; + } + } + } + } catch (IllegalAccessException e) { + + throw new DataAccessLayerException("KER-MSD-993", "Exception raised while mapping values form " + + source.getClass().getName() + " to " + destination.getClass().getName(), e); + } + } + + /** + * Take value from source field and insert value into destination field. + * + * @param + * is a type parameter + * @param + * is a type parameter + * @param source + * which value is going to be mapped + * @param destination + * where values is going to be mapped + * @param sf + * source fields + * @param dtf + * destination fields + * @throws IllegalAccessException + * if provided fields are not accessible + */ + private static void setFieldValue(S source, D destination, Field sf, Field dtf) + throws IllegalAccessException { + // check whether user wants to map null values into destination object or not + if (!mapNullValues && EmptyCheckUtils.isNullEmpty(sf.get(source))) { + return; + } + dtf.set(destination, sf.get(source)); + dtf.setAccessible(false); + sf.setAccessible(false); + } + // ---------------------------------------------------------------------------------------------------------------------------- + + public static List mapHolidays(List holidays) { + Objects.requireNonNull(holidays); + List holidayDtos = new ArrayList<>(); + holidays.forEach(holiday -> { + LocalDate date = holiday.getHolidayDate(); + HolidayDto dto = new HolidayDto(); + dto.setId(holiday.getHolidayId()); + dto.setHolidayDate(date); + dto.setHolidayName(holiday.getHolidayName()); + dto.setLangCode(holiday.getLangCode()); + dto.setHolidayYear(String.valueOf(date.getYear())); + dto.setHolidayMonth(String.valueOf(date.getMonth().getValue())); + dto.setHolidayDay(String.valueOf(date.getDayOfWeek().getValue())); + dto.setIsActive(holiday.getIsActive()); + dto.setLocationCode(holiday.getLocationCode()); + dto.setHolidayDesc(holiday.getHolidayDesc()); + holidayDtos.add(dto); + }); + return holidayDtos; + } + + public static List mapExceptionalHolidays(List exeptionalHolidayList) { + Objects.requireNonNull(exeptionalHolidayList); + List holidayDtos = new ArrayList<>(); + exeptionalHolidayList.forEach(holiday -> { + LocalDate date = holiday.getHolidayDate(); + ExceptionalHolidayDto dto = new ExceptionalHolidayDto(); + dto.setHolidayDate(date); + dto.setHolidayName(holiday.getHolidayName()); + dto.setLangCode(holiday.getLangCode()); + dto.setHolidayYear(String.valueOf(date.getYear())); + dto.setHolidayMonth(String.valueOf(date.getMonth().getValue())); + dto.setHolidayDay(String.valueOf(date.getDayOfWeek().getValue())); + dto.setIsActive(holiday.getIsActive()); + dto.setHolidayReason(holiday.getHolidayReason()); + holidayDtos.add(dto); + }); + return holidayDtos; + } + + public static List reasonConverter(List reasonCategories) { + Objects.requireNonNull(reasonCategories, "list cannot be null"); + List reasonCategoryDtos = null; + reasonCategoryDtos = reasonCategories.parallelStream() + .map(reasonCategory -> new ReasonCategoryDto(reasonCategory.getCode(), reasonCategory.getName(), + reasonCategory.getDescription(), reasonCategory.getLangCode(), reasonCategory.getIsActive(), + mapAll(reasonCategory.getReasonList(), ReasonListDto.class))) + .collect(Collectors.toList()); + + return reasonCategoryDtos; + + } + + public static List objectToDtoConverter(List locationList) { + + List locationHierarchyDtos = new ArrayList<>(); + for (Object[] object : locationList) { + LocationHierarchyDto locationHierarchyDto = new LocationHierarchyDto(); + locationHierarchyDto.setLocationHierarchylevel((Short) object[0]); + locationHierarchyDto.setLocationHierarchyName((String) object[1]); + locationHierarchyDto.setIsActive((Boolean) object[2]); + locationHierarchyDtos.add(locationHierarchyDto); + } + return locationHierarchyDtos; + } + + public static List mapDeviceDto(List objects) { + List deviceLangCodeDtypeDtoList = new ArrayList<>(); + objects.forEach(arr -> { + DeviceLangCodeDtypeDto deviceLangCodeDtypeDto = new DeviceLangCodeDtypeDto(); + deviceLangCodeDtypeDto.setId((String) arr[0]); + deviceLangCodeDtypeDto.setName((String) arr[1]); + deviceLangCodeDtypeDto.setMacAddress((String) arr[2]); + deviceLangCodeDtypeDto.setSerialNum((String) arr[3]); + deviceLangCodeDtypeDto.setIpAddress((String) arr[4]); + deviceLangCodeDtypeDto.setDeviceSpecId((String) arr[5]); + deviceLangCodeDtypeDto.setLangCode((String) arr[6]); + deviceLangCodeDtypeDto.setIsActive((boolean) arr[7]); + if (arr[8] != null) { + deviceLangCodeDtypeDto.setValidityEndDateTime(((Timestamp) arr[8]).toLocalDateTime()); + } + deviceLangCodeDtypeDto.setDeviceTypeCode((String) arr[10]); + deviceLangCodeDtypeDtoList.add(deviceLangCodeDtypeDto); + + }); + return deviceLangCodeDtypeDtoList; + } + + public static RegisteredDevice mapRegisteredDeviceDto(RegisteredDevicePostReqDto dto, String digitalIdJson) { + + RegisteredDevice entity = new RegisteredDevice(); + entity.setDeviceTypeCode(dto.getDigitalIdDto().getDeviceTypeCode()); + entity.setDeviceSTypeCode(dto.getDigitalIdDto().getDeviceSTypeCode()); + entity.setStatusCode(dto.getStatusCode()); + entity.setDeviceId(dto.getDeviceId()); + entity.setDeviceSubId(dto.getDeviceSubId()); + + + entity.setDigitalId(digitalIdJson); + entity.setSerialNo(dto.getDigitalIdDto().getSerialNo()); + entity.setDpId(dto.getDigitalIdDto().getDpId()); + entity.setDp(dto.getDigitalIdDto().getDp()); + entity.setMake(dto.getDigitalIdDto().getMake()); + entity.setModel(dto.getDigitalIdDto().getModel()); + + + entity.setPurpose(dto.getPurpose()); + entity.setFirmware(dto.getFirmware()); + entity.setExpiryDate(dto.getExpiryDate()); + entity.setCertificationLevel(dto.getCertificationLevel()); + entity.setFoundationalTPId(dto.getFoundationalTPId()); + /* entity.setFoundationalTrustSignature(dto.getFoundationalTrustSignature()); + entity.setFoundationalTrustCertificate(dto.getFoundationalTrustCertificate()); + entity.setDeviceProviderSignature(dto.getDeviceProviderSignature());*/ + + return entity; + + } + + public static RegisteredDevice mapRegisteredDeviceDto(RegisteredDevicePostDto registeredDevicePostDto, + String digitalIdJson, DeviceData deviceData, DigitalId digitalId) { + + + RegisteredDevice entity = new RegisteredDevice(); + entity.setDeviceTypeCode(digitalId.getType()); + entity.setDeviceSTypeCode(digitalId.getSubType()); + entity.setStatusCode("REGISTERED"); + entity.setDeviceId(deviceData.getDeviceId()); + entity.setDeviceSubId(deviceData.getDeviceInfo().getDeviceSubId()); + + + entity.setDigitalId(digitalIdJson); + entity.setSerialNo(digitalId.getSerialNo()); + entity.setDpId(digitalId.getDeviceProviderId()); + entity.setDp(digitalId.getDeviceProvider()); + entity.setMake(digitalId.getMake()); + entity.setModel(digitalId.getModel()); + + + entity.setPurpose(deviceData.getPurpose()); + entity.setFirmware(deviceData.getDeviceInfo().getFirmware()); + entity.setExpiryDate(deviceData.getDeviceInfo().getDeviceExpiry()); + entity.setCertificationLevel(deviceData.getDeviceInfo().getCertification()); + entity.setFoundationalTPId(deviceData.getFoundationalTrustProviderId()); + /* entity.setFoundationalTrustSignature(dto.getFoundationalTrustSignature()); + entity.setFoundationalTrustCertificate(dto.getFoundationalTrustCertificate()); + entity.setDeviceProviderSignature(dto.getDeviceProviderSignature());*/ + + return entity; + } + + public static RegisterDeviceResponse mapRegisteredDeviceResponse(RegisteredDevice entity) { + RegisterDeviceResponse registerDeviceResponse = new RegisterDeviceResponse(); + registerDeviceResponse.setDeviceCode(entity.getCode()); + registerDeviceResponse.setStatus(entity.getStatusCode()); + registerDeviceResponse.setTimeStamp(LocalDateTime.now()); + return registerDeviceResponse; + } + +} diff --git a/kernel/kernel-masterdata-service/src/main/resources/application-local.properties b/kernel/kernel-masterdata-service/src/main/resources/application-local.properties index 3fe2e13dda2..2390b828acb 100644 --- a/kernel/kernel-masterdata-service/src/main/resources/application-local.properties +++ b/kernel/kernel-masterdata-service/src/main/resources/application-local.properties @@ -44,3 +44,7 @@ master.search.maximum.rows=50 mosip.kernel.masterdata.audit-url=https://dev.mosip.io/v1/auditmanager/audits mosip.level=2 + +mosip.kernel.sign-url=https://dev.mosip.io/v1/signature/sign + +masterdata.registerdevice.timestamp.validate=+5 diff --git a/kernel/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/integration/MasterdataIntegrationTest.java b/kernel/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/integration/MasterdataIntegrationTest.java index bfebefa8af6..442598745f6 100644 --- a/kernel/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/integration/MasterdataIntegrationTest.java +++ b/kernel/kernel-masterdata-service/src/test/java/io/mosip/kernel/masterdata/test/integration/MasterdataIntegrationTest.java @@ -6,17 +6,14 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.mock; - +import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - import java.sql.Timestamp; import java.time.LocalDate; @@ -50,7 +47,11 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.security.test.context.support.WithUserDetails; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; @@ -68,7 +69,10 @@ import io.mosip.kernel.core.dataaccess.exception.DataAccessLayerException; import io.mosip.kernel.core.http.RequestWrapper; +import io.mosip.kernel.core.http.ResponseWrapper; import io.mosip.kernel.core.idgenerator.spi.MachineIdGenerator; +import io.mosip.kernel.core.util.CryptoUtil; +import io.mosip.kernel.core.util.DateUtils; import io.mosip.kernel.masterdata.constant.MachinePutReqDto; import io.mosip.kernel.masterdata.dto.BiometricAttributeDto; import io.mosip.kernel.masterdata.dto.BlacklistedWordsDto; @@ -78,7 +82,6 @@ import io.mosip.kernel.masterdata.dto.DeviceSpecificationDto; import io.mosip.kernel.masterdata.dto.DeviceTypeDto; import io.mosip.kernel.masterdata.dto.DigitalIdDeviceRegisterDto; -import io.mosip.kernel.masterdata.dto.DigitalIdDto; import io.mosip.kernel.masterdata.dto.DocumentCategoryDto; import io.mosip.kernel.masterdata.dto.DocumentTypeDto; import io.mosip.kernel.masterdata.dto.FoundationalTrustProviderDto; @@ -112,6 +115,11 @@ import io.mosip.kernel.masterdata.dto.ValidDocumentDto; import io.mosip.kernel.masterdata.dto.getresponse.IndividualTypeResponseDto; import io.mosip.kernel.masterdata.dto.getresponse.RegistrationCenterUserMachineMappingHistoryResponseDto; +import io.mosip.kernel.masterdata.dto.registerdevice.DeviceData; +import io.mosip.kernel.masterdata.dto.registerdevice.DeviceInfo; +import io.mosip.kernel.masterdata.dto.registerdevice.DigitalId; +import io.mosip.kernel.masterdata.dto.registerdevice.RegisteredDevicePostDto; +import io.mosip.kernel.masterdata.dto.registerdevice.SignResponseDto; import io.mosip.kernel.masterdata.entity.BiometricAttribute; import io.mosip.kernel.masterdata.entity.BlacklistedWords; import io.mosip.kernel.masterdata.entity.Device; @@ -4710,87 +4718,6 @@ public void getValidDocumentFetchExceptionTest() throws Exception { mockMvc.perform(get("/validdocuments/eng")).andExpect(status().isInternalServerError()); } - /* - * @Autowired RegistrationCenterValidator registrationCenterValidator; - * - * @Test - * - * @WithUserDetails("zonal-admin") public void - * createRegistrationCenterExceptionTest() throws Exception { - * RequestWrapper requestDto = new RequestWrapper<>(); - * requestDto.setId("mosip.idtype.create"); requestDto.setVersion("1.0"); - * RegistrationCenterDto registrationCenterDto = getRegCenterDto(); - * - * requestDto.setRequest(registrationCenterDto); String contentJson = - * mapper.writeValueAsString(requestDto); - * when(registrationCenterValidator.validatePrimarySencodaryLangMandatoryFields( - * Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), - * Mockito.any())); when(registrationCenterRepository.create(Mockito.any())) - * .thenThrow(new DataAccessLayerException("", "cannot execute statement", - * null)); mockMvc.perform(post("/registrationcenters").contentType(MediaType. - * APPLICATION_JSON).content(contentJson)) - * .andExpect(status().isInternalServerError()); } - */ - - /* - * @Test - * - * @WithUserDetails("global-admin") public void - * createRegistrationCenterLangExceptionTest() throws Exception { - * RequestWrapper requestDto = new RequestWrapper<>(); - * requestDto.setId("mosip.idtype.create"); requestDto.setVersion("1.0"); - * RegistrationCenterDto registrationCenterDto = getRegCenterDto(); - * registrationCenterDto.setLangCode(null); - * - * requestDto.setRequest(registrationCenterDto); String contentJson = - * mapper.writeValueAsString(requestDto); - * mockMvc.perform(post("/registrationcenters").contentType(MediaType. - * APPLICATION_JSON).content(contentJson)) .andExpect(status().isOk()); - * - * registrationCenterDto.setLangCode("fsadgdsagdsaf"); contentJson = - * mapper.writeValueAsString(requestDto); - * mockMvc.perform(post("/registrationcenters").contentType(MediaType. - * APPLICATION_JSON).content(contentJson)) .andExpect(status().isOk()); - * - * Mockito.when(restTemplate.getForObject(Mockito.anyString(), - * Mockito.any())).thenReturn(null); registrationCenterDto.setLangCode("eng"); - * contentJson = mapper.writeValueAsString(requestDto); - * mockMvc.perform(post("/registrationcenters").contentType(MediaType. - * APPLICATION_JSON).content(contentJson)) - * .andExpect(status().is5xxServerError()); - * - * } - */ - - /* - * @Test - * - * @WithUserDetails("global-admin") public void registrationCenterInvalidTest() throws - * Exception { RequestWrapper requestDto = new - * RequestWrapper<>(); requestDto.setId("mosip.idtype.create"); - * requestDto.setVersion("1.0"); RegistrationCenterDto invalidRegCntrDto = - * getRegCenterDto(); invalidRegCntrDto.setId("ID3456789102787");// more than 10 - * to check for invalid requestDto.setRequest(invalidRegCntrDto); String - * contentJson = mapper.writeValueAsString(requestDto); - * mockMvc.perform(post("/registrationcenters").contentType(MediaType. - * APPLICATION_JSON).content(contentJson)) .andExpect(status().isOk()); } - */ - - private RegistrationCenterDto getRegCenterDto() { - - RegistrationCenterDto dto = new RegistrationCenterDto(); - dto.setIsActive(true); - dto.setId("ID"); - dto.setName("testname"); - dto.setAddressLine1("test"); - dto.setAddressLine2("test"); - dto.setAddressLine3("test"); - dto.setLangCode("eng"); - dto.setLocationCode("LOC01"); - dto.setLatitude("12.9135636"); - dto.setLongitude("77.5950804"); - return dto; - } /*------------------------- deviceSecification update and delete ----------------------------*/ @Test @@ -8262,18 +8189,48 @@ public void setUpRegisteredDevice() { device.setSerialNum("123456789"); dList.add(device); } + + RequestWrapper requestDto = null; + RegisteredDevicePostDto registeredDevicePostDto = null; + + private RegisteredDevicePostDto getDeviceDataForRegisterDevice() throws Exception + { + registeredDevicePostDto = new RegisteredDevicePostDto(); + DigitalId dig = new DigitalId(); + dig.setDateTime(DateUtils.getUTCCurrentDateTimeString()); + dig.setDeviceProvider("SYNCBYTE"); + dig.setDeviceProviderId("SYNCBYTE.MC01A"); + dig.setMake("MC01A"); + dig.setModel("SMIDCL"); + dig.setSerialNo("1801160991"); + dig.setSubType("Single"); + dig.setType("Fingerprint"); + DeviceData device = new DeviceData(); + device.setDeviceId("70959dd5-e45f-438a-9ff8-9b263908e572"); + device.setFoundationalTrustProviderId(""); + device.setPurpose("AUTH"); + DeviceInfo deviceInfo = new DeviceInfo(); + deviceInfo.setCertification("L0"); + deviceInfo.setDeviceSubId("1"); + deviceInfo.setDeviceExpiry(LocalDateTime.now()); + deviceInfo.setFirmware("firmware"); + deviceInfo.setDigitalId(CryptoUtil.encodeBase64String(objectMapper.writeValueAsBytes(dig))); + deviceInfo.setTimeStamp(LocalDateTime.now()); + device.setDeviceInfo(deviceInfo); + registeredDevicePostDto.setDeviceData(CryptoUtil.encodeBase64String(objectMapper.writeValueAsBytes(device))); + return registeredDevicePostDto; + } + @SuppressWarnings("unchecked") @Test - @Ignore @WithUserDetails("zonal-admin") public void createRegisteredDevice() throws Exception { - RequestWrapper requestDto = null; requestDto = new RequestWrapper<>(); requestDto.setId("mosip.match.regcentr.machineid"); requestDto.setVersion("1.0.0"); - requestDto.setRequest(registeredDeviceDto); - - String regcenterJson = mapper.writeValueAsString(requestDto); + requestDto.setRequesttime(LocalDateTime.now()); + requestDto.setRequest(getDeviceDataForRegisterDevice()); + String regcenterJson = objectMapper.writeValueAsString(requestDto); when(deviceProviderRepository.findByIdAndNameAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.any(), Mockito.any())).thenReturn(devProvider); when(registrationDeviceTypeRepository @@ -8286,6 +8243,19 @@ public void createRegisteredDevice() throws Exception { Mockito.anyString())).thenReturn(dList); when(registeredDeviceRepository.create(Mockito.any())).thenReturn(registeredDevice); when(registeredDeviceHistoryRepo.create(Mockito.any())).thenReturn(registeredDeviceHistory); + SignResponseDto signResponseDto = new SignResponseDto(); + signResponseDto.setTimestamp(LocalDateTime.now()); + signResponseDto.setSignature(".TGlqZ0lPaUU0MTVHTHEwekxlSkZMb2I4MktTeHdnazc0YkgzZUdwTE9tdm4xVFNYUS8rZHFuemZoM2x2cjZhOVRHb1ZzYjFIeEJqRFdpOStWNlV5THBJVm82VlVwVnppaCtVRno4c0xDSjJsUWJWajhKdm5ybDdPWlpTQWZwVHZnYkxsZ3pNV3FDR0JrVzdITnFTRHVVZFRPblE3azc5RHlQam5sSjlHQkdFaWpMRERUSVNDKzUyT2JpdjdZemUxWVBjbkl4MGNtYVI4bWF2bmYvN09qdmk5VFZQQlppYkx3eVlFZDgvQnJ4OVpReWlXUmJ5bVNIUGo2L1dqVFBsSnJQZGdXTEVONVhrdWFLQldWN1BrR1R2d3Fydit4RjRtc3FvdElGTGs0cnZ3R0JYTTJ3K2pCeUhNT3c1SmpTMXUxNFh1ejhTK3N0eTMrNGNXcVZ0bVZRPT0="); + + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(signResponseDto); + responseWrapper.setResponsetime(LocalDateTime.now()); + String response = objectMapper.writeValueAsString(responseWrapper); + when(restTemplate.exchange( + Mockito.anyString(), + Mockito.any(HttpMethod.class), + Mockito.any(HttpEntity.class),Mockito.any(Class.class)) + ).thenReturn(new ResponseEntity(response, HttpStatus.OK)); mockMvc.perform(post("/registereddevices").contentType(MediaType.APPLICATION_JSON).content(regcenterJson)) .andExpect(status().isOk()); } @@ -8293,13 +8263,12 @@ public void createRegisteredDevice() throws Exception { @Test @WithUserDetails("zonal-admin") public void createRegisteredDeviceDevProviderNull() throws Exception { - RequestWrapper requestDto = null; requestDto = new RequestWrapper<>(); requestDto.setId("mosip.match.regcentr.machineid"); requestDto.setVersion("1.0.0"); - requestDto.setRequest(registeredDeviceDto); - - String regcenterJson = mapper.writeValueAsString(requestDto); + requestDto.setRequesttime(LocalDateTime.now()); + requestDto.setRequest(getDeviceDataForRegisterDevice()); + String regcenterJson = objectMapper.writeValueAsString(requestDto); when(deviceProviderRepository.findByIdAndNameAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.any(), Mockito.any())).thenReturn(null); mockMvc.perform(post("/registereddevices").contentType(MediaType.APPLICATION_JSON).content(regcenterJson)) @@ -8309,13 +8278,12 @@ public void createRegisteredDeviceDevProviderNull() throws Exception { @Test @WithUserDetails("zonal-admin") public void createRegisteredDeviceRegDeviceTypeNull() throws Exception { - RequestWrapper requestDto = null; requestDto = new RequestWrapper<>(); requestDto.setId("mosip.match.regcentr.machineid"); requestDto.setVersion("1.0.0"); - requestDto.setRequest(registeredDeviceDto); - - String regcenterJson = mapper.writeValueAsString(requestDto); + requestDto.setRequesttime(LocalDateTime.now()); + requestDto.setRequest(getDeviceDataForRegisterDevice()); + String regcenterJson = objectMapper.writeValueAsString(requestDto); when(deviceProviderRepository.findByIdAndNameAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.any(), Mockito.any())).thenReturn(devProvider); when(registrationDeviceTypeRepository @@ -8328,13 +8296,12 @@ public void createRegisteredDeviceRegDeviceTypeNull() throws Exception { @Test @WithUserDetails("zonal-admin") public void createRegisteredDeviceRegDeviceSubTypeNull() throws Exception { - RequestWrapper requestDto = null; requestDto = new RequestWrapper<>(); requestDto.setId("mosip.match.regcentr.machineid"); requestDto.setVersion("1.0.0"); - requestDto.setRequest(registeredDeviceDto); - - String regcenterJson = mapper.writeValueAsString(requestDto); + requestDto.setRequesttime(LocalDateTime.now()); + requestDto.setRequest(getDeviceDataForRegisterDevice()); + String regcenterJson = objectMapper.writeValueAsString(requestDto); when(deviceProviderRepository.findByIdAndNameAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.any(), Mockito.any())).thenReturn(devProvider); when(registrationDeviceTypeRepository @@ -8350,14 +8317,12 @@ public void createRegisteredDeviceRegDeviceSubTypeNull() throws Exception { @Test @WithUserDetails("zonal-admin") public void createRegisteredDeviceSerialNumberNotFound() throws Exception { - RequestWrapper requestDto = null; requestDto = new RequestWrapper<>(); requestDto.setId("mosip.match.regcentr.machineid"); requestDto.setVersion("1.0.0"); - requestDto.setRequest(registeredDeviceDto); - List list = new ArrayList<>(); - - String regcenterJson = mapper.writeValueAsString(requestDto); + requestDto.setRequesttime(LocalDateTime.now()); + requestDto.setRequest(getDeviceDataForRegisterDevice()); + String regcenterJson = objectMapper.writeValueAsString(requestDto); when(deviceProviderRepository.findByIdAndNameAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.any(), Mockito.any())).thenReturn(devProvider); when(registrationDeviceTypeRepository @@ -8369,32 +8334,32 @@ public void createRegisteredDeviceSerialNumberNotFound() throws Exception { when(deviceRepository.findDeviceBySerialNumberAndIsDeletedFalseorIsDeletedIsNullNoIsActive( Mockito.anyString())).thenReturn(list); mockMvc.perform(post("/registereddevices").contentType(MediaType.APPLICATION_JSON).content(regcenterJson)) - .andExpect(status().isOk()); + .andExpect(status().is5xxServerError()); } + @Test @WithUserDetails("zonal-admin") public void createRegisteredDeviceDataAccessExcp() throws Exception { - RequestWrapper requestDto = null; - requestDto = new RequestWrapper<>(); - requestDto.setId("mosip.match.regcentr.machineid"); - requestDto.setVersion("1.0.0"); - requestDto.setRequest(registeredDeviceDto); - - String regcenterJson = mapper.writeValueAsString(requestDto); - when(deviceProviderRepository.findByIdAndNameAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.any(), - Mockito.any())).thenReturn(devProvider); - when(registrationDeviceTypeRepository - .findByCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.any())) - .thenReturn(registrationDeviceType); - when(registrationDeviceSubTypeRepository - .findByCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.any())) - .thenReturn(registrationDeviceSubType); - when(deviceRepository.findDeviceBySerialNumberAndIsDeletedFalseorIsDeletedIsNullNoIsActive( - Mockito.anyString())).thenReturn(dList); - when(registeredDeviceRepository.create(Mockito.any())).thenThrow(new DataAccessLayerException("", "cannot insert", null)); - mockMvc.perform(post("/registereddevices").contentType(MediaType.APPLICATION_JSON).content(regcenterJson)) - .andExpect(status().isInternalServerError()); + requestDto = new RequestWrapper<>(); + requestDto.setId("mosip.match.regcentr.machineid"); + requestDto.setVersion("1.0.0"); + requestDto.setRequesttime(LocalDateTime.now()); + requestDto.setRequest(getDeviceDataForRegisterDevice()); + String regcenterJson = objectMapper.writeValueAsString(requestDto); + when(deviceProviderRepository.findByIdAndNameAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.any(), + Mockito.any())).thenReturn(devProvider); + when(registrationDeviceTypeRepository + .findByCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.any())) + .thenReturn(registrationDeviceType); + when(registrationDeviceSubTypeRepository + .findByCodeAndIsDeletedFalseorIsDeletedIsNullAndIsActiveTrue(Mockito.any())) + .thenReturn(registrationDeviceSubType); + when(deviceRepository.findDeviceBySerialNumberAndIsDeletedFalseorIsDeletedIsNullNoIsActive( + Mockito.anyString())).thenReturn(dList); + when(registeredDeviceRepository.create(Mockito.any())).thenThrow(new MasterDataServiceException("ADM-DPM-035","Error occurred while storing Registered Device Details")); + mockMvc.perform(post("/registereddevices").contentType(MediaType.APPLICATION_JSON).content(regcenterJson)) + .andExpect(status().is5xxServerError()); } //-------------------------update Device------------------------- diff --git a/kernel/kernel-masterdata-service/src/test/resources/application.properties b/kernel/kernel-masterdata-service/src/test/resources/application.properties index 506eb800f7b..1a5ed6d00ac 100644 --- a/kernel/kernel-masterdata-service/src/test/resources/application.properties +++ b/kernel/kernel-masterdata-service/src/test/resources/application.properties @@ -27,4 +27,7 @@ mosip.secondary-language=ara mosip.kernel.registrationcenterid.length=5 mosip.kernel.machineid.length=5 +mosip.kernel.sign-url=https://dev.mosip.io/v1/signature/sign +masterdata.registerdevice.timestamp.validate=+5 +